diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..813510d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +*.conf +pnpm-lock.yaml diff --git a/.github/workflows/docker-dry-run.yaml b/.github/workflows/docker-dry-run.yaml new file mode 100644 index 0000000..ca0fbdf --- /dev/null +++ b/.github/workflows/docker-dry-run.yaml @@ -0,0 +1,79 @@ +name: Build And Publish (Dry run) + +on: + workflow_dispatch: + +jobs: + front: + name: Build front-end docker image + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + gaonengwww/dl-flow-frontend + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable=${{ github.event_name != 'pull_request' }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + working-directory: ./ + context: ./ + build-context: ./ + file: ./dockerfile + push: false + back: + name: Build back-end docker image + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./dl-flow-backend + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + gaonengwww/dl-flow-backend + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable=${{ github.event_name != 'pull_request' }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + working-directory: dl-flow-backend/ + context: dl-flow-backend/ + build-context: dl-flow-backend/ + file: dl-flow-backend/dockerfile + push: false \ No newline at end of file diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..4bdb0ce --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,92 @@ +name: Build And Publish + +on: + push: + tags: + - "*.*.*" + +jobs: + front: + name: Build Front docker image + runs-on: ubuntu-latest + defaults: + run: + working-directory: . + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + gaonengwww/dl-flow-frontend + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable=${{ github.event_name != 'pull_request' }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + working-directory: ./ + context: ./ + build-context: ./ + file: ./dockerfile + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + back: + name: Build docker image + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./dl-flow-backend + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + gaonengwww/dl-flow-backend + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable=${{ github.event_name != 'pull_request' }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + working-directory: dl-flow-backend/ + context: dl-flow-backend/ + build-context: dl-flow-backend/ + file: dl-flow-backend/dockerfile + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6947085 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +**/node_modules \ No newline at end of file diff --git a/README.md b/README.md index 19869b4..7b8eab3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,271 @@ -# lowcode-design-core - +# dl-flow + +dl-Flow 是一种拖拽式的线性网络搭建的 Web 应用程序。你可以使用该程序直观的搭建一个paddlepaddle的神经网络. + +## Quick Start + +### Docker 搭建 + +我们非常推荐您使用Docker进行部署. 这不仅可以让你快速的进行上手, 也可以让您再后续对接其他程序更加的方便快捷(例如 K8s). + +```yaml +# docker-compose.yaml +services: + mongodb: + image: mongo + ports: + - 27018:27017 + redis: + image: redis + ports: + - 6379:6379 + front: + image: gaonengwww/dl-flow-frontend + ports: + - 80:80 + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + server: + image: gaonengwww/dl-flow-backend + ports: + - 9000:9000 + environment: + - DB_URL=mongodb://mongodb:27017/dl-flow # 数据库地址 + - REDIS_HOST=redis # redis地址 (必填) + - REDIS_PORT=6379 # redis端口 (必填) + - REDIS_DB=0 # redis数据库 (必填) + - REDIS_PASSWORD="" # redis密码 + - JWT_EXPIRE_IN=1d # JWT 过期时间 (必填) + - JWT_SIGN_ALGORITHM=RS256 # JWT签名算法, 要与密钥对符合, 例如密钥对是RSA 2048bit, 那么此处应该是 RS256 (必填) + - JWT_PUB_KEY=./keys/pub.key # JWT 公钥 (必填) + - JWT_PRI_KEY=./keys/pri.key # JWT 私钥 (必填) + - PWD_SALT=salt # bcrypt 盐(必填) + - PWD_SALT_LEN=12 # bcrypt 盐(必填) + volumes: # 强烈将下述卷挂载到本地, 以避免数据丢失 + - ./public:/public # 代码生成暂存位置 + - ./keys:/keys # 密钥对存放位置 + - ./data:/data # bundle.json与install.lock 存放位置 + - ./examples:/examples # 示例文件夹 +``` + +`Web-Ui` 使用nginx驱动, 接下来我们需要编写 `nginx.conf` + +```conf +worker_processes auto; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + gzip on; + server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + location ~ /endpoint/ { + rewrite ^/endpoint/(.*)$ /$1 break; # 主要负责反代的rewrite, 否则发的是 http://server:9000/endpoint/ + proxy_pass http://server:9000; + } + location ~ /socket.io { + proxy_pass http://server:9001; + + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + } +} +``` + +```bash +docker compose up -d +``` + +接下来,您便可以访问 `http://localhost` 开始搭建 + + +## 源码构建 + +```bash +git clone https://atomgit.com/opentiny/000003.git +# git clone git@atomgit.com:opentiny/000003.git +ls -al +# .github +# dl-flow-backend // 后端 +# dl-flow-frontend // WebUi +# dl-flow-example // 示例 +# nginx.conf // 预设好的nginx文件 +``` + +### 后端构建 + +后端采用的是`Nest.js` + +```bash +cd dl-flow-backend +pnpm install +pnpm build +node dist/main.js +``` + +### 前端构建 + +前端魔改自`TinyEngine`, 部署方式与`TinyEngine`大同小异. + +```bash +cd dl-flow-frontend +pnpm install +pnpm build:plugin +pnpm build:prod +cd packages/design-core/dist +``` + +### 环境变量与含义 + +- DB_URL: 数据库链接地址 (必填) +- REDIS_HOST: redis地址 (必填) +- REDIS_PORT: redis端口 (必填) +- REDIS_DB: redis数据库 (必填) +- REDIS_PASSWORD: redis密码 (必填) +- JWT_EXPIRE_IN: JWT过期时间, 规则可参考[vercel/ms](https://github.com/vercel/ms) (必填) +- JWT_SIGN_ALGORITHM: JWT签名算法, 要与密钥对符合, 例如密钥对是RSA 2048bit, 那么此处应该是 RS256 (必填) +- JWT_PUB_KEY: JWT 公钥 (必填) +- JWT_PRI_KEY: JWT 私钥 (必填) +- ~~PWD_SALT: bcrypt 盐 (必填)~~ +- PWD_SALT_LEN: bcrypt 盐长度 + +### Bug 反馈 + +如有bug与其他方面的疑问, 欢迎提交[issue](https://atomgit.com/opentiny/000003/issues) + +## WebUi布局 + +![](public/Snipaste_2024-03-24_21-37-53.png) + +绿色区域: 网络与layer选择区域 +红色区域: 布局区域, 在绿色区域 单击需要的网络后会显示在红色布局区内 +蓝色区域: 网络区域, 可以配置网络的一些属性(Covn2D 举例) + +- 输入特征大小 +- 输出特征大小 +- 卷积核大小等 + +注意, 您应当自行校验网络的配置项, 例如: 理论上卷积核大小为1是可以存在的,它也的确有一些作用,比如 + +- 升维/降维 +- 增加非线性 + +但是**可以**这么做并不意味着它**适合**你的需求更不等同于**不存在运行时候错误**(比如维度错误) + +## 结构 + +### 流程图 + +### Web UI + +下图展示了项目与TinyEngine的差异文件 + +``` +├── packages +    ├── canvas +    │   ├── src +    │   │   ├── components +    │   │   │   ├── container +    │   │   │   │   ├── AlgoNode.vue // 创建的自定义节点 +    │   │   │   │   ├── GroupNode.vue // 组节点 +    │   │   │   │   └── X6Canvas.vue // x6容器 +    ├── controller +    │   ├── src +    │   │   ├── useLayer.js // 自定义Layer的逻辑 +    │   │   ├── useResource.js // 数据请求逻辑 +    │   │   ├── useSchema.js // schema逻辑 +    │   │   ├── useVisitor.js // Python AST解析 +    │   │   ├── useWS.js // socket.io的二次封装 +    │   │   └── useX6.js // x6的一些逻辑封装 +    ├── design-core +    │   ├── authentication.html +    │   ├── src +    │   │   ├── App.vue +    │   │   └── authentication // 登陆页面 +    │   │      └── src +    │   │      ├── App.vue +    │   │      ├── components +    │   │      │   ├── login.vue +    │   │      │   └── register.vue +    │   │      └── main.js +    ├── plugins +    │   ├── materials // 物料 (paddlepaddle的网络物料) +    │   │   └── src +    │   │      ├── Main.vue +    │   │      ├── layer +    │   │      │   └── main.vue +    │   │      └── networks +    │   │      └── main.vue +    │   └── schema // 传输给后端的schema的预览窗 +    │   └── src +    │       └── Main.vue +    └── settings // 物料的Props设计页面 +       ├── code +       │   └── src +       │      └── Main.vue +       └── props +       ├── index.js +       ├── package.json +       └── src +          ├── Main.vue +          └── components +          ├── Empty.vue +          ├── ParamAttr.vue +          ├── enums.vue +          ├── list.vue + └── property-setting.vue +``` + +### 后端 + +[参考](./dl-flow-backend/README.md) + + +### 为什么结束节点和开始节点必须只有一个 + +因为目前生成的是`Sequential`而不是`Layer`. + +`Layer`的确更加的灵活。但是问题也非常的显而易见。 + +我们设计的是又向无环图, 又向表明 A->B 是正确的,但是 B->A 是不一定的。假设有一幅图 + +``` + Start + | + v + Node-1 + | + -----+----- + | | | + V V V +END1 END2 END3 +``` + +那么不管如何遍历最终节点,其实都是正确的。但在神经网络中,不同网络的运算顺序会有不同的结果。比如`先池化后卷积`和`先卷积后池化`的运算结果是不同的。进入训练阶段,训练结果也可能不同。这主要是因为函数的组合在某些条件下是不可交换的,我们也使用数学语言证明了这一点。详细可以参考[函数组合的交换性讨论](./dl-flow-backend/proof/函数组合的可交换性讨论.pdf) + + +## 前端流程图 + +![](./public/sequenceDiagram.png) + +## 源码阅读顺序 + +``` +dl-flow-back >> README.md >> code-generate/README.md >> code-generate.gateway.ts >> code-generate.service.ts >> ast.service.ts + +dl-flow-frontend >> X6Canvas >> useX6 >> useSchma >> export +``` \ No newline at end of file diff --git a/dl-flow-backend/.dockerignore b/dl-flow-backend/.dockerignore new file mode 100644 index 0000000..d0f4e39 --- /dev/null +++ b/dl-flow-backend/.dockerignore @@ -0,0 +1,4 @@ +.env +node_modules +*.md +proof \ No newline at end of file diff --git a/dl-flow-backend/.editorconfig b/dl-flow-backend/.editorconfig new file mode 100644 index 0000000..b1a4b7c --- /dev/null +++ b/dl-flow-backend/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/dl-flow-backend/.env b/dl-flow-backend/.env new file mode 100644 index 0000000..5e234a2 --- /dev/null +++ b/dl-flow-backend/.env @@ -0,0 +1,7 @@ +DB_URL=mongodb://localhost:27017:/dl-flow +JWT_EXPIRE_IN="1d" +JWT_SIGN_ALGORITHM="RS256" +JWT_PUB_KEY="./keys/pub.key" +JWT_PRI_KEY="./keys/pri.key" +PWD_SALT=”salt“ +PWD_SALT_LEN=2 \ No newline at end of file diff --git a/dl-flow-backend/.eslintrc.js b/dl-flow-backend/.eslintrc.js new file mode 100644 index 0000000..259de13 --- /dev/null +++ b/dl-flow-backend/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/dl-flow-backend/.gitignore b/dl-flow-backend/.gitignore new file mode 100644 index 0000000..e1e6869 --- /dev/null +++ b/dl-flow-backend/.gitignore @@ -0,0 +1,42 @@ +# compiled output +/dist +/node_modules + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# do not upload public fold +public +# do not upload keys +keys +# do not upload data +data \ No newline at end of file diff --git a/dl-flow-backend/.prettierrc b/dl-flow-backend/.prettierrc new file mode 100644 index 0000000..dcb7279 --- /dev/null +++ b/dl-flow-backend/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/dl-flow-backend/README.md b/dl-flow-backend/README.md new file mode 100644 index 0000000..b6b9437 --- /dev/null +++ b/dl-flow-backend/README.md @@ -0,0 +1,88 @@ +# dl-flow backend + +## 目录结构 + +``` +├── README.md +├── docker-compose.yaml // 快速启动 compose示例 +├── dockerfile // docker构建文件 +├── global.d.ts +├── libs +│   ├── database // 数据库模块 +│   ├── redis // 缓存模块 +│   └── shared // 共用文件 +├── src +│   ├── app.module.ts // 主文件 +│   ├── auth-guard // token校验门禁 (可以理解为中间件, 不过nest的分类更加细致) +│   ├── code-generate +│   │   ├── ast +│   │   ├── ast.service.ts // ast生成服务 +│   │   ├── code-generate.controller.ts // code-generate路由 +│   │   ├── code-generate.gateway.ts // code-generate的websocket路由, 不过在nest中叫做gateway +│   │   ├── code-generate.module.ts // code-generate的module +│   │   ├── code-generate.schema.ts // code-generate的schema +│   │   └── code-generate.service.ts // code-generate的服务 +│   ├── layer // layer获取与存储的http接口 (没什么技术含量全是CRUD) +│   ├── main.ts +│   ├── material // 物料的获取 (没什么技术含量全是CRUD) +│   ├── user // 用户的登陆注册 +│   └── ws-exception // websocket的错误捕获, 主要用于捕获Exception和Runtime Error +├── tsconfig.build.json +├── tsconfig.json +└── webpack.config.js // 打包的配置文件, 主要是定义全局变量 +``` + +### global.d.ts + +```typescript +declare global { + namespace NodeJS { + // 为了让process.env.xxx的时候有类型提示 + interface ProcessEnv { + DB_URL: string; + REDIS_HOST: string; + REDIS_PORT: number; + REDIS_DB: number; + REDIS_PASSWORD: string; + JWT_EXPIRE_IN: string; + JWT_SIGN_ALGORITHM: JwtSignOptions['algorithm']; + JWT_PUB_KEY: string; + JWT_PRI_KEY: string; + /** + * @deprecated + */ + PWD_SALT: string; // used for bcrypt + PWD_SALT_LEN: string; + } + } + // 开发环境标志 + declare const __DEV__: boolean; + // 测试环境标志 + declare const __TEST__: boolean; +} +export {}; +``` + + +## QA + +### 为什么使用的是全局变量而不是环境变量? + +`__DEV__`与`__TEST__`主要是用于测试环境与开发环境。如果一段代码只是测试环境需要(例如准备内存数据库),那么我们可以这么写 + +```typescript +if (__TEST__){ + // do sth +} +``` + +之后我们只需要在jest的配置文件里的`global`配置项中中,将`__TEST__`定义为`true`就可以了。(详细参考packages.json L94) +而在打包时侯,`webpack`会将`__DEV__`与`__TEST__`占位符替换为false, 这样一来所有的测试代码与开发调试代码都将会被标记为`dead code`. 最后会被`webpack`自动剔除 (详细参考 webpack.config.js L12-) + +### 为什么使用内存数据库而不是MOCK? + +mock一组数据是人来mock, 工作量是其次,最主要的问题是难以`靠近实战`. 之所以选择使用内存数据库而不是手动mock, 我给出如下原因 + +1. 不需要手动mock数据,避免因为人脑无法达到**完全理性**而造成的**数据结构**问题 +2. 内存数据库的可维护性很高 +3. 数据的销毁简单,不需要本地启动复杂的环境 \ No newline at end of file diff --git a/dl-flow-backend/data/bundle.json b/dl-flow-backend/data/bundle.json new file mode 100644 index 0000000..9c088e8 --- /dev/null +++ b/dl-flow-backend/data/bundle.json @@ -0,0 +1,5459 @@ +{ + "$schema": "bundle.schema.json", + "data": { + "types": { + "ParamAttr": [ + { + "id": "name", + "label": { + "zh_CN": "前缀", + "en_US": "Name" + }, + "type": "string", + "optional": true, + "default": "" + }, + { + "id": "learning_rate", + "label": { + "zh_CN": "学习率", + "en_US": "learning_rate" + }, + "type": "number", + "optional": true, + "default": 1.0 + }, + { + "id": "trainable", + "label": { + "zh_CN": "是否参与训练", + "en_US": "trainable" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "do_model_average", + "label": { + "zh_CN": "模型平均", + "en_US": "do_model_average" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "need_clip", + "label": { + "zh_CN": "梯度裁剪", + "en_US": "need_clip" + }, + "type": "boolean", + "optional": true, + "default": true + } + ] + }, + "materials": [ + { + "id": "AdaptiveAvgPool1D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool1D", + "zh_CN": "1D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool2D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool2D", + "zh_CN": "2D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool3D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool3D", + "zh_CN": "3D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool1D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "1D 自适应最大值池化", + "en_US": "AdaptiveMaxPool1D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool2D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "2D 自适应最大值池化", + "en_US": "AdaptiveMaxPool2D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool3D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "3D 自适应最大值池化", + "en_US": "AdaptiveMaxPool3D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AlphaDropout", + "mode": "nn", + "label": { + "zh_CN": "自归一化dropout", + "en_US": "Alpha dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "丢弃概率", + "en_US": "Dropping probability" + } + } + ] + }, + { + "id": "AvgPool1D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool1D", + "en_US": "AvgPool1D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool2D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool2D", + "en_US": "AvgPool2D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool3D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool3D", + "en_US": "AvgPool3D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "MaxPool1D", + "mode": "nn", + "label": { + "en_US": "MaxPool1D", + "zh_CN": "1D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool2D", + "mode": "nn", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool3D", + "mode": "nn", + "label": { + "en_US": "MaxPool3D", + "zh_CN": "3D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "BCELoss", + "mode": "nn", + "label": { + "zh_CN": "BCELoss", + "en_US": "BCELoss" + }, + "properties": [] + }, + { + "id": "BCEWithLogitsLoss", + "mode": "nn", + "label": { + "zh_CN": "BCEWithLogitsLoss", + "en_US": "BCEWithLogitsLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "BatchNorm1D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm1D", + "en_US": "BatchNorm1D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm2D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm2D", + "en_US": "BatchNorm2D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm3D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm3D", + "en_US": "BatchNorm3D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm", + "en_US": "BatchNorm" + }, + "properties": [ + { + "id": "num_channels", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "num_channels" + } + }, + { + "id": "is_test", + "type": "boolean", + "label": { + "zh_CN": "是否在测试阶段", + "en_US": "Is test" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "param_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "param attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_layout", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + }, + { + "id": "in_place", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "batch_norm是否可以服用输入内存", + "en_US": "Can batch norm take input memory" + } + }, + { + "id": "do_model_average_for_mean_and_var", + "type": "boolean", + "default": "false", + "label": { + "zh_CN": "是否为 mean 和 variance 做模型均值", + "en_US": "Are we doing model mean for mean and variance" + } + }, + { + "id": "use_global_stats", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用全局均值和方差", + "en_US": "Is global mean and variance used" + } + }, + { + "id": "trainable_statistics", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "eval 模式下是否计算 mean 均值和 var 方差", + "en_US": "Is the mean and variance of var calculated in eval mode" + } + }, + { + "id": "moving_mean_name", + "type": "string", + "label": { + "zh_CN": "moving_mean 的名称", + "en_US": "name of moving_mean" + } + }, + { + "id": "moving_variance_name", + "type": "string", + "label": { + "zh_CN": "moving_var 的名称", + "en_US": "name of moving_var" + } + } + ] + }, + { + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "mode": "nn", + "properties": [] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "id": "Conv1D", + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "nnName": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "3D 卷积神经网络", + "en_US": "Conv 3D" + }, + "id": "Conv3D", + "nnName": "Conv3D", + "desc": "三维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "nnName": "Linear", + "desc": "线性变换", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "nnName": "Flatten", + "mode": "nn", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1 + } + ] + }, + { + "label": { + "zh_CN": "一维转置卷积层", + "en_US": "Conv1DTranspose" + }, + "id": "Conv1DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "二维转置卷积层", + "en_US": "Conv2DTranspose" + }, + "id": "Conv2DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "三维转置卷积层", + "en_US": "Conv3DTranspose" + }, + "id": "Conv3DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Bilinear", + "mode": "nn", + "label": { + "zh_CN": "双线性Tensor积", + "en_US": "Bilinear" + }, + "properties": [ + { + "id": "in1_features", + "type": "number", + "label": { + "zh_CN": "x1 元素的维度", + "en_US": "" + } + }, + { + "id": "in2_features", + "type": "number", + "label": { + "zh_CN": "x2 元素的维度", + "en_US": "" + } + }, + { + "id": "out_features", + "type": "number", + "label": { + "zh_CN": "输出 Tensor 的维度", + "en_US": "Size of output tensor" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "CELU", + "mode": "nn", + "label": { + "zh_CN": "CELU 激活函数", + "en_US": "CELU" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "CTCLoss", + "mode": "nn", + "label": { + "en_US": "CTC Loss", + "zh_CN": "CTC 损失函数" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "en_US": "Blank", + "zh_CN": "v" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "CosineEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "CosineEmbedding 损失", + "en_US": "CosineEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "ChannelShuffle", + "label": { + "zh_CN": "通道分组", + "en_US": "group by channel" + }, + "mode": "nn", + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "zh_CN": "分组数", + "en_US": "total group" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByGlobalNorm", + "label": { + "zh_CN": "ClipGradByGlobalNorm", + "en_US": "ClipGradByGlobalNorm" + }, + "properties": [ + { + "id": "clip_norm", + "type": "number", + "label": { + "zh_CN": "范数最大值", + "en_US": "clip norm" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByNorm", + "label": { + "zh_CN": "ClipGradByNorm", + "en_US": "ClipGradByNorm" + }, + "properties": [ + { + "id": "clip_norm", + "label": { + "zh_CN": "二范数最大值", + "en_US": "clip_norm" + }, + "type": "number" + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByValue", + "label": { + "en_US": "ClipGradByValue", + "zh_CN": "ClipGradByValue" + }, + "properties": [ + { + "id": "max", + "type": "number", + "label": { + "en_US": "max", + "zh_CN": "修剪的最大值" + } + }, + { + "id": "min", + "type": "number", + "label": { + "en_US": "min", + "zh_CN": "修建的最小值" + } + } + ] + }, + { + "mode": "nn", + "id": "CosineSimilarity", + "label": { + "en_US": "CosineSimilarity", + "zh_CN": "余弦相似度" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": 1 + }, + { + "id": "eps", + "type": "number", + "label": { + "zh_CN": "加在分母上的很小的数值, 防止分母为0的情况", + "en_US": "eps" + }, + "default": 1e-8 + } + ] + }, + { + "mode": "nn", + "id": "CrossEntropyLoss", + "label": { + "en_US": "CrossEntropyLoss", + "zh_CN": "交叉熵损失" + }, + "properties": [ + { + "id": "ignore_index", + "type": "number", + "label": { + "en_US": "ignore index", + "zh_CN": "忽略的标签值" + }, + "default": -100 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "soft_label", + "type": "boolean", + "default": false, + "label": { + "en_US": "soft label", + "zh_CN": "软标签" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": -1 + }, + { + "id": "use_softmax", + "type": "boolean", + "default": true, + "label": { + "zh_CN": "softmax 归一化", + "en_US": "use softmax normalization" + } + } + ] + }, + { + "id": "Dropout2D", + "mode": "nn", + "label": { + "zh_CN": "二维概率丢弃", + "en_US": "Dropout2D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout3D", + "mode": "nn", + "label": { + "zh_CN": "三维概率丢弃", + "en_US": "Dropout3D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout", + "mode": "nn", + "label": { + "zh_CN": "概率丢弃", + "en_US": "Dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "丢弃轴", + "en_US": "axis" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "upscale_in_train", + "label": "upscale_in_train", + "default": true + }, + { + "id": 1, + "value": "downscale_in_infer", + "label": "downscale_in_infer" + } + ] + } + ] + }, + { + "id": "ELU", + "mode": "nn", + "label": { + "zh_CN": "ELU 激活函数", + "en_US": "ELU activation" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Embedding", + "mode": "nn", + "label": { + "zh_CN": "嵌入层", + "en_US": "Embedding" + }, + "properties": [ + { + "id": "num_embeddings", + "type": "number", + "label": { + "zh_CN": "字典大小", + "en_US": "size of embeddings" + } + }, + { + "id": "embedding_dim", + "type": "number", + "label": { + "zh_CN": "嵌入向量的维度", + "en_US": "Dim of every embedding" + } + } + ] + }, + { + "id": "Fold", + "mode": "nn", + "label": { + "zh_CN": "区块合并", + "en_US": "fold" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "卷积核大小", + "en_US": "size of kernel" + } + }, + { + "id": "strides", + "type": "number", + "label": { + "zh_CN": "步长大小", + "en_US": "size of stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度扩张大小", + "en_US": "padding" + } + }, + { + "type": "number", + "default": 1, + "id": "dilations", + "label": { + "en_US": "dilations", + "zh_CN": "卷积膨胀" + } + } + ] + }, + { + "id": "FractionalMaxPool2D", + "mode": "nn", + "label": { + "zh_CN": "2维分数阶最大值池化", + "en_US": "FractionalMaxPool2D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "FractionalMaxPool3D", + "mode": "nn", + "label": { + "zh_CN": "3维分数阶最大值池化", + "en_US": "FractionalMaxPool3D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "GELU", + "mode": "nn", + "label": { + "zh_CN": "GELU 激活函数", + "en_US": "GELU activation" + }, + "properties": [ + { + "id": "approximate", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否启用近似计算", + "en_US": "approximate" + } + } + ] + }, + { + "id": "GLU", + "mode": "nn", + "label": { + "zh_CN": "GLU 激活层", + "en_US": "GLU Activation Operator" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "en_US": "axis", + "zh_CN": "沿着该轴将输入二等分" + } + } + ] + }, + { + "id": "GRUCell", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元", + "en_US": "GRUCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GRU", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元网络", + "en_US": "GRU" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GaussianNLLLoss", + "mode": "nn", + "label": { + "zh_CN": "高斯负对数似然损失", + "en_US": "GaussianNLLLoss" + }, + "properties": [ + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "Is the constant term included in the loss calculation", + "zh_CN": "是否在损失计算中包括常数项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 1e-6 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "GroupNorm", + "mode": "nn", + "label": { + "en_US": "Group Normalization", + "zh_CN": "组归一化" + }, + "properties": [ + { + "id": "num_groups", + "type": "number", + "label": { + "en_US": "num groups", + "zh_CN": "从通道中分离出的组数" + } + }, + { + "id": "num_channels", + "type": "number", + "label": { + "en_US": "num channels", + "zh_CN": "输入通道数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "HSigmoidLoss", + "label": { + "en_US": "hierarchical sigmoid", + "zh_CN": "层次Sigmoid" + }, + "mode": "nn", + "properties": [ + { + "id": "feature_size", + "type": "number", + "label": { + "en_US": "input tensor size", + "zh_CN": "输入tensor的特征尺寸" + } + }, + { + "id": "num_classes", + "type": "number", + "label": { + "en_US": "dictionary size", + "zh_CN": "字典大小" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "is_custom", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "自定义二叉树", + "en_US": "custom Binary tree" + } + }, + { + "id": "is_sparse", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用稀疏更新", + "en_US": "Whether to use the sparse update method" + } + } + ] + }, + { + "id": "Hardshrink", + "mode": "nn", + "label": { + "en_US": "Hardshrink", + "zh_CN": "Hardshrink 激活层" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 0.5, + "label": { + "en_US": "threshold", + "zh_CN": "threshold" + } + } + ] + }, + { + "id": "Hardsigmoid", + "mode": "nn", + "label": { + "en_US": "Hardsigmoid", + "zh_CN": "Hardsigmoid 激活层" + }, + "properties": [] + }, + { + "id": "Hardswish", + "mode": "nn", + "label": { + "zh_CN": "Hardswish 激活函数", + "en_US": "Hardswish" + }, + "properties": [] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh Activation", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "label": { + "en_US": "min value", + "zh_CN": "最小值" + }, + "type": "number", + "default": -1 + }, + { + "id": "max", + "label": { + "en_US": "max value", + "zh_CN": "最大值" + }, + "type": "number", + "default": 1 + } + ] + }, + { + "id": "HingeEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "非线形的铰链嵌入损失", + "en_US": "HingeEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Identity", + "mode": "nn", + "label": { + "zh_CN": "等效层", + "en_US": "Identity" + }, + "properties": [] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm2D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm2D", + "en_US": "InstanceNorm2D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "KLDivLoss", + "mode": "nn", + "label": { + "zh_CN": "Kullback-Leibler 散度损失", + "en_US": "Kullback-Leibler loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "L1Loss", + "mode": "nn", + "label": { + "en_US": "L1 loss", + "zh_CN": "L1 loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "LSTMCell", + "mode": "nn", + "label": { + "zh_CN": "长短期记忆网络单元", + "en_US": "LSTMCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LSTM", + "mode": "nn", + "label": { + "en_US": "LSTM", + "zh_CN": "LSTM" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LeakyReLU", + "mode": "nn", + "label": { + "zh_CN": "LeakyReLU 激活层", + "en_US": "LeakyReLU" + }, + "properties": [ + { + "id": "negative_slope", + "type": "number", + "default": 0.01, + "label": { + "zh_CN": "斜率", + "en_US": "slope" + } + } + ] + }, + { + "id": "LocalResponseNorm", + "mode": "nn", + "label": { + "en_US": "LocalResponseNorm", + "zh_CN": "局部响应正则化" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "zh_CN": "累加通道数", + "en_US": "Accumulated number of channels" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1e-4, + "label": { + "en_US": "Scaling parameters", + "zh_CN": "缩放参数" + } + }, + { + "id": "beta", + "type": "number", + "default": 0.75, + "label": { + "zh_CN": "指数", + "en_US": "exponent" + } + }, + { + "id": "k", + "type": "number", + "default": 1, + "label": { + "zh_CN": "位移", + "en_US": "k" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "LogSigmoid", + "label": { + "zh_CN": "LogSigmoid 激活层", + "en_US": "LogSigmoid" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "LogSoftmax", + "mode": "nn", + "label": { + "zh_CN": "LogSoftmax", + "en_US": "LogSoftmax_cn" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "MSELoss", + "mode": "nn", + "label": { + "zh_CN": "均方误差", + "en_US": "MSELoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MarginRankingLoss", + "mode": "nn", + "label": { + "zh_CN": "MarginRankingLoss", + "en_US": "MarginRankingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "label": { + "zh_CN": "加和的 margin 值", + "en_US": "The margin value of the sum" + }, + "default": 0 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MaxUnPool2D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool2D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool3D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool3D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool1D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool1D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "Maxout", + "mode": "nn", + "label": { + "zh_CN": "Maxout 激活层", + "en_US": "Maxout" + }, + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "en_US": "groups", + "zh_CN": "组数" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "指定通道所在维度的索引" + }, + "default": 1 + } + ] + }, + { + "id": "Mish", + "label": { + "en_US": "Mish", + "zh_CN": "Mish 激活层" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "MultiHeadAttention", + "label": { + "en_US": "MultiHeadAttention", + "zh_CN": "多头注意力" + }, + "mode": "nn", + "properties": [ + { + "id": "embed_dim", + "type": "number", + "label": { + "zh_CN": "输入维度", + "en_US": "embed_dim" + } + }, + { + "id": "num_heads", + "type": "number", + "label": { + "zh_CN": "head数量", + "en_US": "num_heads" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0, + "label": { + "zh_CN": "随机失活率", + "en_US": "dropout" + } + }, + { + "id": "kdim", + "type": "number", + "label": { + "zh_CN": "key的维度", + "en_US": "kdim" + } + }, + { + "id": "vdim", + "type": "number", + "label": { + "zh_CN": "value的维度", + "en_US": "vdim" + } + }, + { + "id": "need_weights", + "type": "boolean", + "label": { + "zh_CN": "是否返回注意力权重", + "en_US": "need_weights" + }, + "default": false + }, + { + "id": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "type": "ParamAttr" + } + ] + }, + { + "id": "PReLU", + "mode": "nn", + "label": { + "en_US": "PReLU", + "zh_CN": "PReLU" + }, + "properties": [ + { + "id": "num_parameters", + "type": "number", + "default": 1, + "label": { + "en_US": "num_parameters", + "zh_CN": "可训练 weight 数量" + } + }, + { + "id": "init", + "type": "number", + "default": 0.25, + "label": { + "zh_CN": "初始值", + "en_US": "init" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad1D", + "mode": "nn", + "label": { + "en_US": "Pad1D", + "zh_CN": "Pad1D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad2D", + "mode": "nn", + "label": { + "en_US": "Pad2D", + "zh_CN": "Pad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad3D", + "mode": "nn", + "label": { + "en_US": "Pad3D", + "zh_CN": "Pad3D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PairwiseDistance", + "mode": "nn", + "label": { + "zh_CN": "范数距离", + "en_US": "PairwiseDistance" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 2, + "label": { + "en_US": "p", + "zh_CN": "p阶的范数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "keep_dim", + "type": "boolean", + "label": { + "zh_CN": "是否保留输出 Tensor 减少的维度", + "en_US": "keep_dim" + } + } + ] + }, + { + "id": "PixelShuffle", + "label": { + "zh_CN": "PixelShuffle", + "en_US": "PixelShuffle" + }, + "mode": "nn", + "properties": [ + { + "id": "upscale_factor", + "type": "number", + "label": { + "en_US": "upscale_factor", + "zh_CN": "上采样增大因子" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PixelUnshuffle", + "mode": "nn", + "label": { + "zh_CN": "PixelUnshuffle", + "en_US": "PixelUnshuffle" + }, + "properties": [ + { + "id": "downscale_factor", + "type": "number", + "label": { + "zh_CN": "下采样因子", + "en_US": "downscale_factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PoissonNLLLoss", + "mode": "nn", + "label": { + "en_US": "PoissonNLLLoss", + "zh_CN": "PoissonNLL 损失函数" + }, + "properties": [ + { + "id": "log_input", + "type": "boolean", + "label": { + "zh_CN": "输入是否为对数函数映射后结果", + "en_US": "log_input" + }, + "default": true + }, + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "full", + "zh_CN": "是否在损失计算中包括 Stirling 近似项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "en_US": "epsilon", + "zh_CN": "在 log_input 为 true 时使用的常数小量" + }, + "default": 1e-8 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RNNTLoss", + "mode": "nn", + "label": { + "zh_CN": "RNNTLoss 损失", + "en_US": "RNNTLoss" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "zh_CN": "空格标记的 ID 值", + "en_US": "blank" + } + }, + { + "id": "fastemit_lambda", + "type": "number", + "default": 0.001, + "label": { + "en_US": "fastemit_lambda", + "zh_CN": "FastEmit 的正则化参数" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RReLU", + "mode": "nn", + "label": { + "zh_CN": "RReLU 激活层", + "en_US": "RReLU" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "padding", + "en_US": "padding" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": "constant", + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": "reflect", + "label": "reflect", + "value": "reflect" + }, + { + "id": "replicate", + "label": "replicate", + "value": "replicate" + }, + { + "id": "circular", + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "default": 0.0, + "label": { + "zh_CN": "value", + "en_US": "value" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCL", + "label": "NCL" + }, + { + "id": 1, + "value": "NLC", + "label": "NLC" + } + ] + } + ] + }, + { + "id": "ReLU6", + "mode": "nn", + "label": { + "en_US": "ReLU6", + "zh_CN": "ReLU6" + }, + "properties": [] + }, + { + "id": "SELU", + "mode": "nn", + "label": { + "en_US": "SELU", + "zh_CN": "SELU" + }, + "properties": [ + { + "id": "scale", + "type": "number", + "default": 1.0507009873554804934193349852946, + "label": { + "en_US": "scale", + "zh_CN": "scale" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1.6732632423543772848170429916717, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Sigmoid", + "mode": "nn", + "label": { + "en_US": "Sigmoid", + "zh_CN": "Sigmoid" + }, + "properties": [] + }, + { + "id": "Silu", + "mode": "nn", + "label": { + "en_US": "Silu", + "zh_CN": "Silu" + }, + "properties": [] + }, + { + "id": "SmoothL1Loss", + "mode": "nn", + "label": { + "zh_CN": "SmoothL1Loss", + "en_US": "SmoothL1Loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "delta", + "label": { + "en_US": "delta", + "zh_CN": "delta" + }, + "default": 1.0, + "type": "number" + } + ] + }, + { + "id": "SoftMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "SoftMarginLoss", + "en_US": "SoftMarginLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Softmax2D", + "mode": "nn", + "label": { + "en_US": "Softmax2D", + "zh_CN": "Softmax2D" + }, + "properties": [] + }, + { + "id": "Softmax", + "mode": "nn", + "label": { + "en_US": "Softmax", + "zh_CN": "Softmax 激活层" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "运算轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "Softplus", + "mode": "nn", + "label": { + "zh_CN": "Softplus 激活层", + "en_US": "Softplus" + }, + "properties": [ + { + "id": "beta", + "type": "number", + "default": 1, + "label": { + "en_US": "beta", + "zh_CN": "beta" + } + }, + { + "id": "threshold", + "type": "number", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "default": 20 + } + ] + }, + { + "id": "Softshrink", + "label": { + "zh_CN": "Softshrink 激活层", + "en_US": "Softshrink" + }, + "properties": [ + { + "id": "threshold", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "type": "number", + "default": 0.5 + } + ], + "mode": "nn" + }, + { + "id": "Softsign", + "mode": "nn", + "label": { + "zh_CN": "Softsign 激活层", + "en_US": "Softsign" + }, + "properties": [] + }, + { + "id": "Swish", + "mode": "nn", + "label": { + "zh_CN": "Swish", + "en_US": "Swish" + }, + "properties": [] + }, + { + "id": "SyncBatchNorm", + "mode": "nn", + "label": { + "en_US": "SyncBatchNorm", + "zh_CN": "SyncBatchNorm" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "type": "number", + "default": -1, + "label": { + "en_US": "min", + "zh_CN": "最小值" + } + }, + { + "id": "max", + "type": "number", + "default": 1, + "label": { + "zh_CN": "最大值", + "en_US": "最小值" + } + } + ] + }, + { + "id": "Tanhshrink", + "mode": "nn", + "label": { + "zh_CN": "Tanhshrink 激活层", + "en_US": "Tanhshrink" + }, + "properties": [] + }, + { + "id": "ThresholdedReLU", + "mode": "nn", + "label": { + "zh_CN": "ThresholdedReLU 激活层", + "en_US": "ThresholdedReLU" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + } + } + ] + }, + { + "id": "TransformerDecoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 解码器层", + "en_US": "TransformerDecoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "layer_norm_eps", + "type": "number", + "default": 0.0001, + "label": { + "en_US": "layer_norm_eps", + "zh_CN": "transformer decoder 中 layer normalization 层的 eps 参数值" + } + } + ] + }, + { + "id": "TransformerEncoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 编码器层", + "en_US": "TransformerEncoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Transformer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 模型", + "en_US": "Transformer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "p", + "label": { + "zh_CN": "范数", + "en_US": "p" + }, + "type": "number", + "default": 2 + }, + { + "id": "epsilon", + "type": "number", + "default": 1e-6, + "label": { + "zh_CN": "防止除数为0", + "en_US": "epsilon" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "distance_function", + "type": "number", + "label": { + "zh_CN": "欧氏距离范数", + "en_US": "distance_function" + } + }, + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Unfold", + "mode": "nn", + "label": { + "en_US": "Unfold", + "zh_CN": "Unfold" + }, + "properties": [ + { + "id": "kernel_sizes", + "type": "number", + "label": { + "zh_CN": "卷积核的尺寸", + "en_US": "kernel_sizes" + } + }, + { + "id": "dilations", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积膨胀", + "en_US": "dilations" + } + }, + { + "id": "paddings", + "type": "number", + "default": 0, + "label": { + "en_US": "paddings", + "zh_CN": "扩张" + } + }, + { + "id": "strides", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积步长", + "en_US": "strides" + } + } + ] + }, + { + "id": "UpsamplingBilinear2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingBilinear2D", + "zh_CN": "UpsamplingBilinear2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "UpsamplingNearest2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingNearest2D", + "zh_CN": "UpsamplingNearest2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "ZeroPad2D", + "mode": "nn", + "label": { + "zh_CN": "零填充", + "en_US": "ZeroPad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "size of padding" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "Upsample", + "label": { + "en_US": "Upsample", + "zh_CN": "上采样" + }, + "mode": "nn", + "properties": [ + { + "id": "size", + "type": "list", + "label": { + "zh_CN": "大小", + "en_US": "size" + }, + "default": [ + 0, + 0 + ], + "items": "number" + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "en_US": "scale_factor", + "zh_CN": "缩放因子" + } + }, + { + "id": "mode", + "type": "enums", + "label": { + "zh_CN": "采样方法", + "en_US": "mode" + }, + "enums": [ + { + "id": "bilinear", + "value": "bilinear", + "label": "bilinear" + }, + { + "id": "trilinear", + "value": "trilinear", + "label": "trilinear" + }, + { + "id": "nearest", + "value": "nearest", + "label": "nearest", + "default": true + }, + { + "id": "bicubic", + "value": "bicubic", + "label": "bicubic" + }, + { + "id": "linear", + "value": "linear", + "label": "linear" + }, + { + "id": "area", + "value": "area", + "label": "area" + } + ] + }, + { + "id": "align_corners", + "type": "boolean", + "label": { + "en_US": "align_corners", + "zh_CN": "对齐" + }, + "default": false + }, + { + "id": "align_mode", + "type": "number", + "default": 0, + "label": { + "en_US": "align_mode", + "zh_CN": "双线性插值" + } + }, + { + "id": "data_format", + "type": "enums", + "label": { + "en_US": "data format", + "zh_CN": "数据格式" + }, + "enums": [ + { + "id": "NCW", + "value": "NCW", + "label": "NCW" + }, + { + "id": "NWC", + "value": "NWC", + "label": "NWC" + }, + { + "id": "NCHW", + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": "NHWC", + "value": "NHWC", + "label": "NHWC" + }, + { + "id": "NCDHW", + "value": "NCDHW", + "label": "NCDHW" + }, + { + "id": "NDHWC", + "value": "NDHWC", + "label": "NDHWC" + } + ] + } + ] + }, + { + "id": "SpectralNorm", + "mode": "nn", + "label": { + "en_US": "SpectralNorm", + "zh_CN": "SpectralNorm" + }, + "properties": [ + { + "id": "weight_shape", + "type": "list", + "items": "number", + "label": { + "zh_CN": "权重参数的shape", + "en_US": "shape of weight attr" + } + }, + { + "id": "dim", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度索引", + "en_US": "dim" + } + }, + { + "id": "power_iters", + "default": 0, + "type": "number", + "label": { + "en_US": "power iters", + "zh_CN": "用于计算的 SpectralNorm 功率迭代次数" + } + }, + { + "id": "eps", + "type": "number", + "default": 1e-12, + "label": { + "zh_CN": "用于保证计算规范中的数值稳定性", + "en_US": "eps" + } + } + ] + }, + { + "id": "Unflatten", + "mode": "nn", + "label": { + "zh_CN": "Unflatten", + "en_US": "Unflatten" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "要展开维度的轴" + } + }, + { + "id": "shape", + "type": "list", + "items": "number", + "label": { + "en_US": "shape", + "zh_CN": "展开的shape" + } + } + ] + } + ], + "layer": [] + } +} \ No newline at end of file diff --git a/dl-flow-backend/data/install.lock b/dl-flow-backend/data/install.lock new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/dl-flow-backend/data/install.lock @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/dl-flow-backend/docker-compose.yaml b/dl-flow-backend/docker-compose.yaml new file mode 100644 index 0000000..c1826fd --- /dev/null +++ b/dl-flow-backend/docker-compose.yaml @@ -0,0 +1,31 @@ +version: '3' + +services: + mongodb: + image: mongo + ports: + - 27018:27017 + redis: + image: redis + ports: + - 6379:6379 + server: + image: gaonengwww/dl-flow-backend + ports: + - 9000:9000 + environment: + - DB_URL=mongodb://mongodb:27017/dl-flow # 数据库地址 + - REDIS_HOST=redis # redis地址 (必填) + - REDIS_PORT=6379 # redis端口 (必填) + - REDIS_DB=0 # redis数据库 (必填) + - REDIS_PASSWORD="" # redis密码 + - JWT_EXPIRE_IN="1d" # JWT 过期时间 (必填) + - JWT_SIGN_ALGORITHM="RS256" # JWT签名算法, 要与密钥对符合, 例如密钥对是RSA 2048bit, 那么此处应该是 RS256 (必填) + - JWT_PUB_KEY=./keys/key.pub # JWT 公钥 (必填) + - JWT_PRI_KEY=./keys/key.pri # JWT 私钥 (必填) + - PWD_SALT=salt # bcrypt 盐(必填) + - PWD_SALT_LEN=12 # bcrypt 盐(必填) + # volumes: # 强烈将下述卷挂载到本地, 以避免数据丢失 + # - ./_test/public:/public # 代码生成暂存位置 + # - ./_test/keys:/keys # 密钥对存放位置 + # - ./_test/data:/data # bundle.json与install.lock 存放位置 \ No newline at end of file diff --git a/dl-flow-backend/dockerfile b/dl-flow-backend/dockerfile new file mode 100644 index 0000000..cb6d33a --- /dev/null +++ b/dl-flow-backend/dockerfile @@ -0,0 +1,25 @@ +FROM node:18 as builder +WORKDIR /CODE +ADD . /CODE/ + +RUN npm install pnpm -g && pnpm install && pnpm build + +FROM node:18-alpine as runner +COPY --from=builder /CODE/dist ./dist +COPY --from=builder /CODE/node_modules ./node_modules +VOLUME [ "/public", "/keys", "/data", "/examples"] + +ENV DB_URL="" +ENV REDIS_HOST="" +ENV REDIS_PORT="" +ENV REDIS_DB="" +ENV REDIS_PASSWORD="" +ENV JWT_EXPIRE_IN="" +ENV JWT_SIGN_ALGORITHM="" +ENV JWT_PUB_KEY="" +ENV JWT_PRI_KEY="" +ENV PWD_SALT="" +ENV PWD_SALT_LEN="" + +EXPOSE 9000-9900 +CMD [ "node","dist/main.js" ] \ No newline at end of file diff --git a/dl-flow-backend/examples/MNIST.json b/dl-flow-backend/examples/MNIST.json new file mode 100644 index 0000000..e62f7ac --- /dev/null +++ b/dl-flow-backend/examples/MNIST.json @@ -0,0 +1,2716 @@ +{ + "data": { + "meta": { + "start": "b0f69335-4b2a-4e91-b774-847f18533f28", + "end": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2" + }, + "payload": { + "cells": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "6a320cbe-f9dd-4f28-b4dd-2edc908b0e6f", + "zIndex": -1, + "source": { + "cell": "b0f69335-4b2a-4e91-b774-847f18533f28", + "port": "out" + }, + "target": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "2b094e64-696c-4095-a85c-f0ef2a21f8b8", + "zIndex": -1, + "source": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "out" + }, + "target": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "fec1dd68-f34d-4efa-aaf9-f81287eaa159", + "zIndex": -1, + "source": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "out" + }, + "target": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "7faf88ac-736a-4f38-a4b0-b21d30e593f5", + "zIndex": -1, + "source": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "out" + }, + "target": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "f7097353-134e-4440-903c-3b6ea61b7085", + "zIndex": -1, + "source": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "out" + }, + "target": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "0259c115-41d6-4d98-bd69-1b2e8d03f746", + "zIndex": -1, + "source": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "out" + }, + "target": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "421789b8-267d-47d2-98c8-b121c03b2854", + "zIndex": -1, + "source": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "out" + }, + "target": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "e1e890ad-7673-4188-861e-86b471f59ccd", + "zIndex": -1, + "source": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "out" + }, + "target": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "b808c035-bea3-4e45-b450-40b93ca39ba0", + "zIndex": -1, + "source": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "out" + }, + "target": { + "cell": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "port": "in" + } + }, + { + "position": { + "x": 10, + "y": -90 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "b0f69335-4b2a-4e91-b774-847f18533f28", + "data": { + "_id": "661632e009b6b04d369ce9d9", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 1 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 6 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number", + "data": 1 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true, + "data": "\"zeros\"" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 1 + }, + { + "position": { + "x": 10, + "y": 10 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "data": { + "_id": "661632e009b6b04d369ce9d7", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 2 + }, + { + "position": { + "x": 10, + "y": 100 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "data": { + "_id": "661632e009b6b04d369ce9cf", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "id": "MaxPool2D", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + }, + "data": 2 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + }, + "data": 2 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 3 + }, + { + "position": { + "x": 10, + "y": 180 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "data": { + "_id": "661632e009b6b04d369ce9d9", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 6 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 16 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 5 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number", + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true, + "data": "\"zeros\"" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 4 + }, + { + "position": { + "x": 10, + "y": 290 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "data": { + "_id": "661632e009b6b04d369ce9d7", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 5 + }, + { + "position": { + "x": 10, + "y": 380 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "data": { + "_id": "661632e009b6b04d369ce9cf", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "id": "MaxPool2D", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + }, + "data": 2 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + }, + "data": 2 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 6 + }, + { + "position": { + "x": 10, + "y": 470 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "19ff38f1-26da-4e73-b296-b8e10501574e", + "data": { + "_id": "661632e009b6b04d369ce9dc", + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1, + "data": -1 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 7 + }, + { + "position": { + "x": 65, + "y": 538 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 400 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 120 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 8 + }, + { + "position": { + "x": 120, + "y": 606 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 120 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 84 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 9 + }, + { + "position": { + "x": 180, + "y": 670 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 84 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 10 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 10 + } + ] + } + }, + "graphData": { + "cells": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "6a320cbe-f9dd-4f28-b4dd-2edc908b0e6f", + "zIndex": -1, + "source": { + "cell": "b0f69335-4b2a-4e91-b774-847f18533f28", + "port": "out" + }, + "target": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "2b094e64-696c-4095-a85c-f0ef2a21f8b8", + "zIndex": -1, + "source": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "out" + }, + "target": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "fec1dd68-f34d-4efa-aaf9-f81287eaa159", + "zIndex": -1, + "source": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "out" + }, + "target": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "7faf88ac-736a-4f38-a4b0-b21d30e593f5", + "zIndex": -1, + "source": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "out" + }, + "target": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "f7097353-134e-4440-903c-3b6ea61b7085", + "zIndex": -1, + "source": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "out" + }, + "target": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "0259c115-41d6-4d98-bd69-1b2e8d03f746", + "zIndex": -1, + "source": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "out" + }, + "target": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "421789b8-267d-47d2-98c8-b121c03b2854", + "zIndex": -1, + "source": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "out" + }, + "target": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "e1e890ad-7673-4188-861e-86b471f59ccd", + "zIndex": -1, + "source": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "out" + }, + "target": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "b808c035-bea3-4e45-b450-40b93ca39ba0", + "zIndex": -1, + "source": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "out" + }, + "target": { + "cell": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "port": "in" + } + }, + { + "position": { + "x": 10, + "y": -90 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "b0f69335-4b2a-4e91-b774-847f18533f28", + "data": { + "_id": "661632e009b6b04d369ce9d9", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 1 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 6 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number", + "data": 1 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true, + "data": "\"zeros\"" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 1 + }, + { + "position": { + "x": 10, + "y": 10 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "data": { + "_id": "661632e009b6b04d369ce9d7", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 2 + }, + { + "position": { + "x": 10, + "y": 100 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "data": { + "_id": "661632e009b6b04d369ce9cf", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "id": "MaxPool2D", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + }, + "data": 2 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + }, + "data": 2 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 3 + }, + { + "position": { + "x": 10, + "y": 180 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "data": { + "_id": "661632e009b6b04d369ce9d9", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 6 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 16 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 5 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number", + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true, + "data": "\"zeros\"" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 4 + }, + { + "position": { + "x": 10, + "y": 290 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "data": { + "_id": "661632e009b6b04d369ce9d7", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 5 + }, + { + "position": { + "x": 10, + "y": 380 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "data": { + "_id": "661632e009b6b04d369ce9cf", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "id": "MaxPool2D", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + }, + "data": 2 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + }, + "data": 2 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 6 + }, + { + "position": { + "x": 10, + "y": 470 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "19ff38f1-26da-4e73-b296-b8e10501574e", + "data": { + "_id": "661632e009b6b04d369ce9dc", + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1, + "data": -1 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 7 + }, + { + "position": { + "x": 10, + "y": 540 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 400 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 120 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 8 + }, + { + "position": { + "x": 10, + "y": 610 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 120 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 84 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 9 + }, + { + "position": { + "x": 10, + "y": 680 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 84 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 10 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 10 + } + ] + } +} \ No newline at end of file diff --git a/dl-flow-backend/global.d.ts b/dl-flow-backend/global.d.ts new file mode 100644 index 0000000..d70c456 --- /dev/null +++ b/dl-flow-backend/global.d.ts @@ -0,0 +1,26 @@ +import { JwtSignOptions } from '@nestjs/jwt'; + +declare global { + namespace NodeJS { + interface ProcessEnv { + DB_URL: string; + REDIS_HOST: string; + REDIS_PORT: number; + REDIS_DB: number; + REDIS_PASSWORD: string; + JWT_EXPIRE_IN: string; + JWT_SIGN_ALGORITHM: JwtSignOptions['algorithm']; + JWT_PUB_KEY: string; + JWT_PRI_KEY: string; + /** + * @deprecated + */ + PWD_SALT: string; // used for bcrypt + PWD_SALT_LEN: string; + } + } + declare const __DEV__: boolean; + declare const __TEST__: boolean; +} + +export {}; diff --git a/dl-flow-backend/group-nest-test-case.json b/dl-flow-backend/group-nest-test-case.json new file mode 100644 index 0000000..a919603 --- /dev/null +++ b/dl-flow-backend/group-nest-test-case.json @@ -0,0 +1,1390 @@ +{ + "meta": { + "start": "Start", + "end": "End" + }, + "payload": { + "cells": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "1208c706-6de1-4e95-a487-e21b47d5087a", + "zIndex": -1, + "source": { + "cell": "ChildA", + "port": "out" + }, + "target": { + "cell": "ChildB", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "dd672e2c-c68f-4719-8110-72e68fc50532", + "zIndex": -1, + "source": { + "cell": "ChildB", + "port": "out" + }, + "target": { + "cell": "ChildC", + "port": "in" + } + }, + { + "position": { + "x": -22, + "y": -102 + }, + "size": { + "width": 176, + "height": 282 + }, + "view": "vue-shape-view", + "shape": "group-node", + "zIndex": -1, + "ports": { + "groups": { + "top": { + "position": { + "name": "top" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "GroupA", + "children": [ + "ChildA", + "ChildB", + "ChildC", + "ChildD", + "ChildE" + ], + "originSize": { + "width": 1, + "height": 1 + }, + "originPosition": { + "x": -22, + "y": -102 + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "9c8dd65a-f7fc-4739-bb62-797fa92130ea", + "zIndex": -1, + "source": { + "cell": "GroupA", + "port": "out" + }, + "target": { + "cell": "ConvA", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "cc11ca61-207e-42a3-a2d6-28f891dc8d79", + "zIndex": -1, + "source": { + "cell": "Start", + "port": "out" + }, + "target": { + "cell": "GroupA", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "f7480397-aaa1-451e-9414-476a79f3b41d", + "zIndex": -1, + "source": { + "cell": "ConvA", + "port": "out" + }, + "target": { + "cell": "End", + "port": "in" + } + }, + { + "position": { + "x": 10, + "y": -70 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "ChildA", + "data": { + "_id": "65e467b8c08c8314009c86d8", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 1, + "parent": "GroupA" + }, + { + "position": { + "x": 10, + "y": 20 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "ChildB", + "data": { + "_id": "65e467b8c08c8314009c86d8", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 2, + "parent": "GroupA" + }, + { + "position": { + "x": 10, + "y": 100 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "ChildC", + "data": { + "_id": "65e467b8c08c8314009c86d8", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 3, + "parent": "GroupA" + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "ChildD", + "zIndex": 4, + "source": { + "cell": "GroupA", + "port": "in" + }, + "target": { + "cell": "ChildA", + "port": "in" + }, + "parent": "GroupA" + }, + { + "position": { + "x": 10, + "y": 220 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "ConvA", + "data": { + "_id": "65e467b8c08c8314009c86d8", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 6 + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "ChildE", + "zIndex": 7, + "source": { + "cell": "ChildC", + "port": "out" + }, + "target": { + "cell": "GroupA", + "port": "out" + }, + "parent": "GroupA" + }, + { + "position": { + "x": 10, + "y": -200 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "Start", + "data": { + "_id": "65e467b8c08c8314009c86d8", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 8 + }, + { + "position": { + "x": 10, + "y": 310 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "End", + "data": { + "_id": "65e467b8c08c8314009c86d6", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 9 + } + ], + "edges": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "1208c706-6de1-4e95-a487-e21b47d5087a", + "zIndex": -1, + "source": { + "cell": "ChildA", + "port": "out" + }, + "target": { + "cell": "ChildB", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "dd672e2c-c68f-4719-8110-72e68fc50532", + "zIndex": -1, + "source": { + "cell": "ChildB", + "port": "out" + }, + "target": { + "cell": "ChildC", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "9c8dd65a-f7fc-4739-bb62-797fa92130ea", + "zIndex": -1, + "source": { + "cell": "GroupA", + "port": "out" + }, + "target": { + "cell": "ConvA", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "cc11ca61-207e-42a3-a2d6-28f891dc8d79", + "zIndex": -1, + "source": { + "cell": "Start", + "port": "out" + }, + "target": { + "cell": "GroupA", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "f7480397-aaa1-451e-9414-476a79f3b41d", + "zIndex": -1, + "source": { + "cell": "ConvA", + "port": "out" + }, + "target": { + "cell": "End", + "port": "in" + } + } + ] + } +} \ No newline at end of file diff --git a/dl-flow-backend/libs/database/src/__tests__/database.service.spec.ts b/dl-flow-backend/libs/database/src/__tests__/database.service.spec.ts new file mode 100644 index 0000000..81dd142 --- /dev/null +++ b/dl-flow-backend/libs/database/src/__tests__/database.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DatabaseService } from '../database.service'; + +describe('DatabaseService', () => { + let service: DatabaseService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DatabaseService], + }).compile(); + + service = module.get(DatabaseService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/dl-flow-backend/libs/database/src/database.module.ts b/dl-flow-backend/libs/database/src/database.module.ts new file mode 100644 index 0000000..a338987 --- /dev/null +++ b/dl-flow-backend/libs/database/src/database.module.ts @@ -0,0 +1,30 @@ +import { Logger, Module } from '@nestjs/common'; +import { DatabaseService } from './database.service'; +import { MongooseModule } from '@nestjs/mongoose'; + +@Module({ + providers: [DatabaseService], + exports: [DatabaseService], + imports: [ + MongooseModule.forRootAsync({ + useFactory: async () => { + let uri = process.env.DB_URL; + // 当且仅当为开发环境或测试环境时候,才会去启用内存数据库 + if (__DEV__ || __TEST__) { + const { MongoMemoryReplSet } = await import('mongodb-memory-server'); + const mongod = await MongoMemoryReplSet.create({ + replSet: { + count: 2, + }, + }); + uri = mongod.getUri(); + Logger.log(`Memory server url is: ${uri}`, 'DbModule'); + } + return { + uri, + }; + }, + }), + ], +}) +export class DbModule {} diff --git a/dl-flow-backend/libs/database/src/database.service.ts b/dl-flow-backend/libs/database/src/database.service.ts new file mode 100644 index 0000000..f0ff1df --- /dev/null +++ b/dl-flow-backend/libs/database/src/database.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class DatabaseService {} diff --git a/dl-flow-backend/libs/database/src/index.ts b/dl-flow-backend/libs/database/src/index.ts new file mode 100644 index 0000000..3dd6a6a --- /dev/null +++ b/dl-flow-backend/libs/database/src/index.ts @@ -0,0 +1,2 @@ +export * from './database.module'; +export * from './database.service'; diff --git a/dl-flow-backend/libs/database/tsconfig.lib.json b/dl-flow-backend/libs/database/tsconfig.lib.json new file mode 100644 index 0000000..21c8d58 --- /dev/null +++ b/dl-flow-backend/libs/database/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/database" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/dl-flow-backend/libs/redis/src/index.ts b/dl-flow-backend/libs/redis/src/index.ts new file mode 100644 index 0000000..c82b927 --- /dev/null +++ b/dl-flow-backend/libs/redis/src/index.ts @@ -0,0 +1,2 @@ +export * from './redis.module'; +export * from './redis.service'; diff --git a/dl-flow-backend/libs/redis/src/redis.module.ts b/dl-flow-backend/libs/redis/src/redis.module.ts new file mode 100644 index 0000000..11de25b --- /dev/null +++ b/dl-flow-backend/libs/redis/src/redis.module.ts @@ -0,0 +1,50 @@ +import { Module } from '@nestjs/common'; +import { RedisService } from './redis.service'; +import { + RedisModule as Redis, + RedisModuleOptions, +} from '@liaoliaots/nestjs-redis'; + +export const memoryRedis = async () => { + if (__DEV__ || __TEST__) { + const { RedisMemoryServer } = await import('redis-memory-server'); + const server = new RedisMemoryServer({ + instance: { + ip: '127.0.0.1', + port: 6379, + }, + }); + await server.start(); + return server; + } +}; + +@Module({ + providers: [RedisService], + exports: [RedisService], + imports: [ + Redis.forRootAsync({ + useFactory: async (): Promise => { + if (__DEV__ || __TEST__) { + const server = await memoryRedis(); + return { + config: { + host: await server.getIp(), + port: await server.getPort(), + }, + }; + } + return { + readyLog: true, + config: { + host: process.env.REDIS_HOST, + port: process.env.REDIS_PORT, + db: process.env.REDIS_DB, + password: process.env.REDIS_PASSWORD, + }, + }; + }, + }), + ], +}) +export class RedisModule {} diff --git a/dl-flow-backend/libs/redis/src/redis.service.ts b/dl-flow-backend/libs/redis/src/redis.service.ts new file mode 100644 index 0000000..dc9ae71 --- /dev/null +++ b/dl-flow-backend/libs/redis/src/redis.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class RedisService {} diff --git a/dl-flow-backend/libs/redis/tsconfig.lib.json b/dl-flow-backend/libs/redis/tsconfig.lib.json new file mode 100644 index 0000000..1f4c603 --- /dev/null +++ b/dl-flow-backend/libs/redis/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/redis" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/dl-flow-backend/libs/shared/src/index.ts b/dl-flow-backend/libs/shared/src/index.ts new file mode 100644 index 0000000..38478a5 --- /dev/null +++ b/dl-flow-backend/libs/shared/src/index.ts @@ -0,0 +1,74 @@ +import { ValidationOptions, registerDecorator } from 'class-validator'; + +export type Enum = { + id: string; + label: string; + value: string; + default?: boolean; +}; + +export type Label = { + zh_CN: string; + en_US: string; +}; + +export type Property = { + id: string; + label: Label; + type: string; + default: string | number | null | boolean; + enums: Enum[]; + data: any; +}; + +export const isProperty = (object: unknown | unknown[]) => { + if (Array.isArray(object)) { + return false; + } + if (object instanceof Object) { + const maybeProperty: Partial = object; + const keys = ['id', 'label', 'type', 'default']; + const maybePropertyKeys = Object.keys(maybeProperty); + if (!maybePropertyKeys.length) { + return false; + } + return maybePropertyKeys.every((key) => keys.includes(key)); + } + return false; +}; + +export function IsProperty(validationOptions?: ValidationOptions) { + return function (object: Partial, propertyName: string) { + registerDecorator({ + name: 'isProperty', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate(value: any) { + return isProperty(value); + }, + }, + }); + }; +} + +export function IsProperties(validationOptions?: ValidationOptions) { + return function (object: Partial, propertyName: string) { + registerDecorator({ + name: 'IsProperties', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate(value: unknown[]) { + console.log(value); + if (!value?.length) { + return false; + } + return value.every((v) => isProperty(v)); + }, + }, + }); + }; +} diff --git a/dl-flow-backend/libs/shared/tsconfig.lib.json b/dl-flow-backend/libs/shared/tsconfig.lib.json new file mode 100644 index 0000000..06a72ce --- /dev/null +++ b/dl-flow-backend/libs/shared/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/shared" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/dl-flow-backend/nest-cli.json b/dl-flow-backend/nest-cli.json new file mode 100644 index 0000000..44b220e --- /dev/null +++ b/dl-flow-backend/nest-cli.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true, + "webpack": true, + "webpackConfigPath": "webpack.config.js" + }, + "projects": { + "database": { + "type": "library", + "root": "libs/database", + "entryFile": "index", + "sourceRoot": "libs/database/src", + "compilerOptions": { + "tsConfigPath": "libs/database/tsconfig.lib.json" + } + }, + "shared": { + "type": "library", + "root": "libs/shared", + "entryFile": "index", + "sourceRoot": "libs/shared/src", + "compilerOptions": { + "tsConfigPath": "libs/shared/tsconfig.lib.json" + } + }, + "redis": { + "type": "library", + "root": "libs/redis", + "entryFile": "index", + "sourceRoot": "libs/redis/src", + "compilerOptions": { + "tsConfigPath": "libs/redis/tsconfig.lib.json" + } + } + } +} \ No newline at end of file diff --git a/dl-flow-backend/node-undefined-test-case.json b/dl-flow-backend/node-undefined-test-case.json new file mode 100644 index 0000000..3f7cd69 --- /dev/null +++ b/dl-flow-backend/node-undefined-test-case.json @@ -0,0 +1,1118 @@ +{ + "meta": { + "start": "a2437095-7c2f-4ca6-8273-9df4f2555338", + "end": "6bd4b1bd-e9ab-490f-b742-6ef287eedf63" + }, + "payload": { + "cells": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "5c36a959-6118-408f-bf9a-11455f9e0509", + "zIndex": -1, + "source": { + "cell": "a2437095-7c2f-4ca6-8273-9df4f2555338", + "port": "out" + }, + "target": { + "cell": "caf7e809-74ba-418f-9f6a-b3d512364649", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "9886445a-7c34-455a-b2be-93ce05d5501b", + "zIndex": -1, + "source": { + "cell": "8d7d3c5c-c1d1-494a-ba53-57d929d8f8ac", + "port": "out" + }, + "target": { + "cell": "d6db9931-ac7a-4123-9a81-e611e4747ae7", + "port": "in" + }, + "parent": "79f84abd-09f2-4289-905d-3b34242ad5b8" + }, + { + "position": { + "x": 70, + "y": 150 + }, + "size": { + "width": 184, + "height": 206 + }, + "view": "vue-shape-view", + "shape": "group-node", + "zIndex": -1, + "ports": { + "groups": { + "top": { + "position": { + "name": "top" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "79f84abd-09f2-4289-905d-3b34242ad5b8", + "children": [ + "d6db9931-ac7a-4123-9a81-e611e4747ae7", + "8d7d3c5c-c1d1-494a-ba53-57d929d8f8ac", + "9886445a-7c34-455a-b2be-93ce05d5501b" + ], + "originSize": { + "width": 1, + "height": 1 + }, + "originPosition": { + "x": 70, + "y": 150 + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "8ea6b4b9-efa2-4e0f-8bae-8695a0b0c7b6", + "zIndex": -1, + "source": { + "cell": "caf7e809-74ba-418f-9f6a-b3d512364649", + "port": "out" + }, + "target": { + "cell": "79f84abd-09f2-4289-905d-3b34242ad5b8", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "77d3e225-35bc-4501-8637-475b16489a8e", + "zIndex": -1, + "source": { + "cell": "79f84abd-09f2-4289-905d-3b34242ad5b8", + "port": "out" + }, + "target": { + "cell": "6bd4b1bd-e9ab-490f-b742-6ef287eedf63", + "port": "in" + } + }, + { + "position": { + "x": -10, + "y": -80 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "a2437095-7c2f-4ca6-8273-9df4f2555338", + "data": { + "_id": "65e57005fb3fb874f535ff7a", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 1 + }, + { + "position": { + "x": -10, + "y": 20 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "caf7e809-74ba-418f-9f6a-b3d512364649", + "data": { + "_id": "65e57005fb3fb874f535ff7a", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 2 + }, + { + "position": { + "x": 112, + "y": 292 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "d6db9931-ac7a-4123-9a81-e611e4747ae7", + "data": { + "_id": "65e57005fb3fb874f535ff78", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 3, + "parent": "79f84abd-09f2-4289-905d-3b34242ad5b8" + }, + { + "position": { + "x": 112, + "y": 212 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "8d7d3c5c-c1d1-494a-ba53-57d929d8f8ac", + "data": { + "_id": "65e57005fb3fb874f535ff77", + "label": { + "zh_CN": "BatchNorm", + "en_US": "BatchNorm" + }, + "id": "BatchNorm", + "properties": [ + { + "id": "num_channels", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "num_channels" + }, + "data": 0 + }, + { + "id": "is_test", + "type": "boolean", + "label": { + "zh_CN": "是否在测试阶段", + "en_US": "Is test" + }, + "default": false, + "data": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001, + "data": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + }, + "data": 0.9 + }, + { + "id": "param_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "param attr" + }, + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_layout", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + }, + "data": "NCL" + }, + { + "id": "in_place", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "batch_norm是否可以服用输入内存", + "en_US": "Can batch norm take input memory" + }, + "data": false + }, + { + "id": "do_model_average_for_mean_and_var", + "type": "boolean", + "default": "false", + "label": { + "zh_CN": "是否为 mean 和 variance 做模型均值", + "en_US": "Are we doing model mean for mean and variance" + }, + "data": "false" + }, + { + "id": "use_global_stats", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用全局均值和方差", + "en_US": "Is global mean and variance used" + }, + "data": false + }, + { + "id": "trainable_statistics", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "eval 模式下是否计算 mean 均值和 var 方差", + "en_US": "Is the mean and variance of var calculated in eval mode" + }, + "data": false + }, + { + "id": "moving_mean_name", + "type": "string", + "label": { + "zh_CN": "moving_mean 的名称", + "en_US": "name of moving_mean" + }, + "data": 0 + }, + { + "id": "moving_variance_name", + "type": "string", + "label": { + "zh_CN": "moving_var 的名称", + "en_US": "name of moving_var" + }, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 4, + "parent": "79f84abd-09f2-4289-905d-3b34242ad5b8" + }, + { + "position": { + "x": 10, + "y": 430 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "6bd4b1bd-e9ab-490f-b742-6ef287eedf63", + "data": { + "_id": "65e57005fb3fb874f535ff7a", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true, + "data": "zeros" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 5 + } + ], + "edges": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "5c36a959-6118-408f-bf9a-11455f9e0509", + "zIndex": -1, + "source": { + "cell": "a2437095-7c2f-4ca6-8273-9df4f2555338", + "port": "out" + }, + "target": { + "cell": "caf7e809-74ba-418f-9f6a-b3d512364649", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "9886445a-7c34-455a-b2be-93ce05d5501b", + "zIndex": -1, + "source": { + "cell": "8d7d3c5c-c1d1-494a-ba53-57d929d8f8ac", + "port": "out" + }, + "target": { + "cell": "d6db9931-ac7a-4123-9a81-e611e4747ae7", + "port": "in" + }, + "parent": "79f84abd-09f2-4289-905d-3b34242ad5b8" + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "8ea6b4b9-efa2-4e0f-8bae-8695a0b0c7b6", + "zIndex": -1, + "source": { + "cell": "caf7e809-74ba-418f-9f6a-b3d512364649", + "port": "out" + }, + "target": { + "cell": "79f84abd-09f2-4289-905d-3b34242ad5b8", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "77d3e225-35bc-4501-8637-475b16489a8e", + "zIndex": -1, + "source": { + "cell": "79f84abd-09f2-4289-905d-3b34242ad5b8", + "port": "out" + }, + "target": { + "cell": "6bd4b1bd-e9ab-490f-b742-6ef287eedf63", + "port": "in" + } + } + ] + } +} \ No newline at end of file diff --git a/dl-flow-backend/package.json b/dl-flow-backend/package.json new file mode 100644 index 0000000..bd6a6d1 --- /dev/null +++ b/dl-flow-backend/package.json @@ -0,0 +1,109 @@ +{ + "name": "dl-flow-backend", + "version": "0.0.7", + "description": "", + "author": "", + "private": true, + "license": "MIT", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"libs/**/*.ts\"", + "start": "cross-env DB_URL=mongodb://127.0.0.1:27017/dl-flow?directConnection=true nest start --watch", + "start:dev": "cross-env NODE_ENV=DEV DB_URL=mongodb://127.0.0.1:27017/?directConnection=true nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest --clear-cache && jest --force-exit --detectOpenHandles", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/jest/bin/jest.js --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@liaoliaots/nestjs-redis": "^9.0.5", + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "@nestjs/jwt": "^10.2.0", + "@nestjs/mapped-types": "*", + "@nestjs/mongoose": "^10.0.2", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/platform-socket.io": "^10.3.2", + "@nestjs/websockets": "^10.3.2", + "bcryptjs": "^2.4.3", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "compressing": "^1.10.0", + "ioredis": "^5.3.2", + "mongoose": "^8.1.1", + "ms": "^2.1.3", + "ramda": "^0.29.1", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0", + "socket.io": "^4.7.4" + }, + "devDependencies": { + "@antv/x6": "^2.18.1", + "@golevelup/ts-jest": "^0.4.0", + "@nestjs/cli": "^9.0.0", + "@nestjs/schematics": "^9.0.0", + "@nestjs/testing": "^9.0.0", + "@types/bcryptjs": "^2.4.6", + "@types/express": "^4.17.21", + "@types/jest": "29.5.1", + "@types/ms": "^0.7.34", + "@types/node": "18.16.12", + "@types/ramda": "^0.29.10", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "cross-env": "^7.0.3", + "dotenv": "^16.4.5", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "express": "^4.18.2", + "jest": "29.5.0", + "mongodb-memory-server": "^9.1.6", + "prettier": "^2.3.2", + "redis-memory-server": "^0.10.0", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "29.1.0", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "4.2.0", + "typescript": "^5.0.0", + "webpack": "^5.90.1" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": ".", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "./coverage", + "globals": { + "__TEST__": true, + "__DEV__": false + }, + "roots": [ + "/src/", + "/libs/" + ], + "moduleNameMapper": { + "^@app/database(|/.*)$": "/libs/database/src/$1", + "^@app/shared(|/.*)$": "/libs/shared/src/$1", + "^@app/redis(|/.*)$": "/libs/redis/src/$1" + }, + "verbose": true, + "maxWorkers": 1 + } +} \ No newline at end of file diff --git a/dl-flow-backend/proof/函数组合的可交换性讨论.pdf b/dl-flow-backend/proof/函数组合的可交换性讨论.pdf new file mode 100644 index 0000000..92f2f8f Binary files /dev/null and b/dl-flow-backend/proof/函数组合的可交换性讨论.pdf differ diff --git a/dl-flow-backend/src/app.module.ts b/dl-flow-backend/src/app.module.ts new file mode 100644 index 0000000..30016d4 --- /dev/null +++ b/dl-flow-backend/src/app.module.ts @@ -0,0 +1,170 @@ +import { Logger, Module, OnModuleInit } from '@nestjs/common'; +import { LayerModule } from './layer/layer.module'; +import { DbModule } from '@app/database'; +import { MaterialModule } from './material/material.module'; +import { CodeGenerateModule } from './code-generate/code-generate.module'; +import { + existsSync, + mkdirSync, + readdirSync, + readFileSync, + writeFileSync, +} from 'fs'; +import { basename, join } from 'path'; +import { UserModule } from './user/user.module'; +import { JwtModule } from '@nestjs/jwt'; +import { InjectModel, MongooseModule } from '@nestjs/mongoose'; +import { Material, MaterialSchema } from './material/material.schema'; +import { Model } from 'mongoose'; +import { RedisModule } from '@app/redis'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Redis } from 'ioredis'; +import { ProjectModule } from './project/project.module'; +import { User, UserSchema } from './user/user.schema'; +import { Project, ProjectSchema } from './project/entities/project.entity'; +import { isEmpty } from 'ramda'; +import { UserService } from './user/user.service'; +import { ProjectService } from './project/project.service'; + +@Module({ + imports: [ + DbModule, + LayerModule, + MaterialModule, + CodeGenerateModule, + UserModule, + JwtModule.register({ + global: true, + publicKey: readFileSync( + join(process.cwd(), process.env.JWT_PUB_KEY ?? './keys/pub.key'), + ), + privateKey: readFileSync( + join(process.cwd(), process.env.JWT_PRI_KEY ?? './keys/pri.key'), + ), + signOptions: { + algorithm: process.env.JWT_SIGN_ALGORITHM ?? 'RS256', + expiresIn: process.env.JWT_EXPIRE_IN ?? '1 day', + }, + }), + MongooseModule.forFeature([ + { + name: Material.name, + schema: MaterialSchema, + }, + { + name: User.name, + schema: UserSchema, + }, + { + name: Project.name, + schema: ProjectSchema, + }, + ]), + RedisModule, + ProjectModule, + ], + providers: [UserService, ProjectService], +}) +export class AppModule implements OnModuleInit { + private readonly Logger: Logger = new Logger('App'); + constructor( + @InjectRedis() + private readonly redis: Redis, + @InjectModel(Material.name) + private readonly MaterialModel: Model, + @InjectModel(User.name) + private readonly UserModel: Model, + @InjectModel(Project.name) + private readonly ProjectModel: Model, + private readonly userService: UserService, + private readonly projectService: ProjectService, + ) {} + async onModuleInit() { + const root = process.cwd(); + const publicPath = join(root, 'public'); + const lock = join(root, 'data', 'install.lock'); + const bundle = join(root, 'data', 'bundle.json'); + const examplePath = join(root, 'examples'); + if (existsSync(lock) && !__DEV__) { + this.Logger.log('Lock file exists'); + return; + } + if (!existsSync(bundle)) { + this.Logger.warn('bundle.json not exists'); + } + if (existsSync(bundle)) { + this.Logger.log('bundle.json exists'); + const { data } = JSON.parse(readFileSync(bundle).toString()); + const types = data.types; + const materials = data.materials; + if (types) { + this.Logger.log('Insert types'); + try { + for (const [key, value] of Object.entries(types)) { + await this.redis.hset('types', { [key]: JSON.stringify(value) }); + } + } catch (err) { + const e = err as Error; + this.Logger.error('Insert types fail', e.stack); + process.exit(-1); + } + } + if (materials) { + this.Logger.log('Insert materials'); + try { + await this.MaterialModel.insertMany(materials); + } catch (err) { + const e = err as Error; + this.Logger.error('Insert Materials fail', e.stack); + process.exit(-1); + } + } + } + if (!existsSync(publicPath)) { + mkdirSync(publicPath); + } + const adminUser = await this.UserModel.findOne({ + email: 'admin@no-reply.com', + }); + let profile; + let token; + if (!adminUser) { + this.Logger.warn('Not find admin user'); + profile = await this.userService.register({ + email: 'admin@no-reply.com', + nick: 'Admin', + password: 'admin', + }); + token = ( + await this.userService.login({ + email: 'admin@no-reply.com', + password: 'admin', + }) + ).jwt; + this.Logger.log('Create Admin user success'); + } + if (existsSync(examplePath)) { + const examples = readdirSync(examplePath).map((fileName) => { + return [basename(fileName, '.json'), join(examplePath, fileName)]; + }); + + for (const [exampleName, examplePath] of examples) { + this.Logger.log(`Insert ${exampleName} example`); + const content = JSON.parse(readFileSync(examplePath).toString()); + if (!isEmpty(content['data']) && !isEmpty(content['graphData'])) { + const { projectId } = await this.projectService.create( + { name: exampleName }, + token, + ); + await this.projectService.updateProject(projectId, { + ...content, + }); + this.Logger.log(`Insert ${exampleName} success`); + } else { + this.Logger.warn(`Example should contain data and graphdata`); + } + } + } + writeFileSync(lock, '1'); + } +} diff --git a/dl-flow-backend/src/auth-guard/auth-guard.guard.ts b/dl-flow-backend/src/auth-guard/auth-guard.guard.ts new file mode 100644 index 0000000..bef67af --- /dev/null +++ b/dl-flow-backend/src/auth-guard/auth-guard.guard.ts @@ -0,0 +1,37 @@ +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { Request } from 'express'; +import { Redis } from 'ioredis'; + +@Injectable() +export class AuthGuard implements CanActivate { + constructor( + private jwt: JwtService, + @InjectRedis() + private redis: Redis, + ) {} + async canActivate(context: ExecutionContext): Promise { + const req = context.switchToHttp().getRequest(); + const token = this.extractTokenFromHeader(req); + try { + this.jwt.verify(token); + } catch { + throw new UnauthorizedException(); + } + // 如果redis中不存在token, 那么也提示未登陆错误 + if (!Boolean(await this.redis.exists(token))) { + throw new UnauthorizedException(); + } + return true; + } + private extractTokenFromHeader(request: Request): string | undefined { + const [type, token] = request.headers.authorization?.split(' ') ?? []; + return type === 'Bearer' ? token : undefined; + } +} diff --git a/dl-flow-backend/src/code-generate/README.md b/dl-flow-backend/src/code-generate/README.md new file mode 100644 index 0000000..a55c001 --- /dev/null +++ b/dl-flow-backend/src/code-generate/README.md @@ -0,0 +1,9 @@ +# code generate + +## 流程图 + +![](../../../public/3bb36ea8-b6cc-48ae-b227-1118f3b0a4c6.png) + +## 附件 + +[函数组合的可交换性讨论](../../proof/函数组合的可交换性讨论.pdf) \ No newline at end of file diff --git a/dl-flow-backend/src/code-generate/__tests__/ast.spec.ts b/dl-flow-backend/src/code-generate/__tests__/ast.spec.ts new file mode 100644 index 0000000..f5d7aca --- /dev/null +++ b/dl-flow-backend/src/code-generate/__tests__/ast.spec.ts @@ -0,0 +1,409 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AST, VarDecl } from '../ast.service'; +import { Material } from '../../material/material.schema'; +import { Cell, Edge } from '@antv/x6'; +import { Layer } from '../code-generate.schema'; +import { StandardizationNodes } from '../code-generate.service'; + +describe('AST', () => { + let service: AST; + const layer = { + code: ` +class Layer: + def __init__(self,x): + pass +`, + clazz: 'Layer', + id: 'layer-1', + label: { + zh_CN: '', + en_US: '', + }, + properties: [], + del: false, + mode: 'layer', + }; + const buildNode = (total: number, startId = 0) => { + const arr: { + id: string; + shape: string; + position: { + x: number; + y: number; + }; + size: { + width: number; + height: number; + }; + zIndex: number; + data: Material; + }[] = []; + for (let i = 1; i <= total; i++) { + const obj = { + id: `node${i + startId}`, + shape: 'dag-node', + position: { x: 0, y: 0 }, + size: { width: 0, height: 0 }, + attrs: {}, + zIndex: 0, + data: { + mode: 'nn', + id: 'Conv1d', + properties: [], + } as any, + }; + arr.push(obj); + } + return arr; + }; + const buildLayer = (total: number): any[] => { + const arr = []; + for (let i = 1; i <= total; i++) { + arr.push({ + id: `layer-${i}`, + shape: 'dag-node', + label: { + zh_CN: '', + en_US: '', + }, + data: { + code: ` +class Layer${i}: + def __init__(self,x): + pass + `, + clazz: `Layer${i}`, + properties: [{ id: 'x', data: 1 }], + del: false, + mode: 'layer', + }, + }); + } + return arr; + }; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [AST], + }).compile(); + service = module.get(AST); + }); + it.skip('should be defined', () => { + expect(service).toBeDefined(); + }); + it('standardization', () => { + expect(service.standardization('123', 'string')).toBe(`'123'`); + expect(service.standardization('123', 'number')).toBe(`123`); + expect(service.standardization('[0,0]', 'array')).toBe('[0,0]'); + expect(service.standardization('123', 'boolean')).toBe('true'); + expect(service.standardization('true', 'boolean')).toBe('true'); + expect(service.standardization('false', 'boolean')).toBe('false'); + }); + describe('buildNN', () => { + it('non properties', () => { + const node = buildNode(1)[0]; + expect(service.buildNN(node.data, node.id).name).toBe(`node${node.id}`); + expect(service.buildNN(node.data, node.id).codeGen()).toBe( + `node${node.id} = paddle.nn.${node.data.id}()`, + ); + }); + it('has properties', () => { + const node = buildNode(1)[0]; + node.data.properties.push( + { + id: 'in_channel', + data: 256, + label: { + zh_CN: '', + en_US: '', + }, + type: 'number', + default: '', + enums: [], + }, + { + id: 'out_channel', + data: 128, + label: { + zh_CN: '', + en_US: '', + }, + type: 'number', + default: '', + enums: [], + }, + { + id: 'weight_attr', + data: { + name: 'weight', + learning_rate: 1e-5, + }, + label: { + zh_CN: '', + en_US: '', + }, + type: 'ParamAttr', + default: '', + enums: [], + }, + { + id: 'test', + type: 'list', + data: [1, '2', true, {}], + label: { + zh_CN: '', + en_US: '', + }, + default: '', + enums: [], + }, + ); + expect(service.buildNN(node.data, node.id).name).toBe(`node${node.id}`); + expect(service.buildNN(node.data, node.id).codeGen()).toBe( + `node${node.id} = paddle.nn.${node.data.id}(in_channel = 256,out_channel = 128,weight_attr = ParamAttr(name = 'weight',learning_rate = 0.00001),test = [1,'2',true,{}])`, + ); + }); + }); + describe('group', () => { + it('non nest', () => { + const group = { + id: 'group-1', + shape: 'group-node', + position: { + x: 0, + y: 0, + }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + data: new Material(), + children: ['node-1', 'node-2'], + }; + const ast = service.buildGroup(group as any, { + 'group-1': group as any, + 'node-1': { + id: 'node-1', + shape: 'dag-node', + data: { + id: 'Conv1D', + mode: 'nn', + properties: [], + } as Material, + position: { x: 0, y: 0 }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + }, + 'node-2': { + id: 'node-2', + shape: 'dag-node', + data: { + id: 'Conv1D', + mode: 'nn', + properties: [], + } as Material, + position: { x: 0, y: 0 }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + }, + }); + // expect(ast.children.length).toBe(3); + // expect(ast.children[0]).toBeInstanceOf(VarDecl); + // expect(ast.children[1]).toBeInstanceOf(VarDecl); + // expect(ast.children[2]).toBeInstanceOf(VarDecl); + expect(ast.children[0].codeGen()).toContain('group1'); + }); + it('has nest', () => { + const nodes = { + 'node-4': buildNode(1, 3)[0], + 'node-11': buildNode(1, 10)[0], + 'group-3': { + id: 'group-3', + shape: 'group', + children: ['node-11'] as any, + data: new Material(), + position: { x: 0, y: 0 }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + }, + 'group-2': { + id: 'group-2', + shape: 'group', + data: new Material(), + position: { x: 0, y: 0 }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + children: ['node-4', 'group-3'] as any, + }, + 'node-2': { + id: 'node-2', + shape: 'dag-node', + data: { + id: 'Conv1D', + mode: 'nn', + properties: [], + } as Material, + position: { x: 0, y: 0 }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + }, + 'node-1': { + id: 'node-1', + shape: 'dag-node', + data: { + id: 'Conv1D', + mode: 'nn', + properties: [], + } as Material, + position: { x: 0, y: 0 }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + }, + }; + const group = { + id: 'group-1', + shape: 'group-node', + position: { + x: 0, + y: 0, + }, + size: { + width: 0, + height: 0, + }, + attrs: undefined, + zIndex: 0, + data: new Material(), + children: ['node-1', 'node-2', 'group-2'], + }; + const ast = service.buildGroup(group as any, nodes as any); + expect(ast.codeGen()).toBe(`group_group3 = paddle.concat(x=[nodenode11]) +group_group2 = paddle.concat(x=[group_group3,nodenode4]) +group_group1 = paddle.concat(x=[group_group2,nodenode2,nodenode1])`); + }); + }); + it('build', () => { + const node: StandardizationNodes = { + 'node-1': { + id: 'node-1', + shape: 'node', + position: { + x: 0, + y: 0, + }, + size: { width: 0, height: 0 }, + attrs: {}, + zIndex: 0, + data: { + mode: 'nn', + id: 'Conv1D', + properties: [], + } as Material, + }, + 'node-2': { + id: 'node-2', + shape: 'node', + position: { + x: 0, + y: 0, + }, + size: { width: 0, height: 0 }, + attrs: {}, + zIndex: 0, + data: { + mode: 'nn', + id: 'Conv1D', + properties: [], + } as Material, + }, + layer: { + ...(buildLayer(1)[0] as Layer), + } as any, + 'node-3': { + id: 'node-3', + shape: 'node', + position: { + x: 0, + y: 0, + }, + size: { width: 0, height: 0 }, + attrs: {}, + zIndex: 0, + data: { + mode: 'nn', + id: 'Conv1D', + properties: [], + } as Material, + }, + 'layer-2': { + ...buildLayer(1)[0], + }, + group: { + id: 'group', + shape: 'group', + position: { + x: 0, + y: 0, + }, + size: { width: 0, height: 0 }, + attrs: {}, + zIndex: 0, + children: ['node-3', 'layer-2'] as any, + data: new Material(), + }, + }; + const ast = service.build( + [ + node['node-1'], + node['node-2'], + node['layer'], + node['node-3'], + node['group'], + ], + node, + ); + expect(ast.codeGen().replace(/\n| /gim, '')).toEqual( + `true = True + false = False + nodenode1 = paddle.nn.Conv1D() + nodenode2 = paddle.nn.Conv1D() + + class Layer1: + def __init__(self,x): + pass + + layer1 = Layer1(x=1) + nodenode3 = paddle.nn.Conv1D() + group_group = paddle.concat(x=[layer1,nodenode3]) + model=paddle.nn.Sequential(nodenode1,nodenode2,group_group)`.replace( + /\n| /gim, + '', + ), + ); + }); +}); diff --git a/dl-flow-backend/src/code-generate/__tests__/code-generate.spec.ts b/dl-flow-backend/src/code-generate/__tests__/code-generate.spec.ts new file mode 100644 index 0000000..5dfd17a --- /dev/null +++ b/dl-flow-backend/src/code-generate/__tests__/code-generate.spec.ts @@ -0,0 +1,46 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CodeGenerateService } from '../code-generate.service'; +import { Cell, Edge } from '../code-generate.schema'; +import { readFileSync } from 'fs'; + +const groupNestTestCase = JSON.parse( + readFileSync('./group-nest-test-case.json').toString(), +); + +describe('code generate', () => { + let service: CodeGenerateService; + beforeEach(async () => { + const moudle: TestingModule = await Test.createTestingModule({ + providers: [CodeGenerateService], + }).compile(); + service = moudle.get(CodeGenerateService); + }); + it('standardizationEdge', () => { + expect( + service.standardizationEdge( + groupNestTestCase.payload.edges as unknown as Edge[], + service.standardizationNode(groupNestTestCase.payload.cells), + ), + ).toBeDefined(); + console.log( + service.standardizationEdge( + groupNestTestCase.payload.edges as unknown as Edge[], + service.standardizationNode(groupNestTestCase.payload.cells), + ), + ); + }); + it('sequencingNode', () => { + const nodes = service.standardizationNode( + service.extract( + groupNestTestCase.payload.cells as unknown as Cell[], + (cell) => cell.shape.includes('node'), + ), + ); + const edges = service.standardizationEdge( + groupNestTestCase.payload.edges as unknown as Edge[], + service.standardizationNode(groupNestTestCase.payload.cells), + ); + const { start, end } = groupNestTestCase.meta; + expect(service.sequencingNode(nodes, edges, start, end)).toBeDefined(); + }); +}); diff --git a/dl-flow-backend/src/code-generate/ast.service.ts b/dl-flow-backend/src/code-generate/ast.service.ts new file mode 100644 index 0000000..a0565c4 --- /dev/null +++ b/dl-flow-backend/src/code-generate/ast.service.ts @@ -0,0 +1,386 @@ +import { Injectable } from '@nestjs/common'; +import { Material } from '../material/material.schema'; +import { Layer } from '../layer/layer.schema'; +import { Cell } from './code-generate.schema'; +import { Exception, StandardizationNodes } from './code-generate.service'; +import { randomUUID } from 'crypto'; + +@Injectable() +export class AST { + /** + * # Reference material + * @see {@link https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl03.html|Kaleidoscope} + * @see {@link https://github.com/xkbeyer/liquid|liquid} + */ + build(cells: Cell[], standardizationNodes: StandardizationNodes) { + const ast: IAST = { + type: 'root', + children: [ + // I HATE PYTHON + new VarDecl('true', new Identifier('True')), + new VarDecl('false', new Identifier('False')), + ], + codeGen: () => { + // 每个 AstItem 必须存在一个 codeGen 函数,只要根节点调用第一层节点的codeGen + // 并且在开发时, 确保其他节点的codeGen函数中也遍历了子节点且调用codeGen就可以完成整个语法树的代码生成 + // 不过考虑到说动频接换行符太繁琐, 这里包装成了数组, 最后join就可以 + return ast.children.map((child) => child.codeGen()).join('\n'); + }, + }; + for (const cell of cells) { + const data = cell.data as Material | Layer; + let item; + if (this.isGroup(cell)) { + item = this.buildGroup(cell, standardizationNodes); + ast.children.push(item); + continue; + } + if (this.isLayer(data)) { + item = this.buildLayer(data); + ast.children.push(item); + const callee = new Identifier(data.clazz); + const clazzInstance = new CallExpression( + callee, + data.properties.map((v) => `${v.id}=${v.data}`), + ); + const instance = new VarDecl(cell.id.replace('-', ''), clazzInstance); + ast.children.push(instance); + continue; + } + if (this.isNN(data)) { + item = this.buildNN(data, cell.id); + ast.children.push(item); + continue; + } + } + ast.children.push(new VarDecl('model', this.buildSequential(ast))); + return ast; + } + /** + * Eg. + * abcd -> 'abcd' + */ + standardization(val: unknown, type?: string): string { + if (val === 'true' || val === 'false') { + return val; + } + if (type === 'list') { + return `[${(val as any[]).map((v) => + typeof v !== 'string' ? JSON.stringify(v) : `'${v}'`, + )}]`; + } + if (type === 'boolean') { + return `${Boolean(val)}`; + } + if (type === 'string') { + return `'${val}'`; + } + return `${val}`; + } + standardizationParamAttr(key: string, val: string) { + switch (key) { + case 'name': + return this.standardization( + val === '' ? randomUUID().replace(/\-/gim, '') : val, + 'string', + ); + case 'learning_rate': + return this.standardization(val, 'number'); + case 'trainable': + return this.standardization(val, 'boolean'); + case 'do_model_average': + return this.standardization(val, 'boolean'); + case 'need_clip': + return this.standardization(val, 'boolean'); + default: + return val; + } + } + buildNN(nn: Material, cellId: string) { + /* + * 构建 arguments, 是一个string数组, 这样下一步在 new CallExpress或者 new VarDecl时就不需要再次递归调用`codeGen`了 + */ + const args = nn.properties + .map((v) => { + const id = v.id; + if (typeof v.data === 'object' && !Array.isArray(v.data)) { + const args: string[] = []; + for (const key of Object.keys(v.data)) { + if (v.data[key] !== undefined) { + const val = + v.type === 'ParamAttr' + ? this.standardizationParamAttr(key, v.data[key]) + : this.standardization( + v.data[key] ?? v.default ?? 'None', + v.type, + ); + args.push(new VarDecl(key, new Identifier(val)).codeGen()); + } + } + const callExpression = new CallExpression( + new Identifier(v.type), + args, + ); + const varDecl = new VarDecl(id, callExpression); + return varDecl.codeGen(); + } + if (v.data) { + return new VarDecl( + id, + // 标准化参数 + // 比如字符串 abcd 会被标准化为 'abcd' + new Identifier(this.standardization(v.data, v.type)), + ).codeGen(); + } + }) + .filter((v) => v !== undefined); + const callee = new Identifier(`paddle.nn.${nn.id}`); + const fnCall = new CallExpression(callee, args); + const varDecl = new VarDecl(`node${cellId.replace(/-/gim, '')}`, fnCall); + return varDecl; + } + extractGroup(group: Cell, nodeTable: StandardizationNodes) { + const stack: Cell[] = []; + if (this.isGroup(group)) { + stack.push(group); + } + for (const child of (group.children as unknown as string[]) ?? []) { + // 考虑group嵌套问题 + if (this.isGroup(nodeTable[child])) { + stack.push(...this.extractGroup(nodeTable[child], nodeTable)); + } + } + return stack; + } + isChild(group: Cell, child: Cell) { + return (group.children as unknown as string[]).includes(child.id); + } + /** + * @description + * + * Layer本质是一组代码, 直接用ClazzDef一下就好. + */ + buildLayer(layer: Layer) { + const clazzDef = new ClazzDef(layer.code); + return clazzDef; + } + buildGroup(group: Cell, standardizationNodes: StandardizationNodes) { + const ast = new GroupAst(); + const stack: [Cell, 'start' | 'node' | 'end'][] = []; + const groups = this.extractGroup(group, standardizationNodes); + for (const g of groups) { + stack.push([g, 'start']); + for (const child of (g.children as unknown as string[]) ?? []) { + if (standardizationNodes[child]) { + stack.push([standardizationNodes[child], 'node']); + } + } + stack.push([g, 'end']); + } + let activeGroup: Cell | null = null; + /** + * 如果不做处理可能会出现 + * node_1 = ... + * node_2 = ... + * group_1 = paddle.concat(node_1,node_2) + * node_3 = ... + * group_2 = paddle.concat(node_1,node_2,node_3, group_1) + * 本质与LC. 20是同一种思路 + * @see https://leetcode.cn/problems/valid-parentheses/description/ + */ + while (stack.length) { + const [cell, type] = stack.pop(); + const children = []; + if (type === 'end') { + activeGroup = cell; + } + if (type === 'node') { + if (this.isGroup(cell)) { + children.push(`group_${cell.id.replace(/-/gim, '')}`); + } else { + if (this.isNN(cell.data)) { + children.push(`node${cell.id.replace(/-/gim, '')}`); + } + if (this.isLayer(cell.data)) { + children.push(`${cell.id.replace('-', '')}`); + } + } + while (true) { + const [cell, type] = stack.pop(); + if (type === 'start') { + break; + } + if (this.isGroup(cell)) { + children.push(`group_${cell.id.replace(/-/gim, '')}`); + } else { + if (this.isNN(cell.data)) { + children.push(`node${cell.id.replace(/-/gim, '')}`); + } + if (this.isLayer(cell.data)) { + children.push(`${cell.id.replace('-', '')}`); + } + } + } + if (!activeGroup) { + throw new Exception('Schema错误, 请检查Schema格式'); + } + const callee = new Identifier('paddle.concat'); + /** + * @see https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/concat_cn.html + */ + const call = new CallExpression(callee, [ + ['x=[', children.join(','), ']'].join(''), + ]); + const concatVar = new VarDecl( + `group_${activeGroup.id}`.replace(/-/gim, ''), + call, + ); + ast.children.push(concatVar); + ast.childId.push(...children); + } + } + return ast; + } + buildSequential(ast: IAST) { + const stack = [ + ...ast.children + .map((child) => { + // 是变量直接拿到变量名 + if (child instanceof VarDecl) { + return child.name; + } + // 这里不过是为了方便开发时区分, 将Group做了一个新的AST root, 被称作GroupAst + // + if (child instanceof GroupAst) { + return child.children.map((child) => + child instanceof VarDecl ? child.name : null, + ); + } + return null; + }) + .flat() + .filter( + (child) => child !== null && child !== 'true' && child !== 'false', + ), + ]; + const groups = ast.children + .map((child) => (child instanceof GroupAst ? child : null)) + .filter((child) => child !== null); + const childrenId = groups + .map((group) => group.childId) + .reduce((pre, cur) => [...pre, ...cur], []); + return new CallExpression( + new Identifier('paddle.nn.Sequential'), + stack.filter((item) => !childrenId.includes(item)), + ); + } + + isGroup(cell: Cell) { + return cell?.shape && cell.shape.includes('group'); + } + isNN(data: Material | Layer): data is Material { + return data.mode === 'nn'; + } + isLayer(data: Material | Layer): data is Layer { + return data.mode === 'layer'; + } +} + +// base type +export class Node {} + +export class VarDecl implements IVarDecl, Node { + public name: string; + public val: ASTItem; + constructor(name: string, val: ASTItem) { + this.name = name; + this.val = val; + } + codeGen() { + return `${this.name} = ${this.val.codeGen()}`.replace('\t', ''); + } +} + +export class Identifier implements IIdentifier, Node { + name: string; + constructor(name: string) { + this.name = name; + } + codeGen() { + return `${this.name}`; + } +} + +export class CallExpression implements ICallExpression, Node { + callee: IIdentifier; + args: any[]; + constructor(callee: IIdentifier, args: any[]) { + this.callee = callee; + this.args = args; + } + codeGen() { + return `${this.callee.codeGen()}(${this.args.join(',')})`; + } +} + +export class ClazzDef implements IClazzDefine { + code: string; + constructor(code: string) { + this.code = code; + } + codeGen() { + return `${this.code}`; + } +} + +export class Statement implements IStmt, Node { + children: Node[] = []; +} + +export class GroupAst implements IGroupAst { + type = 'root' as const; + children: ASTItem[] = []; + childId: string[] = []; + codeGen() { + return this.children.map((child) => child.codeGen()).join('\n'); + } +} + +type IVarDecl = { + name: string; + val: ASTItem; + codeGen: () => string; +}; +type IIdentifier = { + name: string; + codeGen: () => string; +}; +type ICallExpression = { + callee: IIdentifier; + args: any[]; + codeGen: () => string; +}; +type IClazzDefine = { + code: string; + codeGen: () => string; +}; +type IStmt = { + children: Node[]; +}; + +type ASTItem = + | IVarDecl + | IIdentifier + | ICallExpression + | IClazzDefine + | IGroupAst; + +type IAST = { + type: 'root'; + children: ASTItem[]; + codeGen: () => string; +}; + +interface IGroupAst extends IAST { + childId: string[]; +} diff --git a/dl-flow-backend/src/code-generate/code-generate.controller.ts b/dl-flow-backend/src/code-generate/code-generate.controller.ts new file mode 100644 index 0000000..00bb379 --- /dev/null +++ b/dl-flow-backend/src/code-generate/code-generate.controller.ts @@ -0,0 +1,37 @@ +import { + Controller, + Get, + HttpException, + HttpStatus, + Param, + Res, + StreamableFile, +} from '@nestjs/common'; +import { Response } from 'express'; +import { createReadStream, existsSync } from 'fs'; +import { join } from 'path'; + +@Controller('code-generate') +export class CodeGenerateController { + @Get(':filename') + download( + @Param('filename') fileName: string, + @Res({ passthrough: true }) res: Response, + ): StreamableFile { + if (!fileName) { + throw new HttpException( + 'file name can not be undefined', + HttpStatus.BAD_REQUEST, + ); + } + const filePath = join(process.cwd(), 'public', fileName + '.py'); + if (!existsSync(filePath)) { + throw new HttpException(`${fileName} not found`, HttpStatus.NOT_FOUND); + } + res.set({ + 'Content-Type': 'text/plain', + 'Content-Disposition': `attachment; filename="${fileName}.py"`, + }); + return new StreamableFile(createReadStream(filePath)); + } +} diff --git a/dl-flow-backend/src/code-generate/code-generate.gateway.ts b/dl-flow-backend/src/code-generate/code-generate.gateway.ts new file mode 100644 index 0000000..9e9c069 --- /dev/null +++ b/dl-flow-backend/src/code-generate/code-generate.gateway.ts @@ -0,0 +1,153 @@ +import { + WebSocketGateway, + SubscribeMessage, + MessageBody, + ConnectedSocket, +} from '@nestjs/websockets'; +import { CodeGenerateService, Exception } from './code-generate.service'; +import { Cell, GenerateCodeDto } from './code-generate.schema'; +import { Socket } from 'socket.io'; +import { AST } from './ast.service'; +import { UseFilters, ValidationPipe } from '@nestjs/common'; +import { writeFileSync } from 'fs'; +import { createHash } from 'crypto'; +import { join } from 'path'; +import { cwd } from 'process'; +import { JwtService } from '@nestjs/jwt'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Redis } from 'ioredis'; +import { WsExceptionFilter } from '../ws-exception/ws-exception.filter'; + +export enum State { + err = 'err', + finfish = 'finish', + progress = 'progress', + done = 'done', +} + +@WebSocketGateway(9001, { + cors: { + origin: '*', + }, +}) +export class CodeGenerateGateway { + constructor( + private readonly codeGenerateService: CodeGenerateService, + private readonly ast: AST, + private readonly jwt: JwtService, + @InjectRedis() private readonly redis: Redis, + ) {} + @UseFilters(WsExceptionFilter) + @SubscribeMessage('createCodeGenerate') + async create( + @MessageBody(new ValidationPipe()) schema: GenerateCodeDto, + @ConnectedSocket() client: Socket, + ) { + const token = client.handshake.headers.authorization; + if (!token || !(await this.redis.exists(token))) { + client.emit('unauth', ''); + client.disconnect(); + return; + } + try { + const { + handshake: { + headers: { authorization }, + }, + } = client; + this.jwt.verifyAsync(authorization ?? ''); + } catch { + client.emit('unauth', ''); + client.disconnect(); + return; + } + const { + meta: { start, end }, + payload: { cells: cell, edges }, + } = schema; + if (!cell) { + client.emitWithAck(State.err, '创建结束, 因为没有节点'); + return; + } + if (!cell.length) { + client.emitWithAck(State.finfish, '创建结束, 因为图为空'); + return; + } + try { + client.emitWithAck(State.progress, '检查起始节点'); + this.codeGenerateService.checkStartNodes(cell, start); + client.emitWithAck(State.progress, '检查起始节点通过'); + client.emitWithAck(State.progress, '检查结束节点'); + this.codeGenerateService.checkEndNode(cell, end); + client.emitWithAck(State.progress, '检查结束节点通过'); + } catch (e) { + const { message } = e as Error; + client.emitWithAck(State.err, message); + return; + } + client.emitWithAck(State.progress, '提取节点...'); + const nodes = this.codeGenerateService.extract(cell, (cell: any) => + cell.shape.includes('node'), + ); + client.emitWithAck(State.progress, `节点数量为: ${nodes.length}`); + if (!nodes.length) { + client.emitWithAck(State.finfish, '生成结束'); + return; + } + client.emitWithAck(State.progress, `边数量为: ${edges.length}`); + if (!edges.length) { + client.emitWithAck(State.finfish, `生成结束, 边节点数量为0`); + return; + } + if (!nodes.length) { + client.emitWithAck(State.finfish, '生成结束, 节点数量为0'); + return; + } + client.emitWithAck(State.progress, '标准化节点'); + const standardizationNodes = + this.codeGenerateService.standardizationNode(nodes); + client.emitWithAck(State.progress, '标准化边'); + const standardizationEdges = this.codeGenerateService.standardizationEdge( + edges, + standardizationNodes, + ); + client.emitWithAck(State.progress, '顺序化节点'); + const sequence = this.codeGenerateService.sequencingNode( + standardizationNodes, + standardizationEdges, + end, + start, + ); + client.emitWithAck(State.progress, 'AST构建'); + const ast = this.ast.build(sequence, standardizationNodes); + if (!ast.children) { + // transform success + client.emitWithAck(State.finfish, 'AST转码成功'); + return; + } + client.emitWithAck(State.progress, 'AST转码'); + const code = ast.codeGen(); + client.emitWithAck(State.progress, 'AST转码成功'); + const hash = createHash('sha512').update(code).digest('hex').toString(); + const fileName = `${hash}-${new Date().getTime()}`; + const content = ['import paddle', 'from paddle import *', code].join('\n'); + const publicPath = join(cwd(), 'public'); + writeFileSync(join(publicPath, fileName + '.py'), content); + return client.emitWithAck(State.done, fileName); + } + async handleConnection(@ConnectedSocket() socket: Socket) { + const token = socket.handshake.headers.authorization; + if (!token || !(await this.redis.exists(token))) { + socket.emit('unauth', ''); + socket.disconnect(); + return; + } + try { + this.jwt.verifyAsync(socket.handshake.headers.authorization ?? ''); + } catch { + socket.emit('unauth', ''); + socket.disconnect(); + return; + } + } +} diff --git a/dl-flow-backend/src/code-generate/code-generate.module.ts b/dl-flow-backend/src/code-generate/code-generate.module.ts new file mode 100644 index 0000000..5aabba8 --- /dev/null +++ b/dl-flow-backend/src/code-generate/code-generate.module.ts @@ -0,0 +1,35 @@ +import { Module, OnModuleInit } from '@nestjs/common'; +import { CodeGenerateService } from './code-generate.service'; +import { CodeGenerateGateway } from './code-generate.gateway'; +import { AST } from './ast.service'; +import { CodeGenerateController } from './code-generate.controller'; +import { JwtModule } from '@nestjs/jwt'; +import { join } from 'path'; +import { readFileSync } from 'fs'; + +@Module({ + imports: [ + JwtModule.register({ + global: true, + publicKey: readFileSync( + join(process.cwd(), process.env.JWT_PUB_KEY ?? './keys/pub.key'), + ).toString(), + privateKey: readFileSync( + join(process.cwd(), process.env.JWT_PRI_KEY ?? './keys/pri.key'), + ).toString(), + signOptions: { + algorithm: process.env.JWT_SIGN_ALGORITHM ?? 'RS256', + expiresIn: process.env.JWT_EXPIRE_IN ?? '1 day', + }, + }), + ], + controllers: [CodeGenerateController], + providers: [CodeGenerateGateway, CodeGenerateService, AST], +}) +export class CodeGenerateModule implements OnModuleInit { + onModuleInit() { + console.log( + join(process.cwd(), process.env.JWT_PUB_KEY ?? './keys/pub.key'), + ); + } +} diff --git a/dl-flow-backend/src/code-generate/code-generate.schema.ts b/dl-flow-backend/src/code-generate/code-generate.schema.ts new file mode 100644 index 0000000..1207a17 --- /dev/null +++ b/dl-flow-backend/src/code-generate/code-generate.schema.ts @@ -0,0 +1,112 @@ +import { + IsArray, + IsBoolean, + IsNumber, + IsObject, + IsString, +} from 'class-validator'; +import { Enum, Label, Property as TProperty } from '@app/shared'; +import { Layer as LayerSchema } from '../layer/layer.schema'; + +class Meta { + @IsString() + start: string; + @IsString() + end: string; +} + +class Property implements TProperty { + id: string; + label: Label; + type: string; + default: string | number | null | boolean; + enums: Enum[]; + data: any; +} + +class Material { + @IsObject() + label: Label; + @IsString() + id: string; + @IsString() + desc: string; + @IsBoolean() + nn: boolean; + @IsArray() + properties: Property[]; + @IsString() + mode: string; +} + +export class Layer extends LayerSchema { + @IsString() + id: string; + @IsObject() + lable: Label; + @IsString() + code: string; + @IsString() + clazz: string; + @IsArray() + properties: Property[]; + @IsString() + mode: string; +} + +export class Cell { + @IsString() + id: string; + @IsString() + shape: string; + @IsObject() + position: { + x: number; + y: number; + }; + @IsObject() + size: { + width: number; + height: number; + }; + @IsObject() + attrs: object; + @IsNumber() + zIndex: number; + @IsObject() + data: Material | Layer; + @IsObject() + children?: string[]; +} +export class Edge { + @IsString() + id: string; + @IsString() + shape: string; + @IsObject() + source: { + cell: string; + port: string; + }; + @IsObject() + target: { + cell: string; + port: string; + }; + @IsObject() + attr: object; + @IsNumber() + zIndex: number; + @IsString() + parent: string; +} + +export class GenerateCodeDto { + @IsObject() + meta: Meta; + @IsObject() + payload: { + cells: (Cell | Edge)[]; + edges: Edge[]; + }; +} diff --git a/dl-flow-backend/src/code-generate/code-generate.service.ts b/dl-flow-backend/src/code-generate/code-generate.service.ts new file mode 100644 index 0000000..d225b94 --- /dev/null +++ b/dl-flow-backend/src/code-generate/code-generate.service.ts @@ -0,0 +1,128 @@ +import { Injectable } from '@nestjs/common'; +import { Cell, Edge } from './code-generate.schema'; + +export type StandardizationEdges = { + [source: string]: Set; +}; + +export type StandardizationNodes = { + [id: string]: Cell; +}; + +export class Exception extends Error {} + +@Injectable() +export class CodeGenerateService { + checkStartNodes(cells: (Cell | Edge)[], startId: string) { + const nodes = cells.filter(({ id }) => id === startId); + if (!nodes.length) { + throw new Error('找不到起始节点'); + } + } + checkEndNode(cells: (Cell | Edge)[], endId: string) { + const nodes = cells.filter(({ id }) => id === endId); + if (!nodes.length) { + throw new Exception('找不到结束节点'); + } + if (nodes.length > 1) { + throw new Exception('结束节点数量大于1, 请考虑合并或修改网络结构'); + } + } + extract(cell: (Cell | Edge)[], fn: (cell: Cell | Edge) => boolean) { + return cell.filter(fn) as unknown as R[]; + } + standardizationEdge(edges: Edge[], nodes: StandardizationNodes) { + const obj: StandardizationEdges = {}; + for (const edge of edges) { + const { source, target } = edge; + if (obj[target.cell]) { + obj[target.cell].add(source.cell); + } else { + obj[target.cell] = new Set([source.cell]); + } + } + return obj; + } + standardizationNode(cells: Cell[]) { + const obj: StandardizationNodes = {}; + for (const cell of cells) { + obj[cell.id] = cell; + } + return obj; + } + getChildren( + id: string, + edge: StandardizationEdges, + nodes: StandardizationNodes, + ) { + const childIds = edge[id]; + if (!childIds || !childIds.size) { + return []; + } + const children = []; + for (const childId of childIds) { + const child = nodes[childId]; + children.push(child); + } + } + /** + * + * 业务排序,start - end可能不一定是拓补上的有序。例如可能是 + * ``` + * -------- + * v | + * --------- | + * | end | | + * --------- | + * | + * | + * | + * | + * ----------- | + * | start | | + * ----------- | + * | | + * ------- + * ``` + * + * 上图所示, 所以需要对节点进行排序。变为一个栈,即 + * ``` + * | | + * |---------------| + * | start | <----- Stack Top + * |---------------| + * | end | <----- Stack Bottom + * +---------------+ + ``` + */ + sequencingNode( + nodes: StandardizationNodes, + edges: StandardizationEdges, + endId: string, + startId: string, + ) { + debugger; + const endNode = nodes[endId]; + const sequence: Cell[] = [endNode]; + const visitor = (id: string) => { + if (!id || id === startId) { + return; + } + const edgesArr = Array.from(edges[id] ?? []); + for (const edge of edgesArr) { + const connectedNode = nodes[edge]; + if (connectedNode) { + sequence.unshift(connectedNode); + if (connectedNode.shape.includes('group')) { + for (const child of connectedNode.children) { + visitor(child); + } + } + visitor(connectedNode.id); + } + } + }; + visitor(endId); + return sequence; + } +} diff --git a/dl-flow-backend/src/code-generate/codegen.ts b/dl-flow-backend/src/code-generate/codegen.ts new file mode 100644 index 0000000..5832de8 --- /dev/null +++ b/dl-flow-backend/src/code-generate/codegen.ts @@ -0,0 +1,17 @@ +import { Cell, Layer } from './code-generate.schema'; + +export const layerCodeGen = (layer: Layer) => { + const { code, id, clazz, properties } = layer; + const args = properties.map(({ data }) => data); + const call = [clazz, '(', args.join(','), ')'].join(''); + return [id, '=', call].join(''); +}; + +export const nnCodeGen = (cell: Cell) => { + const { + data: { id, properties }, + } = cell; + const args = properties.map(({ data }) => data); + const stack = [id, '(', args, ')']; + return stack.join(''); +}; diff --git a/dl-flow-backend/src/layer/__tests__/layer.service.spec.ts b/dl-flow-backend/src/layer/__tests__/layer.service.spec.ts new file mode 100644 index 0000000..beca168 --- /dev/null +++ b/dl-flow-backend/src/layer/__tests__/layer.service.spec.ts @@ -0,0 +1,59 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { LayerService } from '../layer.service'; +import { MongooseModule } from '@nestjs/mongoose'; +import { Layer, LayerSchema } from '../layer.schema'; +import { DbModule } from '@app/database'; + +describe('LayerService', () => { + let service: LayerService; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DbModule, + MongooseModule.forFeature([{ name: Layer.name, schema: LayerSchema }]), + ], + providers: [LayerService], + }).compile(); + + service = module.get(LayerService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + it('Get All Layer', async () => { + const id = ( + await service.saveLayer({ + label: { + en_US: '', + zh_CN: '', + }, + properties: [], + code: '', + clazz: '', + }) + ).id; + expect(service.findAll()).resolves.toHaveLength(1); + }); + it('Create Layer', () => { + expect(service.saveLayer({} as any)).resolves.not.toThrow(); + }); + it('Delete Layer', async () => { + const id = ( + await service.saveLayer({ + label: { + en_US: '', + zh_CN: '', + }, + properties: [], + code: '', + clazz: '', + }) + ).id; + expect(service.deleteLayer({ id })).resolves.toBeUndefined(); + }); + it('Delete Layer But not exists', () => { + expect(service.deleteLayer({ id: 'not exists record' })).rejects.toThrow(); + }); +}); diff --git a/dl-flow-backend/src/layer/dto/create-layer.dto.ts b/dl-flow-backend/src/layer/dto/create-layer.dto.ts new file mode 100644 index 0000000..3b80eb7 --- /dev/null +++ b/dl-flow-backend/src/layer/dto/create-layer.dto.ts @@ -0,0 +1,19 @@ +import { IsProperties, Label, Property } from '@app/shared'; +import { IsNotEmpty, IsObject, IsOptional, IsString } from 'class-validator'; + +export class CreateLayerDto { + @IsOptional() + @IsString({ message: 'Id should be string' }) + id?: string; + @IsObject() + label: Label; + @IsString() + code: string; + @IsString() + @IsNotEmpty() + clazz: string; + @IsProperties({ + message: 'properties should be array, please check field', + }) + properties: Property[]; +} diff --git a/dl-flow-backend/src/layer/dto/delete-layer.dto.ts b/dl-flow-backend/src/layer/dto/delete-layer.dto.ts new file mode 100644 index 0000000..f5fc0a9 --- /dev/null +++ b/dl-flow-backend/src/layer/dto/delete-layer.dto.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export class DeleteLayer { + @IsString() + id: string; +} diff --git a/dl-flow-backend/src/layer/layer.controller.ts b/dl-flow-backend/src/layer/layer.controller.ts new file mode 100644 index 0000000..f56bfba --- /dev/null +++ b/dl-flow-backend/src/layer/layer.controller.ts @@ -0,0 +1,30 @@ +import { + Controller, + Get, + Post, + Body, + Delete, + Param, + UseGuards, +} from '@nestjs/common'; +import { LayerService } from './layer.service'; +import { CreateLayerDto } from './dto/create-layer.dto'; +import { AuthGuard } from '../auth-guard/auth-guard.guard'; + +@Controller('layer') +@UseGuards(AuthGuard) +export class LayerController { + constructor(private readonly layerService: LayerService) {} + @Get('/') + async getLayerList() { + return await this.layerService.findAll(); + } + @Post('/') + createLayer(@Body() dto: CreateLayerDto) { + return this.layerService.saveLayer(dto); + } + @Delete('/:id') + deleteLayer(@Param('id') id: string) { + return this.layerService.deleteLayer({ id }); + } +} diff --git a/dl-flow-backend/src/layer/layer.module.ts b/dl-flow-backend/src/layer/layer.module.ts new file mode 100644 index 0000000..555bf0b --- /dev/null +++ b/dl-flow-backend/src/layer/layer.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { LayerService } from './layer.service'; +import { LayerController } from './layer.controller'; +import { MongooseModule } from '@nestjs/mongoose'; +import { Layer, LayerSchema } from './layer.schema'; + +@Module({ + imports: [ + MongooseModule.forFeature([{ name: Layer.name, schema: LayerSchema }]), + ], + controllers: [LayerController], + providers: [LayerService], +}) +export class LayerModule {} diff --git a/dl-flow-backend/src/layer/layer.schema.ts b/dl-flow-backend/src/layer/layer.schema.ts new file mode 100644 index 0000000..5af3479 --- /dev/null +++ b/dl-flow-backend/src/layer/layer.schema.ts @@ -0,0 +1,22 @@ +import { Label, Property } from '@app/shared'; +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; + +@Schema({ autoCreate: true }) +export class Layer { + @Prop() + id: string; + @Prop({ type: () => Object }) + label: Label; + @Prop() + code: string; + @Prop() + clazz: string; + @Prop({ type: () => Array }) + properties: Property[]; + @Prop({ type: () => Boolean }) + del: boolean; + @Prop({ type: () => String }) + mode: string; +} + +export const LayerSchema = SchemaFactory.createForClass(Layer); diff --git a/dl-flow-backend/src/layer/layer.service.ts b/dl-flow-backend/src/layer/layer.service.ts new file mode 100644 index 0000000..f7fb09d --- /dev/null +++ b/dl-flow-backend/src/layer/layer.service.ts @@ -0,0 +1,34 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/mongoose'; +import { Layer } from './layer.schema'; +import { Model, Types } from 'mongoose'; +import { CreateLayerDto } from './dto/create-layer.dto'; +import { DeleteLayer } from './dto/delete-layer.dto'; + +@Injectable() +export class LayerService { + constructor(@InjectModel(Layer.name) private LayerModel: Model) {} + async findAll() { + return await this.LayerModel.find({}); + } + async saveLayer(dto: CreateLayerDto) { + const data = { + id: new Types.ObjectId(), + ...dto, + mode: 'layer', + }; + return await this.LayerModel.create(data); + } + async deleteLayer(dto: DeleteLayer) { + const { id } = dto; + const layerExists = await this.isExists(id); + if (!layerExists) { + throw new HttpException('Layer not exists', HttpStatus.NOT_FOUND); + } + await this.LayerModel.deleteOne({ id }); + } + private async isExists(id: string) { + const data = await this.LayerModel.find({ id }); + return data.length >= 1; + } +} diff --git a/dl-flow-backend/src/main.ts b/dl-flow-backend/src/main.ts new file mode 100644 index 0000000..8155ace --- /dev/null +++ b/dl-flow-backend/src/main.ts @@ -0,0 +1,17 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { ValidationPipe } from '@nestjs/common'; +import { config } from 'dotenv'; + +async function bootstrap() { + if (__DEV__) { + config({ + path: '.env', + debug: true, + }); + } + const app = await NestFactory.create(AppModule); + app.useGlobalPipes(new ValidationPipe()); + await app.listen(9000); +} +bootstrap(); diff --git a/dl-flow-backend/src/material/__tests__/material.service.spec.ts b/dl-flow-backend/src/material/__tests__/material.service.spec.ts new file mode 100644 index 0000000..493e9de --- /dev/null +++ b/dl-flow-backend/src/material/__tests__/material.service.spec.ts @@ -0,0 +1,69 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MaterialService } from '../material.service'; +import { Material, MaterialSchema } from '../material.schema'; +import { MongooseModule } from '@nestjs/mongoose'; +import { DbModule } from '@app/database'; +import { RedisModule } from '@app/redis'; + +describe('MaterialService', () => { + let service: MaterialService; + let id = ''; + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DbModule, + MongooseModule.forFeature([ + { + name: Material.name, + schema: MaterialSchema, + }, + ]), + RedisModule, + ], + providers: [MaterialService], + }).compile(); + + service = module.get(MaterialService); + id = ( + await service.createMaterial({ + id: 'TestLayer', + label: { + en_US: 'Test', + zh_CN: '测试', + }, + desc: '', + properties: [], + nn: true, + mode: 'nn', + }) + ).id; + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + it('getAll', () => { + expect(service.findAll()).resolves.toHaveLength(1); + }); + it('delete', () => { + expect(service.DeleteMaterial({ id })).resolves.toBe(true); + }); + it('delete but not exiets', () => { + expect(service.DeleteMaterial({ id: 'not exists' })).rejects.toThrow(); + }); + it('create but exists', () => { + expect( + service.createMaterial({ + id, + label: { + en_US: 'Test', + zh_CN: '测试', + }, + desc: '', + properties: [], + nn: true, + mode: 'nn', + }), + ).rejects.toThrow(); + }); +}); diff --git a/dl-flow-backend/src/material/dto/cretae-material.dto.ts b/dl-flow-backend/src/material/dto/cretae-material.dto.ts new file mode 100644 index 0000000..0d696ab --- /dev/null +++ b/dl-flow-backend/src/material/dto/cretae-material.dto.ts @@ -0,0 +1,24 @@ +import { IsProperties, Label, Property } from '@app/shared'; +import { IsBoolean, IsObject, IsOptional, IsString } from 'class-validator'; + +export class CretaeMaterial { + @IsString() + id: string; + + @IsString() + @IsOptional() + desc: string; + + @IsBoolean() + @IsOptional() + nn: boolean; + + @IsString() + mode: string; + + @IsObject() + label: Label; + + @IsProperties() + properties: Property[]; +} diff --git a/dl-flow-backend/src/material/dto/delete-material.dto.ts b/dl-flow-backend/src/material/dto/delete-material.dto.ts new file mode 100644 index 0000000..5fc0e5a --- /dev/null +++ b/dl-flow-backend/src/material/dto/delete-material.dto.ts @@ -0,0 +1,6 @@ +import { Prop } from '@nestjs/mongoose'; + +export class DeleteMaterial { + @Prop() + id: string; +} diff --git a/dl-flow-backend/src/material/material.controller.ts b/dl-flow-backend/src/material/material.controller.ts new file mode 100644 index 0000000..7f24bcd --- /dev/null +++ b/dl-flow-backend/src/material/material.controller.ts @@ -0,0 +1,15 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { MaterialService } from './material.service'; +import { AuthGuard } from '../auth-guard/auth-guard.guard'; + +@UseGuards(AuthGuard) +@Controller('material') +export class MaterialController { + constructor(private readonly materialService: MaterialService) {} + @Get() + async getAll() { + return { + data: await this.materialService.findAll(), + }; + } +} diff --git a/dl-flow-backend/src/material/material.module.ts b/dl-flow-backend/src/material/material.module.ts new file mode 100644 index 0000000..7a0c8ed --- /dev/null +++ b/dl-flow-backend/src/material/material.module.ts @@ -0,0 +1,21 @@ +import { Module } from '@nestjs/common'; +import { MaterialService } from './material.service'; +import { MaterialController } from './material.controller'; +import { DbModule } from '@app/database'; +import { MongooseModule } from '@nestjs/mongoose'; +import { Material, MaterialSchema } from './material.schema'; + +@Module({ + imports: [ + DbModule, + MongooseModule.forFeature([ + { + name: Material.name, + schema: MaterialSchema, + }, + ]), + ], + controllers: [MaterialController], + providers: [MaterialService], +}) +export class MaterialModule {} diff --git a/dl-flow-backend/src/material/material.schema.ts b/dl-flow-backend/src/material/material.schema.ts new file mode 100644 index 0000000..af597c3 --- /dev/null +++ b/dl-flow-backend/src/material/material.schema.ts @@ -0,0 +1,20 @@ +import { Label, Property } from '@app/shared'; +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; + +@Schema({ autoCreate: true }) +export class Material { + @Prop({ type: () => Object }) + label: Label; + @Prop({ type: () => String }) + id: string; + @Prop({ type: () => String }) + desc: string; + @Prop({ type: () => Boolean }) + nn: boolean; + @Prop({ type: () => Array }) + properties: Property[]; + @Prop({ type: () => String }) + mode: string; +} + +export const MaterialSchema = SchemaFactory.createForClass(Material); diff --git a/dl-flow-backend/src/material/material.service.ts b/dl-flow-backend/src/material/material.service.ts new file mode 100644 index 0000000..6751901 --- /dev/null +++ b/dl-flow-backend/src/material/material.service.ts @@ -0,0 +1,45 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/mongoose'; +import { Material } from './material.schema'; +import { Model } from 'mongoose'; +import { CretaeMaterial } from './dto/cretae-material.dto'; +import { DeleteMaterial } from './dto/delete-material.dto'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Redis } from 'ioredis'; + +@Injectable() +export class MaterialService { + constructor( + @InjectRedis() + private readonly redis: Redis, + @InjectModel(Material.name) + private readonly MaterialMode: Model, + ) {} + async findAll() { + const typesRaw = await this.redis.hgetall('types'); + const types = []; + for (const [key, value] of Object.entries(typesRaw)) { + types.push([key, JSON.parse(value)]); + } + return { + types: Object.fromEntries(types), + materials: await this.MaterialMode.find(), + }; + } + async createMaterial(data: CretaeMaterial) { + const material = await this.MaterialMode.find({ id: data.id }); + if (material.length) { + throw new HttpException(`${data.id} exists`, HttpStatus.CONFLICT); + } + return this.MaterialMode.create({ ...data }); + } + async DeleteMaterial(data: DeleteMaterial) { + const { id } = data; + const material = await this.MaterialMode.find({ id }); + if (!material.length) { + throw new HttpException(`Material ${id} not found`, HttpStatus.NOT_FOUND); + } + await this.MaterialMode.deleteOne({ id }); + return true; + } +} diff --git a/dl-flow-backend/src/project/__tests__/project.service.spec.ts b/dl-flow-backend/src/project/__tests__/project.service.spec.ts new file mode 100644 index 0000000..d01505b --- /dev/null +++ b/dl-flow-backend/src/project/__tests__/project.service.spec.ts @@ -0,0 +1,93 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProjectService } from '../project.service'; +import { DbModule } from '@app/database'; +import { MongooseModule } from '@nestjs/mongoose'; +import { Project, ProjectSchema } from '../entities/project.entity'; +import { RedisModule } from '@app/redis'; +import { UserService } from '../../user/user.service'; +import { User, UserSchema } from '../../user/user.schema'; +import { JwtModule } from '@nestjs/jwt'; +import { configDotenv } from 'dotenv'; + +describe('ProjectService', () => { + let service: ProjectService; + let userService: UserService; + let token = ''; + + beforeAll(async () => { + configDotenv({ + path: '.env', + }); + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DbModule, + MongooseModule.forFeature([ + { + name: Project.name, + schema: ProjectSchema, + }, + { + name: User.name, + schema: UserSchema, + }, + ]), + RedisModule, + JwtModule.register({ + secret: 'test', + signOptions: { + algorithm: 'none', + expiresIn: process.env.JWT_EXPIRE_IN ?? '24h', + }, + }), + ], + providers: [ProjectService, UserService], + }).compile(); + service = module.get(ProjectService); + userService = module.get(UserService); + await userService.register({ + nick: 'test-1', + password: '123456789Sd!', + email: 'test@no-reply.com', + }); + token = await userService.login({ + email: 'test@no-reply.com', + password: '123456789Sd!', + }); + expect(token).toBeDefined(); + expect(token.length).toBeGreaterThan(0); + expect(await service.create({ name: 'test' }, token)).toBeDefined(); + }, 60 * 1000); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + it('create(exists)', () => { + expect(service.create({ name: 'test' }, token)).rejects.toThrow(); + }); + it('getProject', (done) => { + const p1 = service.getProject(0, 10).then(({ projects }) => { + expect(projects).toHaveLength(1); + }); + const p2 = service.getProject(1, 10).then(({ projects }) => { + expect(projects).toHaveLength(0); + }); + const p3 = service.getProject(-1, 10).then(({ projects }) => { + expect(projects).toHaveLength(1); + }); + const p4 = service.getProject(0, 100).then(({ projects }) => { + expect(projects).toHaveLength(1); + }); + Promise.all([p1, p2, p3, p4]).then(() => { + done(); + }); + }); + it('updateProject', () => { + expect(service.updateProject(1, { name: 'test-1' })).resolves.toBeDefined(); + }); + it('delete project', () => { + expect(service.deleteProject(1)).resolves.toBeTruthy(); + }); + it('restore project', () => { + expect(service.restoreProject(1)).resolves.toBeTruthy(); + }); +}); diff --git a/dl-flow-backend/src/project/dto/create-project.dto.ts b/dl-flow-backend/src/project/dto/create-project.dto.ts new file mode 100644 index 0000000..412cd70 --- /dev/null +++ b/dl-flow-backend/src/project/dto/create-project.dto.ts @@ -0,0 +1,17 @@ +import { IsObject, IsOptional, IsString } from 'class-validator'; + +export class CreateProjectDto { + @IsString() + name: string; +} +export class UpdateProjectDto { + @IsOptional() + @IsString() + name?: string; + @IsOptional() + @IsObject() + data?: Record; + @IsOptional() + @IsObject() + graphData?: Record; +} diff --git a/dl-flow-backend/src/project/dto/remove-project.dto.ts b/dl-flow-backend/src/project/dto/remove-project.dto.ts new file mode 100644 index 0000000..05af07e --- /dev/null +++ b/dl-flow-backend/src/project/dto/remove-project.dto.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export class DeleteProjectDto { + @IsString() + project_id: string; +} diff --git a/dl-flow-backend/src/project/entities/project.entity.ts b/dl-flow-backend/src/project/entities/project.entity.ts new file mode 100644 index 0000000..2082f69 --- /dev/null +++ b/dl-flow-backend/src/project/entities/project.entity.ts @@ -0,0 +1,22 @@ +import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose'; +import { User } from '../../user/user.schema'; + +@Schema({ autoCreate: true }) +export class Project { + @Prop({ type: () => Number }) + projectId: number; + @Prop({ type: () => String }) + name: string; + @Prop({ type: () => String }) + author: string; + @Prop({ type: () => Number }) + createAt: number; + @Prop({ type: () => Boolean }) + removed: boolean; + @Prop({ type: () => Object }) + data: Record; + @Prop({ type: () => Object }) + graphData: Record; +} + +export const ProjectSchema = SchemaFactory.createForClass(Project); diff --git a/dl-flow-backend/src/project/project.controller.ts b/dl-flow-backend/src/project/project.controller.ts new file mode 100644 index 0000000..d36dddd --- /dev/null +++ b/dl-flow-backend/src/project/project.controller.ts @@ -0,0 +1,78 @@ +import { + BadRequestException, + Body, + Controller, + Delete, + Get, + Param, + Patch, + Post, + Query, + Req, +} from '@nestjs/common'; +import { ProjectService } from './project.service'; +import { CreateProjectDto, UpdateProjectDto } from './dto/create-project.dto'; +import { Request } from 'express'; + +@Controller('project') +export class ProjectController { + constructor(private readonly projectService: ProjectService) {} + @Get('/') + async getProjects(@Query('page') page: number) { + return this.projectService.getProject(page); + } + @Get('/:id') + async getProjectInfo(@Param('id') id?: string) { + if (!id) { + throw new BadRequestException('id 不能为空'); + } + if (Number.isNaN(Number(id))) { + throw new BadRequestException('id 应该为数字'); + } + return { + data: await this.projectService.getProjectInfo(Number(id)), + }; + } + @Post('/') + async create(@Body() body: CreateProjectDto, @Req() req: Request) { + return { + data: await this.projectService.create( + body, + req.headers.authorization.replace('Bearer', '').trim(), + ), + }; + } + @Patch('/:id') + async patchProjectInfo( + @Body() body: UpdateProjectDto, + @Param('id') id?: string, + ) { + if (!id) { + throw new BadRequestException('id 不能为空'); + } + if (Number.isNaN(Number(id))) { + throw new BadRequestException('id 应该为数字'); + } + return this.projectService.updateProject(Number(id), body); + } + @Delete('/:id') + async deleteProject(@Param('id') id?: string) { + if (!id) { + throw new BadRequestException('id 不能为空'); + } + if (Number.isNaN(Number(id))) { + throw new BadRequestException('id 应该为数字'); + } + return this.projectService.deleteProject(Number(id)); + } + @Post('/restore/:id') + async restoreProject(@Param('id') id?: string) { + if (!id) { + throw new BadRequestException('id 不能为空'); + } + if (Number.isNaN(Number(id))) { + throw new BadRequestException('id 应该为数字'); + } + return this.projectService.restoreProject(Number(id)); + } +} diff --git a/dl-flow-backend/src/project/project.module.ts b/dl-flow-backend/src/project/project.module.ts new file mode 100644 index 0000000..046a1e9 --- /dev/null +++ b/dl-flow-backend/src/project/project.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common'; +import { ProjectService } from './project.service'; +import { ProjectController } from './project.controller'; +import { DbModule } from '@app/database'; +import { MongooseModule } from '@nestjs/mongoose'; +import { Project, ProjectSchema } from './entities/project.entity'; +import { RedisModule } from '@app/redis'; + +@Module({ + controllers: [ProjectController], + providers: [ProjectService], + imports: [ + DbModule, + MongooseModule.forFeature([ + { + name: Project.name, + schema: ProjectSchema, + }, + ]), + ], +}) +export class ProjectModule {} diff --git a/dl-flow-backend/src/project/project.service.ts b/dl-flow-backend/src/project/project.service.ts new file mode 100644 index 0000000..91c37ae --- /dev/null +++ b/dl-flow-backend/src/project/project.service.ts @@ -0,0 +1,106 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { CreateProjectDto, UpdateProjectDto } from './dto/create-project.dto'; +import { InjectModel } from '@nestjs/mongoose'; +import { Project } from './entities/project.entity'; +import { Model } from 'mongoose'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Redis } from 'ioredis'; +import { User } from '../user/user.schema'; + +enum ProjectStatus { + busy, + empty, +} + +interface ProjectItem { + // project name + name: string; + status: ProjectStatus; + author: { + nick: string; + }; + createAt: string; + id: number; +} + +@Injectable() +export class ProjectService { + constructor( + @InjectModel(Project.name) + private ProjectModel: Model, + @InjectRedis() + private redis: Redis, + ) {} + private async projectExists(name: string) { + const res = await this.ProjectModel.findOne({ name }); + return Boolean(res); + } + async create({ name }: CreateProjectDto, token: string) { + if (await this.projectExists(name)) { + throw new HttpException(`${name} 存在`, HttpStatus.BAD_REQUEST); + } + const email = await this.redis.get(`${token}:id`); + if (!email) { + throw new HttpException(`未登录`, HttpStatus.UNAUTHORIZED); + } + const project = new this.ProjectModel(); + const id = Number((await this.redis.get(`project:counter`)) ?? '1'); + project.projectId = id; + project.name = name; + project.createAt = new Date().getTime(); + project.author = email; + project.removed = false; + project.data = { + meta: { + start: '', + end: '', + }, + payload: { + cells: [], + edges: [], + }, + }; + project.graphData = { + cells: [], + }; + const res = await project.save(); + if (!(await this.redis.get('project:counter'))) { + await this.redis.set('project:counter', 2); + return res; + } + await this.redis.incr('project:counter'); + return res; + } + async getProject(page = 0, size = 10) { + const totalPages = Math.round( + Number(await this.redis.get(`project:counter`)) / size, + ); + const projects = await this.ProjectModel.find({ removed: false }) + .limit(size) + .skip(Math.max(page, 0) * size) + .populate('author', 'nick', User.name); + return { + projects, + totalPages, + }; + } + async getProjectInfo(id: number) { + return this.ProjectModel.findOne({ projectId: id }); + } + async deleteProject(id: number) { + await this.ProjectModel.updateOne({ projectId: id }, { removed: true }); + return true; + } + async restoreProject(id: number) { + await this.ProjectModel.updateOne({ projectId: id }, { removed: false }); + return true; + } + async updateProject(id: number, newProjectInfo: UpdateProjectDto) { + return await this.ProjectModel.updateOne( + { projectId: id }, + { + ...newProjectInfo, + }, + ); + } +} diff --git a/dl-flow-backend/src/user/__tests__/user.service.spec.ts b/dl-flow-backend/src/user/__tests__/user.service.spec.ts new file mode 100644 index 0000000..f49a897 --- /dev/null +++ b/dl-flow-backend/src/user/__tests__/user.service.spec.ts @@ -0,0 +1,86 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { UserService } from '../user.service'; +import { DbModule } from '@app/database'; +import { MongooseModule } from '@nestjs/mongoose'; +import { User, UserSchema } from '../user.schema'; +import { JwtModule } from '@nestjs/jwt'; +import { RedisModule } from '@app/redis'; +import { configDotenv } from 'dotenv'; +import { readFileSync } from 'fs'; +import { HttpException } from '@nestjs/common'; + +describe('UserService', () => { + let service: UserService; + + beforeAll(async () => { + configDotenv({ + path: '.env', + }); + const module: TestingModule = await Test.createTestingModule({ + providers: [UserService], + imports: [ + DbModule, + MongooseModule.forFeature([ + { + name: User.name, + schema: UserSchema, + }, + ]), + JwtModule.register({ + // publicKey: readFileSync( + // process.env.JWT_PUB_KEY ?? './static/pub.key', + // ), + // privateKey: readFileSync( + // process.env.JWT_PRI_KEY ?? './static/pri.key', + // ), + secret: 'test', + signOptions: { + algorithm: 'none', + expiresIn: process.env.JWT_EXPIRE_IN ?? '24h', + }, + }), + RedisModule, + ], + }).compile(); + + service = module.get(UserService); + await service.register({ + email: 'test@no-reply.com', + password: '123456789Sd!', + nick: 'tester-1', + }); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + it('login', () => { + expect( + service.login({ email: 'test@no-reply.com', password: '123456789Sd!' }), + ).resolves.not.toBe(''); + expect( + service.login({ email: 'test_@no-reply.com', password: '123456789Sd!' }), + ).rejects.toThrowError(HttpException); + expect( + service.login({ email: 'test@no-reply.com', password: '123456789Sd' }), + ).rejects.toThrowError(HttpException); + expect( + service.login({ email: 'empty@no-reply.com', password: '123456789Sd' }), + ).rejects.toThrowError(HttpException); + }); + it('register', () => { + expect( + service.register({ + email: '_test@no-reply.com', + password: '123456789Sd!', + nick: 'nick-2', + }), + ).resolves.toBeDefined(); + }); + it('profile', () => { + expect(service.getProfile('test@no-reply.com')).resolves.toMatchObject({ + email: 'test@no-reply.com', + nick: 'tester-1', + }); + }); +}); diff --git a/dl-flow-backend/src/user/user.controller.ts b/dl-flow-backend/src/user/user.controller.ts new file mode 100644 index 0000000..851f508 --- /dev/null +++ b/dl-flow-backend/src/user/user.controller.ts @@ -0,0 +1,34 @@ +import { + Controller, + Get, + Post, + Body, + Param, + HttpException, + HttpStatus, + UseGuards, +} from '@nestjs/common'; +import { UserService } from './user.service'; +import { LoginDTO, RegisterDTO } from './user.dto'; +import { AuthGuard } from '../auth-guard/auth-guard.guard'; + +@Controller('user') +export class UserController { + constructor(private readonly userService: UserService) {} + @Post('/login') + async login(@Body() body: LoginDTO) { + return this.userService.login(body); + } + @Post('/reg') + async register(@Body() body: RegisterDTO) { + return this.userService.register(body); + } + @UseGuards(AuthGuard) + @Get(':email') + async getProfile(@Param('email') email: string) { + if (!email) { + throw new HttpException(`${email} not found`, HttpStatus.BAD_REQUEST); + } + return this.userService.getProfile(email); + } +} diff --git a/dl-flow-backend/src/user/user.dto.ts b/dl-flow-backend/src/user/user.dto.ts new file mode 100644 index 0000000..da58934 --- /dev/null +++ b/dl-flow-backend/src/user/user.dto.ts @@ -0,0 +1,22 @@ +import { IsEmail, IsString } from 'class-validator'; + +export class LoginDTO { + @IsEmail() + email: string; + @IsString() + password: string; +} + +export class RegisterDTO { + @IsEmail() + email: string; + @IsString() + password: string; + @IsString() + nick: string; +} + +export class GetProfileDTO { + @IsEmail() + email: string; +} diff --git a/dl-flow-backend/src/user/user.module.ts b/dl-flow-backend/src/user/user.module.ts new file mode 100644 index 0000000..898856a --- /dev/null +++ b/dl-flow-backend/src/user/user.module.ts @@ -0,0 +1,23 @@ +import { Module } from '@nestjs/common'; +import { UserService } from './user.service'; +import { UserController } from './user.controller'; +import { DbModule } from '@app/database'; +import { MongooseModule } from '@nestjs/mongoose'; +import { User, UserSchema } from './user.schema'; +import { JwtModule } from '@nestjs/jwt'; +import { RedisModule } from '@app/redis'; + +@Module({ + controllers: [UserController], + providers: [UserService], + imports: [ + DbModule, + MongooseModule.forFeature([ + { + name: User.name, + schema: UserSchema, + }, + ]), + ], +}) +export class UserModule {} diff --git a/dl-flow-backend/src/user/user.schema.ts b/dl-flow-backend/src/user/user.schema.ts new file mode 100644 index 0000000..b422b79 --- /dev/null +++ b/dl-flow-backend/src/user/user.schema.ts @@ -0,0 +1,17 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; + +@Schema({ autoCreate: true, autoIndex: true }) +export class User { + @Prop({ type: () => String }) + email: string; + @Prop({ type: () => String }) + password: string; + @Prop({ type: () => String }) + nick: string; + @Prop({ type: () => Number }) + create_at: number; + @Prop({ type: () => Number }) + update_at: number; +} + +export const UserSchema = SchemaFactory.createForClass(User); diff --git a/dl-flow-backend/src/user/user.service.ts b/dl-flow-backend/src/user/user.service.ts new file mode 100644 index 0000000..f5e2299 --- /dev/null +++ b/dl-flow-backend/src/user/user.service.ts @@ -0,0 +1,72 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { LoginDTO, RegisterDTO } from './user.dto'; +import { InjectModel } from '@nestjs/mongoose'; +import { User } from './user.schema'; +import { Model } from 'mongoose'; +import { JwtService } from '@nestjs/jwt'; +import { InjectRedis } from '@liaoliaots/nestjs-redis'; +import { Redis } from 'ioredis'; +import { compareSync, hashSync } from 'bcryptjs'; +import { isEmpty } from 'ramda'; +import ms from 'ms'; + +@Injectable() +export class UserService { + constructor( + @InjectModel(User.name) + private readonly UserModel: Model, + private readonly jwt: JwtService, + @InjectRedis() + private redis: Redis, + ) {} + async login(data: LoginDTO) { + const { email, password } = data; + const userProfile = await this.UserModel.findOne({ + email, + }); + if ( + !userProfile || + isEmpty(userProfile) || + !compareSync(password, userProfile.password) + ) { + throw new HttpException(`${email} is not found`, HttpStatus.NOT_FOUND); + } + const jwt = this.jwt.sign({ email }); + await this.redis.set(`token:${email}`, jwt); + await this.redis.hmset(`profile:${email}`, userProfile.toJSON()); + await this.redis.set(`${jwt}`, email); + await this.redis.set(`${jwt}:id`, userProfile._id.toString()); + await this.redis.setnx(jwt, ms(process.env.JWT_EXPIRE_IN)); + await this.redis.setnx(`${jwt}:id`, ms(process.env.JWT_EXPIRE_IN)); + return { jwt, nick: userProfile.nick }; + } + async register(data: RegisterDTO) { + const { email, password, nick } = data; + const profile = this.UserModel.findOne({ + email, + }); + if (!profile) { + throw new HttpException('user exists', HttpStatus.BAD_REQUEST); + } + const date = new Date(); + const _password = hashSync( + password, + Number(process.env.PWD_SALT_LEN ?? process.env.PWD_SALT?.length ?? 10), + ); + const userModel = new this.UserModel(); + userModel.email = email; + userModel.password = _password; + userModel.nick = nick; + userModel.create_at = date.getTime(); + userModel.update_at = date.getTime(); + return userModel + .save() + .then((user) => user.toJSON()) + .catch((reason) => { + throw new HttpException(reason, HttpStatus.BAD_REQUEST); + }); + } + async getProfile(email: string) { + return this.UserModel.findOne({ email }).select('nick email'); + } +} diff --git a/dl-flow-backend/src/ws-exception/ws-exception.filter.spec.ts b/dl-flow-backend/src/ws-exception/ws-exception.filter.spec.ts new file mode 100644 index 0000000..907fdd6 --- /dev/null +++ b/dl-flow-backend/src/ws-exception/ws-exception.filter.spec.ts @@ -0,0 +1,7 @@ +import { WsExceptionFilter } from './ws-exception.filter'; + +describe('WsExceptionFilter', () => { + it('should be defined', () => { + expect(new WsExceptionFilter()).toBeDefined(); + }); +}); diff --git a/dl-flow-backend/src/ws-exception/ws-exception.filter.ts b/dl-flow-backend/src/ws-exception/ws-exception.filter.ts new file mode 100644 index 0000000..4283a71 --- /dev/null +++ b/dl-flow-backend/src/ws-exception/ws-exception.filter.ts @@ -0,0 +1,18 @@ +import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common'; +import { Exception } from '../code-generate/code-generate.service'; +import { Socket } from 'socket.io'; +import { State } from '../code-generate/code-generate.gateway'; + +@Catch() +export class WsExceptionFilter implements ExceptionFilter { + catch(exception: T, host: ArgumentsHost) { + const ws = host.switchToWs(); + const client = ws.getClient(); + if (exception instanceof Exception) { + client.emit(State.err, exception.message); + } else { + client.emit(State.err, 'Schema 有误, 请检查'); + } + return; + } +} diff --git a/dl-flow-backend/test/app.e2e-spec.ts b/dl-flow-backend/test/app.e2e-spec.ts new file mode 100644 index 0000000..50cda62 --- /dev/null +++ b/dl-flow-backend/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/dl-flow-backend/test/jest-e2e.json b/dl-flow-backend/test/jest-e2e.json new file mode 100644 index 0000000..093779a --- /dev/null +++ b/dl-flow-backend/test/jest-e2e.json @@ -0,0 +1,23 @@ +{ + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "moduleNameMapper": { + "@app/database/(.*)": "/../libs/database/src/$1", + "@app/database": "/../libs/database/src", + "@app/shared/(.*)": "/../libs/shared/src/$1", + "@app/shared": "/../libs/shared/src", + "@app/redis/(.*)": "/../libs/redis/src/$1", + "@app/redis": "/../libs/redis/src", + "@app/auth-guard/(.*)": "/../libs/auth-guard/src/$1", + "@app/auth-guard": "/../libs/auth-guard/src" + } +} \ No newline at end of file diff --git a/dl-flow-backend/tsconfig.build.json b/dl-flow-backend/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/dl-flow-backend/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/dl-flow-backend/tsconfig.json b/dl-flow-backend/tsconfig.json new file mode 100644 index 0000000..4fb7f71 --- /dev/null +++ b/dl-flow-backend/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false, + "esModuleInterop": true, + "paths": { + "@app/database": [ + "libs/database/src" + ], + "@app/database/*": [ + "libs/database/src/*" + ], + "@app/shared": [ + "libs/shared/src" + ], + "@app/shared/*": [ + "libs/shared/src/*" + ], + "@app/redis": [ + "libs/redis/src" + ], + "@app/redis/*": [ + "libs/redis/src/*" + ] + } + } +} \ No newline at end of file diff --git a/dl-flow-backend/webpack.config.js b/dl-flow-backend/webpack.config.js new file mode 100644 index 0000000..1701eb5 --- /dev/null +++ b/dl-flow-backend/webpack.config.js @@ -0,0 +1,18 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { DefinePlugin } = require('webpack'); +/** + * + * @param {import('webpack').Configuration} option + * @returns {import('webpack').Configuration} + */ +module.exports = (option) => { + return { + ...option, + plugins: [ + new DefinePlugin({ + __DEV__: process.env.NODE_ENV === 'DEV' ?? false, + __TEST__: process.env.NODE_ENV === 'TEST' ?? false, + }), + ], + }; +}; diff --git a/dl-flow-example/bundle.json b/dl-flow-example/bundle.json new file mode 100644 index 0000000..9c088e8 --- /dev/null +++ b/dl-flow-example/bundle.json @@ -0,0 +1,5459 @@ +{ + "$schema": "bundle.schema.json", + "data": { + "types": { + "ParamAttr": [ + { + "id": "name", + "label": { + "zh_CN": "前缀", + "en_US": "Name" + }, + "type": "string", + "optional": true, + "default": "" + }, + { + "id": "learning_rate", + "label": { + "zh_CN": "学习率", + "en_US": "learning_rate" + }, + "type": "number", + "optional": true, + "default": 1.0 + }, + { + "id": "trainable", + "label": { + "zh_CN": "是否参与训练", + "en_US": "trainable" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "do_model_average", + "label": { + "zh_CN": "模型平均", + "en_US": "do_model_average" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "need_clip", + "label": { + "zh_CN": "梯度裁剪", + "en_US": "need_clip" + }, + "type": "boolean", + "optional": true, + "default": true + } + ] + }, + "materials": [ + { + "id": "AdaptiveAvgPool1D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool1D", + "zh_CN": "1D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool2D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool2D", + "zh_CN": "2D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool3D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool3D", + "zh_CN": "3D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool1D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "1D 自适应最大值池化", + "en_US": "AdaptiveMaxPool1D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool2D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "2D 自适应最大值池化", + "en_US": "AdaptiveMaxPool2D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool3D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "3D 自适应最大值池化", + "en_US": "AdaptiveMaxPool3D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AlphaDropout", + "mode": "nn", + "label": { + "zh_CN": "自归一化dropout", + "en_US": "Alpha dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "丢弃概率", + "en_US": "Dropping probability" + } + } + ] + }, + { + "id": "AvgPool1D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool1D", + "en_US": "AvgPool1D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool2D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool2D", + "en_US": "AvgPool2D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool3D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool3D", + "en_US": "AvgPool3D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "MaxPool1D", + "mode": "nn", + "label": { + "en_US": "MaxPool1D", + "zh_CN": "1D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool2D", + "mode": "nn", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool3D", + "mode": "nn", + "label": { + "en_US": "MaxPool3D", + "zh_CN": "3D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "BCELoss", + "mode": "nn", + "label": { + "zh_CN": "BCELoss", + "en_US": "BCELoss" + }, + "properties": [] + }, + { + "id": "BCEWithLogitsLoss", + "mode": "nn", + "label": { + "zh_CN": "BCEWithLogitsLoss", + "en_US": "BCEWithLogitsLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "BatchNorm1D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm1D", + "en_US": "BatchNorm1D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm2D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm2D", + "en_US": "BatchNorm2D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm3D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm3D", + "en_US": "BatchNorm3D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm", + "en_US": "BatchNorm" + }, + "properties": [ + { + "id": "num_channels", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "num_channels" + } + }, + { + "id": "is_test", + "type": "boolean", + "label": { + "zh_CN": "是否在测试阶段", + "en_US": "Is test" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "param_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "param attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_layout", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + }, + { + "id": "in_place", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "batch_norm是否可以服用输入内存", + "en_US": "Can batch norm take input memory" + } + }, + { + "id": "do_model_average_for_mean_and_var", + "type": "boolean", + "default": "false", + "label": { + "zh_CN": "是否为 mean 和 variance 做模型均值", + "en_US": "Are we doing model mean for mean and variance" + } + }, + { + "id": "use_global_stats", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用全局均值和方差", + "en_US": "Is global mean and variance used" + } + }, + { + "id": "trainable_statistics", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "eval 模式下是否计算 mean 均值和 var 方差", + "en_US": "Is the mean and variance of var calculated in eval mode" + } + }, + { + "id": "moving_mean_name", + "type": "string", + "label": { + "zh_CN": "moving_mean 的名称", + "en_US": "name of moving_mean" + } + }, + { + "id": "moving_variance_name", + "type": "string", + "label": { + "zh_CN": "moving_var 的名称", + "en_US": "name of moving_var" + } + } + ] + }, + { + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "mode": "nn", + "properties": [] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "id": "Conv1D", + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "nnName": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "3D 卷积神经网络", + "en_US": "Conv 3D" + }, + "id": "Conv3D", + "nnName": "Conv3D", + "desc": "三维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "nnName": "Linear", + "desc": "线性变换", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "nnName": "Flatten", + "mode": "nn", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1 + } + ] + }, + { + "label": { + "zh_CN": "一维转置卷积层", + "en_US": "Conv1DTranspose" + }, + "id": "Conv1DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "二维转置卷积层", + "en_US": "Conv2DTranspose" + }, + "id": "Conv2DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "三维转置卷积层", + "en_US": "Conv3DTranspose" + }, + "id": "Conv3DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Bilinear", + "mode": "nn", + "label": { + "zh_CN": "双线性Tensor积", + "en_US": "Bilinear" + }, + "properties": [ + { + "id": "in1_features", + "type": "number", + "label": { + "zh_CN": "x1 元素的维度", + "en_US": "" + } + }, + { + "id": "in2_features", + "type": "number", + "label": { + "zh_CN": "x2 元素的维度", + "en_US": "" + } + }, + { + "id": "out_features", + "type": "number", + "label": { + "zh_CN": "输出 Tensor 的维度", + "en_US": "Size of output tensor" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "CELU", + "mode": "nn", + "label": { + "zh_CN": "CELU 激活函数", + "en_US": "CELU" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "CTCLoss", + "mode": "nn", + "label": { + "en_US": "CTC Loss", + "zh_CN": "CTC 损失函数" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "en_US": "Blank", + "zh_CN": "v" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "CosineEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "CosineEmbedding 损失", + "en_US": "CosineEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "ChannelShuffle", + "label": { + "zh_CN": "通道分组", + "en_US": "group by channel" + }, + "mode": "nn", + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "zh_CN": "分组数", + "en_US": "total group" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByGlobalNorm", + "label": { + "zh_CN": "ClipGradByGlobalNorm", + "en_US": "ClipGradByGlobalNorm" + }, + "properties": [ + { + "id": "clip_norm", + "type": "number", + "label": { + "zh_CN": "范数最大值", + "en_US": "clip norm" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByNorm", + "label": { + "zh_CN": "ClipGradByNorm", + "en_US": "ClipGradByNorm" + }, + "properties": [ + { + "id": "clip_norm", + "label": { + "zh_CN": "二范数最大值", + "en_US": "clip_norm" + }, + "type": "number" + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByValue", + "label": { + "en_US": "ClipGradByValue", + "zh_CN": "ClipGradByValue" + }, + "properties": [ + { + "id": "max", + "type": "number", + "label": { + "en_US": "max", + "zh_CN": "修剪的最大值" + } + }, + { + "id": "min", + "type": "number", + "label": { + "en_US": "min", + "zh_CN": "修建的最小值" + } + } + ] + }, + { + "mode": "nn", + "id": "CosineSimilarity", + "label": { + "en_US": "CosineSimilarity", + "zh_CN": "余弦相似度" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": 1 + }, + { + "id": "eps", + "type": "number", + "label": { + "zh_CN": "加在分母上的很小的数值, 防止分母为0的情况", + "en_US": "eps" + }, + "default": 1e-8 + } + ] + }, + { + "mode": "nn", + "id": "CrossEntropyLoss", + "label": { + "en_US": "CrossEntropyLoss", + "zh_CN": "交叉熵损失" + }, + "properties": [ + { + "id": "ignore_index", + "type": "number", + "label": { + "en_US": "ignore index", + "zh_CN": "忽略的标签值" + }, + "default": -100 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "soft_label", + "type": "boolean", + "default": false, + "label": { + "en_US": "soft label", + "zh_CN": "软标签" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": -1 + }, + { + "id": "use_softmax", + "type": "boolean", + "default": true, + "label": { + "zh_CN": "softmax 归一化", + "en_US": "use softmax normalization" + } + } + ] + }, + { + "id": "Dropout2D", + "mode": "nn", + "label": { + "zh_CN": "二维概率丢弃", + "en_US": "Dropout2D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout3D", + "mode": "nn", + "label": { + "zh_CN": "三维概率丢弃", + "en_US": "Dropout3D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout", + "mode": "nn", + "label": { + "zh_CN": "概率丢弃", + "en_US": "Dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "丢弃轴", + "en_US": "axis" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "upscale_in_train", + "label": "upscale_in_train", + "default": true + }, + { + "id": 1, + "value": "downscale_in_infer", + "label": "downscale_in_infer" + } + ] + } + ] + }, + { + "id": "ELU", + "mode": "nn", + "label": { + "zh_CN": "ELU 激活函数", + "en_US": "ELU activation" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Embedding", + "mode": "nn", + "label": { + "zh_CN": "嵌入层", + "en_US": "Embedding" + }, + "properties": [ + { + "id": "num_embeddings", + "type": "number", + "label": { + "zh_CN": "字典大小", + "en_US": "size of embeddings" + } + }, + { + "id": "embedding_dim", + "type": "number", + "label": { + "zh_CN": "嵌入向量的维度", + "en_US": "Dim of every embedding" + } + } + ] + }, + { + "id": "Fold", + "mode": "nn", + "label": { + "zh_CN": "区块合并", + "en_US": "fold" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "卷积核大小", + "en_US": "size of kernel" + } + }, + { + "id": "strides", + "type": "number", + "label": { + "zh_CN": "步长大小", + "en_US": "size of stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度扩张大小", + "en_US": "padding" + } + }, + { + "type": "number", + "default": 1, + "id": "dilations", + "label": { + "en_US": "dilations", + "zh_CN": "卷积膨胀" + } + } + ] + }, + { + "id": "FractionalMaxPool2D", + "mode": "nn", + "label": { + "zh_CN": "2维分数阶最大值池化", + "en_US": "FractionalMaxPool2D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "FractionalMaxPool3D", + "mode": "nn", + "label": { + "zh_CN": "3维分数阶最大值池化", + "en_US": "FractionalMaxPool3D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "GELU", + "mode": "nn", + "label": { + "zh_CN": "GELU 激活函数", + "en_US": "GELU activation" + }, + "properties": [ + { + "id": "approximate", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否启用近似计算", + "en_US": "approximate" + } + } + ] + }, + { + "id": "GLU", + "mode": "nn", + "label": { + "zh_CN": "GLU 激活层", + "en_US": "GLU Activation Operator" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "en_US": "axis", + "zh_CN": "沿着该轴将输入二等分" + } + } + ] + }, + { + "id": "GRUCell", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元", + "en_US": "GRUCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GRU", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元网络", + "en_US": "GRU" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GaussianNLLLoss", + "mode": "nn", + "label": { + "zh_CN": "高斯负对数似然损失", + "en_US": "GaussianNLLLoss" + }, + "properties": [ + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "Is the constant term included in the loss calculation", + "zh_CN": "是否在损失计算中包括常数项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 1e-6 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "GroupNorm", + "mode": "nn", + "label": { + "en_US": "Group Normalization", + "zh_CN": "组归一化" + }, + "properties": [ + { + "id": "num_groups", + "type": "number", + "label": { + "en_US": "num groups", + "zh_CN": "从通道中分离出的组数" + } + }, + { + "id": "num_channels", + "type": "number", + "label": { + "en_US": "num channels", + "zh_CN": "输入通道数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "HSigmoidLoss", + "label": { + "en_US": "hierarchical sigmoid", + "zh_CN": "层次Sigmoid" + }, + "mode": "nn", + "properties": [ + { + "id": "feature_size", + "type": "number", + "label": { + "en_US": "input tensor size", + "zh_CN": "输入tensor的特征尺寸" + } + }, + { + "id": "num_classes", + "type": "number", + "label": { + "en_US": "dictionary size", + "zh_CN": "字典大小" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "is_custom", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "自定义二叉树", + "en_US": "custom Binary tree" + } + }, + { + "id": "is_sparse", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用稀疏更新", + "en_US": "Whether to use the sparse update method" + } + } + ] + }, + { + "id": "Hardshrink", + "mode": "nn", + "label": { + "en_US": "Hardshrink", + "zh_CN": "Hardshrink 激活层" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 0.5, + "label": { + "en_US": "threshold", + "zh_CN": "threshold" + } + } + ] + }, + { + "id": "Hardsigmoid", + "mode": "nn", + "label": { + "en_US": "Hardsigmoid", + "zh_CN": "Hardsigmoid 激活层" + }, + "properties": [] + }, + { + "id": "Hardswish", + "mode": "nn", + "label": { + "zh_CN": "Hardswish 激活函数", + "en_US": "Hardswish" + }, + "properties": [] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh Activation", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "label": { + "en_US": "min value", + "zh_CN": "最小值" + }, + "type": "number", + "default": -1 + }, + { + "id": "max", + "label": { + "en_US": "max value", + "zh_CN": "最大值" + }, + "type": "number", + "default": 1 + } + ] + }, + { + "id": "HingeEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "非线形的铰链嵌入损失", + "en_US": "HingeEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Identity", + "mode": "nn", + "label": { + "zh_CN": "等效层", + "en_US": "Identity" + }, + "properties": [] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm2D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm2D", + "en_US": "InstanceNorm2D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "KLDivLoss", + "mode": "nn", + "label": { + "zh_CN": "Kullback-Leibler 散度损失", + "en_US": "Kullback-Leibler loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "L1Loss", + "mode": "nn", + "label": { + "en_US": "L1 loss", + "zh_CN": "L1 loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "LSTMCell", + "mode": "nn", + "label": { + "zh_CN": "长短期记忆网络单元", + "en_US": "LSTMCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LSTM", + "mode": "nn", + "label": { + "en_US": "LSTM", + "zh_CN": "LSTM" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LeakyReLU", + "mode": "nn", + "label": { + "zh_CN": "LeakyReLU 激活层", + "en_US": "LeakyReLU" + }, + "properties": [ + { + "id": "negative_slope", + "type": "number", + "default": 0.01, + "label": { + "zh_CN": "斜率", + "en_US": "slope" + } + } + ] + }, + { + "id": "LocalResponseNorm", + "mode": "nn", + "label": { + "en_US": "LocalResponseNorm", + "zh_CN": "局部响应正则化" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "zh_CN": "累加通道数", + "en_US": "Accumulated number of channels" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1e-4, + "label": { + "en_US": "Scaling parameters", + "zh_CN": "缩放参数" + } + }, + { + "id": "beta", + "type": "number", + "default": 0.75, + "label": { + "zh_CN": "指数", + "en_US": "exponent" + } + }, + { + "id": "k", + "type": "number", + "default": 1, + "label": { + "zh_CN": "位移", + "en_US": "k" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "LogSigmoid", + "label": { + "zh_CN": "LogSigmoid 激活层", + "en_US": "LogSigmoid" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "LogSoftmax", + "mode": "nn", + "label": { + "zh_CN": "LogSoftmax", + "en_US": "LogSoftmax_cn" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "MSELoss", + "mode": "nn", + "label": { + "zh_CN": "均方误差", + "en_US": "MSELoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MarginRankingLoss", + "mode": "nn", + "label": { + "zh_CN": "MarginRankingLoss", + "en_US": "MarginRankingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "label": { + "zh_CN": "加和的 margin 值", + "en_US": "The margin value of the sum" + }, + "default": 0 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MaxUnPool2D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool2D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool3D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool3D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool1D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool1D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "Maxout", + "mode": "nn", + "label": { + "zh_CN": "Maxout 激活层", + "en_US": "Maxout" + }, + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "en_US": "groups", + "zh_CN": "组数" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "指定通道所在维度的索引" + }, + "default": 1 + } + ] + }, + { + "id": "Mish", + "label": { + "en_US": "Mish", + "zh_CN": "Mish 激活层" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "MultiHeadAttention", + "label": { + "en_US": "MultiHeadAttention", + "zh_CN": "多头注意力" + }, + "mode": "nn", + "properties": [ + { + "id": "embed_dim", + "type": "number", + "label": { + "zh_CN": "输入维度", + "en_US": "embed_dim" + } + }, + { + "id": "num_heads", + "type": "number", + "label": { + "zh_CN": "head数量", + "en_US": "num_heads" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0, + "label": { + "zh_CN": "随机失活率", + "en_US": "dropout" + } + }, + { + "id": "kdim", + "type": "number", + "label": { + "zh_CN": "key的维度", + "en_US": "kdim" + } + }, + { + "id": "vdim", + "type": "number", + "label": { + "zh_CN": "value的维度", + "en_US": "vdim" + } + }, + { + "id": "need_weights", + "type": "boolean", + "label": { + "zh_CN": "是否返回注意力权重", + "en_US": "need_weights" + }, + "default": false + }, + { + "id": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "type": "ParamAttr" + } + ] + }, + { + "id": "PReLU", + "mode": "nn", + "label": { + "en_US": "PReLU", + "zh_CN": "PReLU" + }, + "properties": [ + { + "id": "num_parameters", + "type": "number", + "default": 1, + "label": { + "en_US": "num_parameters", + "zh_CN": "可训练 weight 数量" + } + }, + { + "id": "init", + "type": "number", + "default": 0.25, + "label": { + "zh_CN": "初始值", + "en_US": "init" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad1D", + "mode": "nn", + "label": { + "en_US": "Pad1D", + "zh_CN": "Pad1D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad2D", + "mode": "nn", + "label": { + "en_US": "Pad2D", + "zh_CN": "Pad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad3D", + "mode": "nn", + "label": { + "en_US": "Pad3D", + "zh_CN": "Pad3D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PairwiseDistance", + "mode": "nn", + "label": { + "zh_CN": "范数距离", + "en_US": "PairwiseDistance" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 2, + "label": { + "en_US": "p", + "zh_CN": "p阶的范数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "keep_dim", + "type": "boolean", + "label": { + "zh_CN": "是否保留输出 Tensor 减少的维度", + "en_US": "keep_dim" + } + } + ] + }, + { + "id": "PixelShuffle", + "label": { + "zh_CN": "PixelShuffle", + "en_US": "PixelShuffle" + }, + "mode": "nn", + "properties": [ + { + "id": "upscale_factor", + "type": "number", + "label": { + "en_US": "upscale_factor", + "zh_CN": "上采样增大因子" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PixelUnshuffle", + "mode": "nn", + "label": { + "zh_CN": "PixelUnshuffle", + "en_US": "PixelUnshuffle" + }, + "properties": [ + { + "id": "downscale_factor", + "type": "number", + "label": { + "zh_CN": "下采样因子", + "en_US": "downscale_factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PoissonNLLLoss", + "mode": "nn", + "label": { + "en_US": "PoissonNLLLoss", + "zh_CN": "PoissonNLL 损失函数" + }, + "properties": [ + { + "id": "log_input", + "type": "boolean", + "label": { + "zh_CN": "输入是否为对数函数映射后结果", + "en_US": "log_input" + }, + "default": true + }, + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "full", + "zh_CN": "是否在损失计算中包括 Stirling 近似项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "en_US": "epsilon", + "zh_CN": "在 log_input 为 true 时使用的常数小量" + }, + "default": 1e-8 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RNNTLoss", + "mode": "nn", + "label": { + "zh_CN": "RNNTLoss 损失", + "en_US": "RNNTLoss" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "zh_CN": "空格标记的 ID 值", + "en_US": "blank" + } + }, + { + "id": "fastemit_lambda", + "type": "number", + "default": 0.001, + "label": { + "en_US": "fastemit_lambda", + "zh_CN": "FastEmit 的正则化参数" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RReLU", + "mode": "nn", + "label": { + "zh_CN": "RReLU 激活层", + "en_US": "RReLU" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "padding", + "en_US": "padding" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": "constant", + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": "reflect", + "label": "reflect", + "value": "reflect" + }, + { + "id": "replicate", + "label": "replicate", + "value": "replicate" + }, + { + "id": "circular", + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "default": 0.0, + "label": { + "zh_CN": "value", + "en_US": "value" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCL", + "label": "NCL" + }, + { + "id": 1, + "value": "NLC", + "label": "NLC" + } + ] + } + ] + }, + { + "id": "ReLU6", + "mode": "nn", + "label": { + "en_US": "ReLU6", + "zh_CN": "ReLU6" + }, + "properties": [] + }, + { + "id": "SELU", + "mode": "nn", + "label": { + "en_US": "SELU", + "zh_CN": "SELU" + }, + "properties": [ + { + "id": "scale", + "type": "number", + "default": 1.0507009873554804934193349852946, + "label": { + "en_US": "scale", + "zh_CN": "scale" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1.6732632423543772848170429916717, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Sigmoid", + "mode": "nn", + "label": { + "en_US": "Sigmoid", + "zh_CN": "Sigmoid" + }, + "properties": [] + }, + { + "id": "Silu", + "mode": "nn", + "label": { + "en_US": "Silu", + "zh_CN": "Silu" + }, + "properties": [] + }, + { + "id": "SmoothL1Loss", + "mode": "nn", + "label": { + "zh_CN": "SmoothL1Loss", + "en_US": "SmoothL1Loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "delta", + "label": { + "en_US": "delta", + "zh_CN": "delta" + }, + "default": 1.0, + "type": "number" + } + ] + }, + { + "id": "SoftMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "SoftMarginLoss", + "en_US": "SoftMarginLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Softmax2D", + "mode": "nn", + "label": { + "en_US": "Softmax2D", + "zh_CN": "Softmax2D" + }, + "properties": [] + }, + { + "id": "Softmax", + "mode": "nn", + "label": { + "en_US": "Softmax", + "zh_CN": "Softmax 激活层" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "运算轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "Softplus", + "mode": "nn", + "label": { + "zh_CN": "Softplus 激活层", + "en_US": "Softplus" + }, + "properties": [ + { + "id": "beta", + "type": "number", + "default": 1, + "label": { + "en_US": "beta", + "zh_CN": "beta" + } + }, + { + "id": "threshold", + "type": "number", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "default": 20 + } + ] + }, + { + "id": "Softshrink", + "label": { + "zh_CN": "Softshrink 激活层", + "en_US": "Softshrink" + }, + "properties": [ + { + "id": "threshold", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "type": "number", + "default": 0.5 + } + ], + "mode": "nn" + }, + { + "id": "Softsign", + "mode": "nn", + "label": { + "zh_CN": "Softsign 激活层", + "en_US": "Softsign" + }, + "properties": [] + }, + { + "id": "Swish", + "mode": "nn", + "label": { + "zh_CN": "Swish", + "en_US": "Swish" + }, + "properties": [] + }, + { + "id": "SyncBatchNorm", + "mode": "nn", + "label": { + "en_US": "SyncBatchNorm", + "zh_CN": "SyncBatchNorm" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "type": "number", + "default": -1, + "label": { + "en_US": "min", + "zh_CN": "最小值" + } + }, + { + "id": "max", + "type": "number", + "default": 1, + "label": { + "zh_CN": "最大值", + "en_US": "最小值" + } + } + ] + }, + { + "id": "Tanhshrink", + "mode": "nn", + "label": { + "zh_CN": "Tanhshrink 激活层", + "en_US": "Tanhshrink" + }, + "properties": [] + }, + { + "id": "ThresholdedReLU", + "mode": "nn", + "label": { + "zh_CN": "ThresholdedReLU 激活层", + "en_US": "ThresholdedReLU" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + } + } + ] + }, + { + "id": "TransformerDecoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 解码器层", + "en_US": "TransformerDecoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "layer_norm_eps", + "type": "number", + "default": 0.0001, + "label": { + "en_US": "layer_norm_eps", + "zh_CN": "transformer decoder 中 layer normalization 层的 eps 参数值" + } + } + ] + }, + { + "id": "TransformerEncoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 编码器层", + "en_US": "TransformerEncoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Transformer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 模型", + "en_US": "Transformer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "p", + "label": { + "zh_CN": "范数", + "en_US": "p" + }, + "type": "number", + "default": 2 + }, + { + "id": "epsilon", + "type": "number", + "default": 1e-6, + "label": { + "zh_CN": "防止除数为0", + "en_US": "epsilon" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "distance_function", + "type": "number", + "label": { + "zh_CN": "欧氏距离范数", + "en_US": "distance_function" + } + }, + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Unfold", + "mode": "nn", + "label": { + "en_US": "Unfold", + "zh_CN": "Unfold" + }, + "properties": [ + { + "id": "kernel_sizes", + "type": "number", + "label": { + "zh_CN": "卷积核的尺寸", + "en_US": "kernel_sizes" + } + }, + { + "id": "dilations", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积膨胀", + "en_US": "dilations" + } + }, + { + "id": "paddings", + "type": "number", + "default": 0, + "label": { + "en_US": "paddings", + "zh_CN": "扩张" + } + }, + { + "id": "strides", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积步长", + "en_US": "strides" + } + } + ] + }, + { + "id": "UpsamplingBilinear2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingBilinear2D", + "zh_CN": "UpsamplingBilinear2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "UpsamplingNearest2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingNearest2D", + "zh_CN": "UpsamplingNearest2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "ZeroPad2D", + "mode": "nn", + "label": { + "zh_CN": "零填充", + "en_US": "ZeroPad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "size of padding" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "Upsample", + "label": { + "en_US": "Upsample", + "zh_CN": "上采样" + }, + "mode": "nn", + "properties": [ + { + "id": "size", + "type": "list", + "label": { + "zh_CN": "大小", + "en_US": "size" + }, + "default": [ + 0, + 0 + ], + "items": "number" + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "en_US": "scale_factor", + "zh_CN": "缩放因子" + } + }, + { + "id": "mode", + "type": "enums", + "label": { + "zh_CN": "采样方法", + "en_US": "mode" + }, + "enums": [ + { + "id": "bilinear", + "value": "bilinear", + "label": "bilinear" + }, + { + "id": "trilinear", + "value": "trilinear", + "label": "trilinear" + }, + { + "id": "nearest", + "value": "nearest", + "label": "nearest", + "default": true + }, + { + "id": "bicubic", + "value": "bicubic", + "label": "bicubic" + }, + { + "id": "linear", + "value": "linear", + "label": "linear" + }, + { + "id": "area", + "value": "area", + "label": "area" + } + ] + }, + { + "id": "align_corners", + "type": "boolean", + "label": { + "en_US": "align_corners", + "zh_CN": "对齐" + }, + "default": false + }, + { + "id": "align_mode", + "type": "number", + "default": 0, + "label": { + "en_US": "align_mode", + "zh_CN": "双线性插值" + } + }, + { + "id": "data_format", + "type": "enums", + "label": { + "en_US": "data format", + "zh_CN": "数据格式" + }, + "enums": [ + { + "id": "NCW", + "value": "NCW", + "label": "NCW" + }, + { + "id": "NWC", + "value": "NWC", + "label": "NWC" + }, + { + "id": "NCHW", + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": "NHWC", + "value": "NHWC", + "label": "NHWC" + }, + { + "id": "NCDHW", + "value": "NCDHW", + "label": "NCDHW" + }, + { + "id": "NDHWC", + "value": "NDHWC", + "label": "NDHWC" + } + ] + } + ] + }, + { + "id": "SpectralNorm", + "mode": "nn", + "label": { + "en_US": "SpectralNorm", + "zh_CN": "SpectralNorm" + }, + "properties": [ + { + "id": "weight_shape", + "type": "list", + "items": "number", + "label": { + "zh_CN": "权重参数的shape", + "en_US": "shape of weight attr" + } + }, + { + "id": "dim", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度索引", + "en_US": "dim" + } + }, + { + "id": "power_iters", + "default": 0, + "type": "number", + "label": { + "en_US": "power iters", + "zh_CN": "用于计算的 SpectralNorm 功率迭代次数" + } + }, + { + "id": "eps", + "type": "number", + "default": 1e-12, + "label": { + "zh_CN": "用于保证计算规范中的数值稳定性", + "en_US": "eps" + } + } + ] + }, + { + "id": "Unflatten", + "mode": "nn", + "label": { + "zh_CN": "Unflatten", + "en_US": "Unflatten" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "要展开维度的轴" + } + }, + { + "id": "shape", + "type": "list", + "items": "number", + "label": { + "en_US": "shape", + "zh_CN": "展开的shape" + } + } + ] + } + ], + "layer": [] + } +} \ No newline at end of file diff --git a/dl-flow-example/data/bundle.json b/dl-flow-example/data/bundle.json new file mode 100644 index 0000000..9c088e8 --- /dev/null +++ b/dl-flow-example/data/bundle.json @@ -0,0 +1,5459 @@ +{ + "$schema": "bundle.schema.json", + "data": { + "types": { + "ParamAttr": [ + { + "id": "name", + "label": { + "zh_CN": "前缀", + "en_US": "Name" + }, + "type": "string", + "optional": true, + "default": "" + }, + { + "id": "learning_rate", + "label": { + "zh_CN": "学习率", + "en_US": "learning_rate" + }, + "type": "number", + "optional": true, + "default": 1.0 + }, + { + "id": "trainable", + "label": { + "zh_CN": "是否参与训练", + "en_US": "trainable" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "do_model_average", + "label": { + "zh_CN": "模型平均", + "en_US": "do_model_average" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "need_clip", + "label": { + "zh_CN": "梯度裁剪", + "en_US": "need_clip" + }, + "type": "boolean", + "optional": true, + "default": true + } + ] + }, + "materials": [ + { + "id": "AdaptiveAvgPool1D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool1D", + "zh_CN": "1D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool2D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool2D", + "zh_CN": "2D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool3D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool3D", + "zh_CN": "3D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool1D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "1D 自适应最大值池化", + "en_US": "AdaptiveMaxPool1D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool2D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "2D 自适应最大值池化", + "en_US": "AdaptiveMaxPool2D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool3D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "3D 自适应最大值池化", + "en_US": "AdaptiveMaxPool3D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AlphaDropout", + "mode": "nn", + "label": { + "zh_CN": "自归一化dropout", + "en_US": "Alpha dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "丢弃概率", + "en_US": "Dropping probability" + } + } + ] + }, + { + "id": "AvgPool1D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool1D", + "en_US": "AvgPool1D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool2D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool2D", + "en_US": "AvgPool2D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool3D", + "mode": "nn", + "label": { + "zh_CN": "AvgPool3D", + "en_US": "AvgPool3D" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "MaxPool1D", + "mode": "nn", + "label": { + "en_US": "MaxPool1D", + "zh_CN": "1D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool2D", + "mode": "nn", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool3D", + "mode": "nn", + "label": { + "en_US": "MaxPool3D", + "zh_CN": "3D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "BCELoss", + "mode": "nn", + "label": { + "zh_CN": "BCELoss", + "en_US": "BCELoss" + }, + "properties": [] + }, + { + "id": "BCEWithLogitsLoss", + "mode": "nn", + "label": { + "zh_CN": "BCEWithLogitsLoss", + "en_US": "BCEWithLogitsLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "BatchNorm1D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm1D", + "en_US": "BatchNorm1D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm2D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm2D", + "en_US": "BatchNorm2D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm3D", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm3D", + "en_US": "BatchNorm3D" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm", + "en_US": "BatchNorm" + }, + "properties": [ + { + "id": "num_channels", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "num_channels" + } + }, + { + "id": "is_test", + "type": "boolean", + "label": { + "zh_CN": "是否在测试阶段", + "en_US": "Is test" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "param_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "param attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_layout", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + }, + { + "id": "in_place", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "batch_norm是否可以服用输入内存", + "en_US": "Can batch norm take input memory" + } + }, + { + "id": "do_model_average_for_mean_and_var", + "type": "boolean", + "default": "false", + "label": { + "zh_CN": "是否为 mean 和 variance 做模型均值", + "en_US": "Are we doing model mean for mean and variance" + } + }, + { + "id": "use_global_stats", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用全局均值和方差", + "en_US": "Is global mean and variance used" + } + }, + { + "id": "trainable_statistics", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "eval 模式下是否计算 mean 均值和 var 方差", + "en_US": "Is the mean and variance of var calculated in eval mode" + } + }, + { + "id": "moving_mean_name", + "type": "string", + "label": { + "zh_CN": "moving_mean 的名称", + "en_US": "name of moving_mean" + } + }, + { + "id": "moving_variance_name", + "type": "string", + "label": { + "zh_CN": "moving_var 的名称", + "en_US": "name of moving_var" + } + } + ] + }, + { + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "mode": "nn", + "properties": [] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "id": "Conv1D", + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "nnName": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "3D 卷积神经网络", + "en_US": "Conv 3D" + }, + "id": "Conv3D", + "nnName": "Conv3D", + "desc": "三维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "nnName": "Linear", + "desc": "线性变换", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "nnName": "Flatten", + "mode": "nn", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1 + } + ] + }, + { + "label": { + "zh_CN": "一维转置卷积层", + "en_US": "Conv1DTranspose" + }, + "id": "Conv1DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "二维转置卷积层", + "en_US": "Conv2DTranspose" + }, + "id": "Conv2DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "三维转置卷积层", + "en_US": "Conv3DTranspose" + }, + "id": "Conv3DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Bilinear", + "mode": "nn", + "label": { + "zh_CN": "双线性Tensor积", + "en_US": "Bilinear" + }, + "properties": [ + { + "id": "in1_features", + "type": "number", + "label": { + "zh_CN": "x1 元素的维度", + "en_US": "" + } + }, + { + "id": "in2_features", + "type": "number", + "label": { + "zh_CN": "x2 元素的维度", + "en_US": "" + } + }, + { + "id": "out_features", + "type": "number", + "label": { + "zh_CN": "输出 Tensor 的维度", + "en_US": "Size of output tensor" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "CELU", + "mode": "nn", + "label": { + "zh_CN": "CELU 激活函数", + "en_US": "CELU" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "CTCLoss", + "mode": "nn", + "label": { + "en_US": "CTC Loss", + "zh_CN": "CTC 损失函数" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "en_US": "Blank", + "zh_CN": "v" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "CosineEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "CosineEmbedding 损失", + "en_US": "CosineEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "ChannelShuffle", + "label": { + "zh_CN": "通道分组", + "en_US": "group by channel" + }, + "mode": "nn", + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "zh_CN": "分组数", + "en_US": "total group" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByGlobalNorm", + "label": { + "zh_CN": "ClipGradByGlobalNorm", + "en_US": "ClipGradByGlobalNorm" + }, + "properties": [ + { + "id": "clip_norm", + "type": "number", + "label": { + "zh_CN": "范数最大值", + "en_US": "clip norm" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByNorm", + "label": { + "zh_CN": "ClipGradByNorm", + "en_US": "ClipGradByNorm" + }, + "properties": [ + { + "id": "clip_norm", + "label": { + "zh_CN": "二范数最大值", + "en_US": "clip_norm" + }, + "type": "number" + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByValue", + "label": { + "en_US": "ClipGradByValue", + "zh_CN": "ClipGradByValue" + }, + "properties": [ + { + "id": "max", + "type": "number", + "label": { + "en_US": "max", + "zh_CN": "修剪的最大值" + } + }, + { + "id": "min", + "type": "number", + "label": { + "en_US": "min", + "zh_CN": "修建的最小值" + } + } + ] + }, + { + "mode": "nn", + "id": "CosineSimilarity", + "label": { + "en_US": "CosineSimilarity", + "zh_CN": "余弦相似度" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": 1 + }, + { + "id": "eps", + "type": "number", + "label": { + "zh_CN": "加在分母上的很小的数值, 防止分母为0的情况", + "en_US": "eps" + }, + "default": 1e-8 + } + ] + }, + { + "mode": "nn", + "id": "CrossEntropyLoss", + "label": { + "en_US": "CrossEntropyLoss", + "zh_CN": "交叉熵损失" + }, + "properties": [ + { + "id": "ignore_index", + "type": "number", + "label": { + "en_US": "ignore index", + "zh_CN": "忽略的标签值" + }, + "default": -100 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "soft_label", + "type": "boolean", + "default": false, + "label": { + "en_US": "soft label", + "zh_CN": "软标签" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": -1 + }, + { + "id": "use_softmax", + "type": "boolean", + "default": true, + "label": { + "zh_CN": "softmax 归一化", + "en_US": "use softmax normalization" + } + } + ] + }, + { + "id": "Dropout2D", + "mode": "nn", + "label": { + "zh_CN": "二维概率丢弃", + "en_US": "Dropout2D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout3D", + "mode": "nn", + "label": { + "zh_CN": "三维概率丢弃", + "en_US": "Dropout3D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout", + "mode": "nn", + "label": { + "zh_CN": "概率丢弃", + "en_US": "Dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "丢弃轴", + "en_US": "axis" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "upscale_in_train", + "label": "upscale_in_train", + "default": true + }, + { + "id": 1, + "value": "downscale_in_infer", + "label": "downscale_in_infer" + } + ] + } + ] + }, + { + "id": "ELU", + "mode": "nn", + "label": { + "zh_CN": "ELU 激活函数", + "en_US": "ELU activation" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Embedding", + "mode": "nn", + "label": { + "zh_CN": "嵌入层", + "en_US": "Embedding" + }, + "properties": [ + { + "id": "num_embeddings", + "type": "number", + "label": { + "zh_CN": "字典大小", + "en_US": "size of embeddings" + } + }, + { + "id": "embedding_dim", + "type": "number", + "label": { + "zh_CN": "嵌入向量的维度", + "en_US": "Dim of every embedding" + } + } + ] + }, + { + "id": "Fold", + "mode": "nn", + "label": { + "zh_CN": "区块合并", + "en_US": "fold" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "卷积核大小", + "en_US": "size of kernel" + } + }, + { + "id": "strides", + "type": "number", + "label": { + "zh_CN": "步长大小", + "en_US": "size of stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度扩张大小", + "en_US": "padding" + } + }, + { + "type": "number", + "default": 1, + "id": "dilations", + "label": { + "en_US": "dilations", + "zh_CN": "卷积膨胀" + } + } + ] + }, + { + "id": "FractionalMaxPool2D", + "mode": "nn", + "label": { + "zh_CN": "2维分数阶最大值池化", + "en_US": "FractionalMaxPool2D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "FractionalMaxPool3D", + "mode": "nn", + "label": { + "zh_CN": "3维分数阶最大值池化", + "en_US": "FractionalMaxPool3D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "GELU", + "mode": "nn", + "label": { + "zh_CN": "GELU 激活函数", + "en_US": "GELU activation" + }, + "properties": [ + { + "id": "approximate", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否启用近似计算", + "en_US": "approximate" + } + } + ] + }, + { + "id": "GLU", + "mode": "nn", + "label": { + "zh_CN": "GLU 激活层", + "en_US": "GLU Activation Operator" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "en_US": "axis", + "zh_CN": "沿着该轴将输入二等分" + } + } + ] + }, + { + "id": "GRUCell", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元", + "en_US": "GRUCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GRU", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元网络", + "en_US": "GRU" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GaussianNLLLoss", + "mode": "nn", + "label": { + "zh_CN": "高斯负对数似然损失", + "en_US": "GaussianNLLLoss" + }, + "properties": [ + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "Is the constant term included in the loss calculation", + "zh_CN": "是否在损失计算中包括常数项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 1e-6 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "GroupNorm", + "mode": "nn", + "label": { + "en_US": "Group Normalization", + "zh_CN": "组归一化" + }, + "properties": [ + { + "id": "num_groups", + "type": "number", + "label": { + "en_US": "num groups", + "zh_CN": "从通道中分离出的组数" + } + }, + { + "id": "num_channels", + "type": "number", + "label": { + "en_US": "num channels", + "zh_CN": "输入通道数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "HSigmoidLoss", + "label": { + "en_US": "hierarchical sigmoid", + "zh_CN": "层次Sigmoid" + }, + "mode": "nn", + "properties": [ + { + "id": "feature_size", + "type": "number", + "label": { + "en_US": "input tensor size", + "zh_CN": "输入tensor的特征尺寸" + } + }, + { + "id": "num_classes", + "type": "number", + "label": { + "en_US": "dictionary size", + "zh_CN": "字典大小" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "is_custom", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "自定义二叉树", + "en_US": "custom Binary tree" + } + }, + { + "id": "is_sparse", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用稀疏更新", + "en_US": "Whether to use the sparse update method" + } + } + ] + }, + { + "id": "Hardshrink", + "mode": "nn", + "label": { + "en_US": "Hardshrink", + "zh_CN": "Hardshrink 激活层" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 0.5, + "label": { + "en_US": "threshold", + "zh_CN": "threshold" + } + } + ] + }, + { + "id": "Hardsigmoid", + "mode": "nn", + "label": { + "en_US": "Hardsigmoid", + "zh_CN": "Hardsigmoid 激活层" + }, + "properties": [] + }, + { + "id": "Hardswish", + "mode": "nn", + "label": { + "zh_CN": "Hardswish 激活函数", + "en_US": "Hardswish" + }, + "properties": [] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh Activation", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "label": { + "en_US": "min value", + "zh_CN": "最小值" + }, + "type": "number", + "default": -1 + }, + { + "id": "max", + "label": { + "en_US": "max value", + "zh_CN": "最大值" + }, + "type": "number", + "default": 1 + } + ] + }, + { + "id": "HingeEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "非线形的铰链嵌入损失", + "en_US": "HingeEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Identity", + "mode": "nn", + "label": { + "zh_CN": "等效层", + "en_US": "Identity" + }, + "properties": [] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm2D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm2D", + "en_US": "InstanceNorm2D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "KLDivLoss", + "mode": "nn", + "label": { + "zh_CN": "Kullback-Leibler 散度损失", + "en_US": "Kullback-Leibler loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "L1Loss", + "mode": "nn", + "label": { + "en_US": "L1 loss", + "zh_CN": "L1 loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "LSTMCell", + "mode": "nn", + "label": { + "zh_CN": "长短期记忆网络单元", + "en_US": "LSTMCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LSTM", + "mode": "nn", + "label": { + "en_US": "LSTM", + "zh_CN": "LSTM" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LeakyReLU", + "mode": "nn", + "label": { + "zh_CN": "LeakyReLU 激活层", + "en_US": "LeakyReLU" + }, + "properties": [ + { + "id": "negative_slope", + "type": "number", + "default": 0.01, + "label": { + "zh_CN": "斜率", + "en_US": "slope" + } + } + ] + }, + { + "id": "LocalResponseNorm", + "mode": "nn", + "label": { + "en_US": "LocalResponseNorm", + "zh_CN": "局部响应正则化" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "zh_CN": "累加通道数", + "en_US": "Accumulated number of channels" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1e-4, + "label": { + "en_US": "Scaling parameters", + "zh_CN": "缩放参数" + } + }, + { + "id": "beta", + "type": "number", + "default": 0.75, + "label": { + "zh_CN": "指数", + "en_US": "exponent" + } + }, + { + "id": "k", + "type": "number", + "default": 1, + "label": { + "zh_CN": "位移", + "en_US": "k" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "LogSigmoid", + "label": { + "zh_CN": "LogSigmoid 激活层", + "en_US": "LogSigmoid" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "LogSoftmax", + "mode": "nn", + "label": { + "zh_CN": "LogSoftmax", + "en_US": "LogSoftmax_cn" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "MSELoss", + "mode": "nn", + "label": { + "zh_CN": "均方误差", + "en_US": "MSELoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MarginRankingLoss", + "mode": "nn", + "label": { + "zh_CN": "MarginRankingLoss", + "en_US": "MarginRankingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "label": { + "zh_CN": "加和的 margin 值", + "en_US": "The margin value of the sum" + }, + "default": 0 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MaxUnPool2D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool2D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool3D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool3D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool1D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool1D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "Maxout", + "mode": "nn", + "label": { + "zh_CN": "Maxout 激活层", + "en_US": "Maxout" + }, + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "en_US": "groups", + "zh_CN": "组数" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "指定通道所在维度的索引" + }, + "default": 1 + } + ] + }, + { + "id": "Mish", + "label": { + "en_US": "Mish", + "zh_CN": "Mish 激活层" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "MultiHeadAttention", + "label": { + "en_US": "MultiHeadAttention", + "zh_CN": "多头注意力" + }, + "mode": "nn", + "properties": [ + { + "id": "embed_dim", + "type": "number", + "label": { + "zh_CN": "输入维度", + "en_US": "embed_dim" + } + }, + { + "id": "num_heads", + "type": "number", + "label": { + "zh_CN": "head数量", + "en_US": "num_heads" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0, + "label": { + "zh_CN": "随机失活率", + "en_US": "dropout" + } + }, + { + "id": "kdim", + "type": "number", + "label": { + "zh_CN": "key的维度", + "en_US": "kdim" + } + }, + { + "id": "vdim", + "type": "number", + "label": { + "zh_CN": "value的维度", + "en_US": "vdim" + } + }, + { + "id": "need_weights", + "type": "boolean", + "label": { + "zh_CN": "是否返回注意力权重", + "en_US": "need_weights" + }, + "default": false + }, + { + "id": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "type": "ParamAttr" + } + ] + }, + { + "id": "PReLU", + "mode": "nn", + "label": { + "en_US": "PReLU", + "zh_CN": "PReLU" + }, + "properties": [ + { + "id": "num_parameters", + "type": "number", + "default": 1, + "label": { + "en_US": "num_parameters", + "zh_CN": "可训练 weight 数量" + } + }, + { + "id": "init", + "type": "number", + "default": 0.25, + "label": { + "zh_CN": "初始值", + "en_US": "init" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad1D", + "mode": "nn", + "label": { + "en_US": "Pad1D", + "zh_CN": "Pad1D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad2D", + "mode": "nn", + "label": { + "en_US": "Pad2D", + "zh_CN": "Pad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad3D", + "mode": "nn", + "label": { + "en_US": "Pad3D", + "zh_CN": "Pad3D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PairwiseDistance", + "mode": "nn", + "label": { + "zh_CN": "范数距离", + "en_US": "PairwiseDistance" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 2, + "label": { + "en_US": "p", + "zh_CN": "p阶的范数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "keep_dim", + "type": "boolean", + "label": { + "zh_CN": "是否保留输出 Tensor 减少的维度", + "en_US": "keep_dim" + } + } + ] + }, + { + "id": "PixelShuffle", + "label": { + "zh_CN": "PixelShuffle", + "en_US": "PixelShuffle" + }, + "mode": "nn", + "properties": [ + { + "id": "upscale_factor", + "type": "number", + "label": { + "en_US": "upscale_factor", + "zh_CN": "上采样增大因子" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PixelUnshuffle", + "mode": "nn", + "label": { + "zh_CN": "PixelUnshuffle", + "en_US": "PixelUnshuffle" + }, + "properties": [ + { + "id": "downscale_factor", + "type": "number", + "label": { + "zh_CN": "下采样因子", + "en_US": "downscale_factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PoissonNLLLoss", + "mode": "nn", + "label": { + "en_US": "PoissonNLLLoss", + "zh_CN": "PoissonNLL 损失函数" + }, + "properties": [ + { + "id": "log_input", + "type": "boolean", + "label": { + "zh_CN": "输入是否为对数函数映射后结果", + "en_US": "log_input" + }, + "default": true + }, + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "full", + "zh_CN": "是否在损失计算中包括 Stirling 近似项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "en_US": "epsilon", + "zh_CN": "在 log_input 为 true 时使用的常数小量" + }, + "default": 1e-8 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RNNTLoss", + "mode": "nn", + "label": { + "zh_CN": "RNNTLoss 损失", + "en_US": "RNNTLoss" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "zh_CN": "空格标记的 ID 值", + "en_US": "blank" + } + }, + { + "id": "fastemit_lambda", + "type": "number", + "default": 0.001, + "label": { + "en_US": "fastemit_lambda", + "zh_CN": "FastEmit 的正则化参数" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RReLU", + "mode": "nn", + "label": { + "zh_CN": "RReLU 激活层", + "en_US": "RReLU" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "padding", + "en_US": "padding" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": "constant", + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": "reflect", + "label": "reflect", + "value": "reflect" + }, + { + "id": "replicate", + "label": "replicate", + "value": "replicate" + }, + { + "id": "circular", + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "default": 0.0, + "label": { + "zh_CN": "value", + "en_US": "value" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCL", + "label": "NCL" + }, + { + "id": 1, + "value": "NLC", + "label": "NLC" + } + ] + } + ] + }, + { + "id": "ReLU6", + "mode": "nn", + "label": { + "en_US": "ReLU6", + "zh_CN": "ReLU6" + }, + "properties": [] + }, + { + "id": "SELU", + "mode": "nn", + "label": { + "en_US": "SELU", + "zh_CN": "SELU" + }, + "properties": [ + { + "id": "scale", + "type": "number", + "default": 1.0507009873554804934193349852946, + "label": { + "en_US": "scale", + "zh_CN": "scale" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1.6732632423543772848170429916717, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Sigmoid", + "mode": "nn", + "label": { + "en_US": "Sigmoid", + "zh_CN": "Sigmoid" + }, + "properties": [] + }, + { + "id": "Silu", + "mode": "nn", + "label": { + "en_US": "Silu", + "zh_CN": "Silu" + }, + "properties": [] + }, + { + "id": "SmoothL1Loss", + "mode": "nn", + "label": { + "zh_CN": "SmoothL1Loss", + "en_US": "SmoothL1Loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "delta", + "label": { + "en_US": "delta", + "zh_CN": "delta" + }, + "default": 1.0, + "type": "number" + } + ] + }, + { + "id": "SoftMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "SoftMarginLoss", + "en_US": "SoftMarginLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Softmax2D", + "mode": "nn", + "label": { + "en_US": "Softmax2D", + "zh_CN": "Softmax2D" + }, + "properties": [] + }, + { + "id": "Softmax", + "mode": "nn", + "label": { + "en_US": "Softmax", + "zh_CN": "Softmax 激活层" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "运算轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "Softplus", + "mode": "nn", + "label": { + "zh_CN": "Softplus 激活层", + "en_US": "Softplus" + }, + "properties": [ + { + "id": "beta", + "type": "number", + "default": 1, + "label": { + "en_US": "beta", + "zh_CN": "beta" + } + }, + { + "id": "threshold", + "type": "number", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "default": 20 + } + ] + }, + { + "id": "Softshrink", + "label": { + "zh_CN": "Softshrink 激活层", + "en_US": "Softshrink" + }, + "properties": [ + { + "id": "threshold", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "type": "number", + "default": 0.5 + } + ], + "mode": "nn" + }, + { + "id": "Softsign", + "mode": "nn", + "label": { + "zh_CN": "Softsign 激活层", + "en_US": "Softsign" + }, + "properties": [] + }, + { + "id": "Swish", + "mode": "nn", + "label": { + "zh_CN": "Swish", + "en_US": "Swish" + }, + "properties": [] + }, + { + "id": "SyncBatchNorm", + "mode": "nn", + "label": { + "en_US": "SyncBatchNorm", + "zh_CN": "SyncBatchNorm" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "type": "number", + "default": -1, + "label": { + "en_US": "min", + "zh_CN": "最小值" + } + }, + { + "id": "max", + "type": "number", + "default": 1, + "label": { + "zh_CN": "最大值", + "en_US": "最小值" + } + } + ] + }, + { + "id": "Tanhshrink", + "mode": "nn", + "label": { + "zh_CN": "Tanhshrink 激活层", + "en_US": "Tanhshrink" + }, + "properties": [] + }, + { + "id": "ThresholdedReLU", + "mode": "nn", + "label": { + "zh_CN": "ThresholdedReLU 激活层", + "en_US": "ThresholdedReLU" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + } + } + ] + }, + { + "id": "TransformerDecoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 解码器层", + "en_US": "TransformerDecoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "layer_norm_eps", + "type": "number", + "default": 0.0001, + "label": { + "en_US": "layer_norm_eps", + "zh_CN": "transformer decoder 中 layer normalization 层的 eps 参数值" + } + } + ] + }, + { + "id": "TransformerEncoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 编码器层", + "en_US": "TransformerEncoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Transformer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 模型", + "en_US": "Transformer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "p", + "label": { + "zh_CN": "范数", + "en_US": "p" + }, + "type": "number", + "default": 2 + }, + { + "id": "epsilon", + "type": "number", + "default": 1e-6, + "label": { + "zh_CN": "防止除数为0", + "en_US": "epsilon" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "distance_function", + "type": "number", + "label": { + "zh_CN": "欧氏距离范数", + "en_US": "distance_function" + } + }, + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Unfold", + "mode": "nn", + "label": { + "en_US": "Unfold", + "zh_CN": "Unfold" + }, + "properties": [ + { + "id": "kernel_sizes", + "type": "number", + "label": { + "zh_CN": "卷积核的尺寸", + "en_US": "kernel_sizes" + } + }, + { + "id": "dilations", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积膨胀", + "en_US": "dilations" + } + }, + { + "id": "paddings", + "type": "number", + "default": 0, + "label": { + "en_US": "paddings", + "zh_CN": "扩张" + } + }, + { + "id": "strides", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积步长", + "en_US": "strides" + } + } + ] + }, + { + "id": "UpsamplingBilinear2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingBilinear2D", + "zh_CN": "UpsamplingBilinear2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "UpsamplingNearest2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingNearest2D", + "zh_CN": "UpsamplingNearest2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "ZeroPad2D", + "mode": "nn", + "label": { + "zh_CN": "零填充", + "en_US": "ZeroPad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "size of padding" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "Upsample", + "label": { + "en_US": "Upsample", + "zh_CN": "上采样" + }, + "mode": "nn", + "properties": [ + { + "id": "size", + "type": "list", + "label": { + "zh_CN": "大小", + "en_US": "size" + }, + "default": [ + 0, + 0 + ], + "items": "number" + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "en_US": "scale_factor", + "zh_CN": "缩放因子" + } + }, + { + "id": "mode", + "type": "enums", + "label": { + "zh_CN": "采样方法", + "en_US": "mode" + }, + "enums": [ + { + "id": "bilinear", + "value": "bilinear", + "label": "bilinear" + }, + { + "id": "trilinear", + "value": "trilinear", + "label": "trilinear" + }, + { + "id": "nearest", + "value": "nearest", + "label": "nearest", + "default": true + }, + { + "id": "bicubic", + "value": "bicubic", + "label": "bicubic" + }, + { + "id": "linear", + "value": "linear", + "label": "linear" + }, + { + "id": "area", + "value": "area", + "label": "area" + } + ] + }, + { + "id": "align_corners", + "type": "boolean", + "label": { + "en_US": "align_corners", + "zh_CN": "对齐" + }, + "default": false + }, + { + "id": "align_mode", + "type": "number", + "default": 0, + "label": { + "en_US": "align_mode", + "zh_CN": "双线性插值" + } + }, + { + "id": "data_format", + "type": "enums", + "label": { + "en_US": "data format", + "zh_CN": "数据格式" + }, + "enums": [ + { + "id": "NCW", + "value": "NCW", + "label": "NCW" + }, + { + "id": "NWC", + "value": "NWC", + "label": "NWC" + }, + { + "id": "NCHW", + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": "NHWC", + "value": "NHWC", + "label": "NHWC" + }, + { + "id": "NCDHW", + "value": "NCDHW", + "label": "NCDHW" + }, + { + "id": "NDHWC", + "value": "NDHWC", + "label": "NDHWC" + } + ] + } + ] + }, + { + "id": "SpectralNorm", + "mode": "nn", + "label": { + "en_US": "SpectralNorm", + "zh_CN": "SpectralNorm" + }, + "properties": [ + { + "id": "weight_shape", + "type": "list", + "items": "number", + "label": { + "zh_CN": "权重参数的shape", + "en_US": "shape of weight attr" + } + }, + { + "id": "dim", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度索引", + "en_US": "dim" + } + }, + { + "id": "power_iters", + "default": 0, + "type": "number", + "label": { + "en_US": "power iters", + "zh_CN": "用于计算的 SpectralNorm 功率迭代次数" + } + }, + { + "id": "eps", + "type": "number", + "default": 1e-12, + "label": { + "zh_CN": "用于保证计算规范中的数值稳定性", + "en_US": "eps" + } + } + ] + }, + { + "id": "Unflatten", + "mode": "nn", + "label": { + "zh_CN": "Unflatten", + "en_US": "Unflatten" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "要展开维度的轴" + } + }, + { + "id": "shape", + "type": "list", + "items": "number", + "label": { + "en_US": "shape", + "zh_CN": "展开的shape" + } + } + ] + } + ], + "layer": [] + } +} \ No newline at end of file diff --git a/dl-flow-example/docker-compose.yaml b/dl-flow-example/docker-compose.yaml new file mode 100644 index 0000000..6482eda --- /dev/null +++ b/dl-flow-example/docker-compose.yaml @@ -0,0 +1,36 @@ +services: + mongodb: + image: mongo + ports: + - 27018:27017 + redis: + image: redis + ports: + - 6379:6379 + front: + image: gaonengwww/dl-flow-frontend + ports: + - 80:80 + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + server: + image: gaonengwww/dl-flow-backend + ports: + - 9000:9000 + environment: + - DB_URL=mongodb://mongodb:27017/dl-flow # 数据库地址 + - REDIS_HOST=redis # redis地址 (必填) + - REDIS_PORT=6379 # redis端口 (必填) + - REDIS_DB=0 # redis数据库 (必填) + - REDIS_PASSWORD="" # redis密码 + - JWT_EXPIRE_IN=1d # JWT 过期时间 (必填) + - JWT_SIGN_ALGORITHM=RS256 # JWT签名算法, 要与密钥对符合, 例如密钥对是RSA 2048bit, 那么此处应该是 RS256 (必填) + - JWT_PUB_KEY=./keys/pub.key # JWT 公钥 (必填) + - JWT_PRI_KEY=./keys/pri.key # JWT 私钥 (必填) + - PWD_SALT=salt # bcrypt 盐(必填) + - PWD_SALT_LEN=12 # bcrypt 盐(必填) + volumes: # 强烈将下述卷挂载到本地, 以避免数据丢失 + - ./public:/public # 代码生成暂存位置 + - ./keys:/keys # 密钥对存放位置 + - ./data:/data # bundle.json与install.lock 存放位置 + - ./examples:/examples diff --git a/dl-flow-example/examples/MNIST.json b/dl-flow-example/examples/MNIST.json new file mode 100644 index 0000000..b06d099 --- /dev/null +++ b/dl-flow-example/examples/MNIST.json @@ -0,0 +1,1524 @@ +{ + "meta": { + "start": "b0f69335-4b2a-4e91-b774-847f18533f28", + "end": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2" + }, + "payload": { + "cells": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "6a320cbe-f9dd-4f28-b4dd-2edc908b0e6f", + "zIndex": -1, + "source": { + "cell": "b0f69335-4b2a-4e91-b774-847f18533f28", + "port": "out" + }, + "target": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "2b094e64-696c-4095-a85c-f0ef2a21f8b8", + "zIndex": -1, + "source": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "out" + }, + "target": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "fec1dd68-f34d-4efa-aaf9-f81287eaa159", + "zIndex": -1, + "source": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "out" + }, + "target": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "7faf88ac-736a-4f38-a4b0-b21d30e593f5", + "zIndex": -1, + "source": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "out" + }, + "target": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "f7097353-134e-4440-903c-3b6ea61b7085", + "zIndex": -1, + "source": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "out" + }, + "target": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "0259c115-41d6-4d98-bd69-1b2e8d03f746", + "zIndex": -1, + "source": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "out" + }, + "target": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "421789b8-267d-47d2-98c8-b121c03b2854", + "zIndex": -1, + "source": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "out" + }, + "target": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "e1e890ad-7673-4188-861e-86b471f59ccd", + "zIndex": -1, + "source": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "out" + }, + "target": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "b808c035-bea3-4e45-b450-40b93ca39ba0", + "zIndex": -1, + "source": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "out" + }, + "target": { + "cell": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "port": "in" + } + }, + { + "position": { + "x": 10, + "y": -90 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "b0f69335-4b2a-4e91-b774-847f18533f28", + "data": { + "_id": "661632e009b6b04d369ce9d9", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 1 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 6 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number", + "data": 1 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true, + "data": "\"zeros\"" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 1 + }, + { + "position": { + "x": 10, + "y": 10 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "data": { + "_id": "661632e009b6b04d369ce9d7", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 2 + }, + { + "position": { + "x": 10, + "y": 100 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "data": { + "_id": "661632e009b6b04d369ce9cf", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "id": "MaxPool2D", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + }, + "data": 2 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + }, + "data": 2 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 3 + }, + { + "position": { + "x": 10, + "y": 180 + }, + "size": { + "width": 112, + "height": 48 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "data": { + "_id": "661632e009b6b04d369ce9d9", + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 6 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255, + "data": 16 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3, + "data": 5 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0, + "data": 0 + }, + { + "id": "padding", + "label": { + "zh_CN": "填充", + "en_US": "padding" + }, + "type": "number", + "data": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "\"zeros\"", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "\"reflect\"" + }, + { + "id": 3, + "label": "replicate", + "value": "\"replicate\"" + }, + { + "id": 4, + "label": "circular", + "value": "\"circular\"" + } + ], + "required": true, + "data": "\"zeros\"" + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 4 + }, + { + "position": { + "x": 10, + "y": 290 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "data": { + "_id": "661632e009b6b04d369ce9d7", + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "properties": [], + "mode": "nn", + "__v": 0 + }, + "zIndex": 5 + }, + { + "position": { + "x": 10, + "y": 380 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "data": { + "_id": "661632e009b6b04d369ce9cf", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "id": "MaxPool2D", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + }, + "data": 2 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + }, + "data": 2 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 6 + }, + { + "position": { + "x": 10, + "y": 470 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "19ff38f1-26da-4e73-b296-b8e10501574e", + "data": { + "_id": "661632e009b6b04d369ce9dc", + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1, + "data": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1, + "data": -1 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 7 + }, + { + "position": { + "x": 10, + "y": 540 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 400 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 120 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 8 + }, + { + "position": { + "x": 10, + "y": 610 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 120 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 84 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 9 + }, + { + "position": { + "x": 10, + "y": 680 + }, + "size": { + "width": 110, + "height": 32 + }, + "view": "vue-shape-view", + "shape": "dag-node", + "ports": { + "groups": { + "top": { + "position": "top", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + }, + "bottom": { + "position": "bottom", + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#C2C8D5", + "strokeWidth": 1, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "in", + "group": "top" + }, + { + "id": "out", + "group": "bottom" + } + ] + }, + "id": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "data": { + "_id": "661632e009b6b04d369ce9db", + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "desc": "线性变换", + "nn": true, + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 84 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255, + "data": 10 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr", + "data": { + "name": "", + "learning_rate": 1, + "trainable": true, + "do_model_average": true, + "need_clip": true + } + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true, + "data": 0 + } + ], + "mode": "nn", + "__v": 0 + }, + "zIndex": 10 + } + ], + "edges": [ + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "6a320cbe-f9dd-4f28-b4dd-2edc908b0e6f", + "zIndex": -1, + "source": { + "cell": "b0f69335-4b2a-4e91-b774-847f18533f28", + "port": "out" + }, + "target": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "2b094e64-696c-4095-a85c-f0ef2a21f8b8", + "zIndex": -1, + "source": { + "cell": "0d125a6a-c126-40b2-b8fb-04acfc9f18ee", + "port": "out" + }, + "target": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "fec1dd68-f34d-4efa-aaf9-f81287eaa159", + "zIndex": -1, + "source": { + "cell": "5c317b1e-4ff2-4bf6-8636-aa5d523101d1", + "port": "out" + }, + "target": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "7faf88ac-736a-4f38-a4b0-b21d30e593f5", + "zIndex": -1, + "source": { + "cell": "f2e4e734-2f5f-4a49-be37-854012fce6cc", + "port": "out" + }, + "target": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "f7097353-134e-4440-903c-3b6ea61b7085", + "zIndex": -1, + "source": { + "cell": "fb7920f1-fb11-4ac3-b59f-6b47b6fdd4ec", + "port": "out" + }, + "target": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "0259c115-41d6-4d98-bd69-1b2e8d03f746", + "zIndex": -1, + "source": { + "cell": "4e566507-bbcf-4b7c-8efc-b7466ad57312", + "port": "out" + }, + "target": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "421789b8-267d-47d2-98c8-b121c03b2854", + "zIndex": -1, + "source": { + "cell": "19ff38f1-26da-4e73-b296-b8e10501574e", + "port": "out" + }, + "target": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "e1e890ad-7673-4188-861e-86b471f59ccd", + "zIndex": -1, + "source": { + "cell": "597e8829-e0b4-44e9-b26d-9f2a708a5c94", + "port": "out" + }, + "target": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "in" + } + }, + { + "shape": "dag-edge", + "attrs": { + "line": { + "strokeDasharray": "5 5" + } + }, + "id": "b808c035-bea3-4e45-b450-40b93ca39ba0", + "zIndex": -1, + "source": { + "cell": "534e08e2-3e9e-4e7f-8d84-06fb3da87452", + "port": "out" + }, + "target": { + "cell": "e26f3956-fea8-4f81-9b15-6fe1cd4790e2", + "port": "in" + } + } + ] + } +} \ No newline at end of file diff --git a/dl-flow-example/keys/pri.key b/dl-flow-example/keys/pri.key new file mode 100644 index 0000000..4920c5d --- /dev/null +++ b/dl-flow-example/keys/pri.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAr2epjP5hwAOfq7pM/9yy3LdkWTap+bYS1HUuqQRlddB10iPU +RwGE+KwadSeXCXLNk+j8nXoeXYfBx9wQUqj0yP0voSVfa6NgKa9FSnyLLmD+ac1c +uCfNfa21pgS9Te1NbVEMyV+ihDWXTpFwAZJo925VGVE/xaR2EcSC1lQGFAce+zRk +sIoFp3iwcRA92a8RWVJAhjNrj8MSJBzcNHPc26rnAMVwaeQS4GHNqJsOYZUJNr9q +wHWlcw6eyH6qjvX2VF1y1kkobK0/hpe8abQ447UWh19Tpo/xd5e5KWjuFqe8CV6z +vOoAWIy33HZ0IJwjbTPTYv9iV0vNDz/Cn5xHfwIDAQABAoIBAQCFbjf+d2xootkN +y5TTdlHhsOh3LSw0Nxsv30x1alC8RK28A2Fx+mfquxENWeZ9W4WjJLM2IDWFNMZm +gLMyDjDXzDI1RbbGrOt0Ck6NkRxXVZVzarNDq5OYLVJnTmerJf+mTueJMGTyacoG +DIDF0VhkENxPfA0lDix666AT5qsRA+8kDdgH6le1Bht2KgdsOkBj+pNZ0uJ63Xnt +hUcwWDMQ9jXGbdCRTBP/gX6ncsoyZXGiAyWL1nTThxZFoaCdbJJr8Cp2k9Fu93TJ +8Hg7DqylKeQ4bDiXWi+l8MpG2J2Coz5rIw7qa8sByQhHZtqtqbCbUc/JWaLI8804 +RnIGYoPhAoGBANuxByRUZ1dCxUxvB2CEJhujIwOy1EwCY59qJy8tza2pc2Dg/AnR +DUmaVpbwVqhX3ejR8sUopVbEFx6AC6c1eenp/V46Wpvrz+WQpN7HvBrlT/Qmmroa +BE2R6NcPIn/i2LFMfosqJyOzLn4kz1eEcLQnO7q0ruy0rvo0Vto+oDVXAoGBAMxk +54xuUltAM8C0Fok7W8TIxKtcCHlK7R5ac+51P/McWxXJqiokZQI2al1HXJ32U9Ns +SD+Ywi7GUjoqheX4094yrZtJMgMoprIfFXRGesDA2sJ3B/H3LL2Ka/kemr7I18v8 +eFbClbpttFwJl1jPX7piAQkwFBzEFvlYvUof1D4ZAoGAKWA6/x2iZO3faNjUY9of +rz7XXl/02eftSV3dyWXwAdATOeDFtzeXMBCQVFcpiwUZdzrrZTSVhzThQc5N440P +y/1UycVlwU31VsAaPRcTF2Gu4EXRCFHUE6PyXWatUbawpxvIDX+/5Vpe3EUkg9Ae +xd9JwY08ELqq5darsOjwlXsCgYBpxQW1vBlOM0kUvZyz40235ZUwf+26prVR8cjw +ayhurAvOmI9AQ5kprfMY1ibtb10tmWlBz9Ec13ARvZOQ0FUDNQJ1y0jgLZclscQu +aZJ4UNRjsakg46H5a7o4Lkgx1kklvD6h1wwYb1DYF/aD9Lw6/SBAGustf6PL4MoD +o7j3cQKBgQC9pR15ir4kcqpfz3vdZzGz48F6oH4s7TahQCzdA3UpTgH64QmedY2l +S0EeHQxOIFGO9IITRAL5a0y8S0quU/JKeg13WGqQ7pL1P/4Oy2nmZOnG1j1elvgw +SY9tSfoO0maE2gUFJ7NwMSWi7spiBezQ6Zx2CH4Dc4Qyq26zabnV+A== +-----END RSA PRIVATE KEY----- diff --git a/dl-flow-example/keys/pub.key b/dl-flow-example/keys/pub.key new file mode 100644 index 0000000..11b0605 --- /dev/null +++ b/dl-flow-example/keys/pub.key @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr2epjP5hwAOfq7pM/9yy +3LdkWTap+bYS1HUuqQRlddB10iPURwGE+KwadSeXCXLNk+j8nXoeXYfBx9wQUqj0 +yP0voSVfa6NgKa9FSnyLLmD+ac1cuCfNfa21pgS9Te1NbVEMyV+ihDWXTpFwAZJo +925VGVE/xaR2EcSC1lQGFAce+zRksIoFp3iwcRA92a8RWVJAhjNrj8MSJBzcNHPc +26rnAMVwaeQS4GHNqJsOYZUJNr9qwHWlcw6eyH6qjvX2VF1y1kkobK0/hpe8abQ4 +47UWh19Tpo/xd5e5KWjuFqe8CV6zvOoAWIy33HZ0IJwjbTPTYv9iV0vNDz/Cn5xH +fwIDAQAB +-----END PUBLIC KEY----- diff --git a/dl-flow-example/nginx.conf b/dl-flow-example/nginx.conf new file mode 100644 index 0000000..75715f8 --- /dev/null +++ b/dl-flow-example/nginx.conf @@ -0,0 +1,33 @@ +worker_processes auto; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + gzip on; + server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + location ~ /endpoint/ { + rewrite ^/endpoint/(.*)$ /$1 break; + proxy_pass http://server:9000; + } + location ~ /socket.io { + proxy_pass http://server:9001; + + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + } +} \ No newline at end of file diff --git a/dl-flow-frontend/.build_config/build.sh b/dl-flow-frontend/.build_config/build.sh new file mode 100644 index 0000000..836100d --- /dev/null +++ b/dl-flow-frontend/.build_config/build.sh @@ -0,0 +1,14 @@ +if [ ! $version ]; +then npm version 0.1.0-`date "+%Y%m%d%H%M%S"`; +else npm version $version; +fi + +npm install + +if [ $? -ne 0 ] +then + echo "[ERROR] build falid!" + exit 1 +fi +echo '[INFO] build completed' + diff --git a/dl-flow-frontend/.cid/lowcode-design-core.yml b/dl-flow-frontend/.cid/lowcode-design-core.yml new file mode 100644 index 0000000..de9333b --- /dev/null +++ b/dl-flow-frontend/.cid/lowcode-design-core.yml @@ -0,0 +1,23 @@ +version: 1.0 +name: tiny-engine +language: nodejs + +# 构建工具 +dependencies: + base: + nodejs: best + +# 构建机器 +machine: + standard: + euler: + - default + +# 构建脚本 +scripts: + - sh ./.build_config/build.sh + +# 构建产物 +artifacts: + npm_deploy: + - config_path: ./package.json diff --git a/dl-flow-frontend/.codecheck/check.yml b/dl-flow-frontend/.codecheck/check.yml new file mode 100644 index 0000000..7ecb342 --- /dev/null +++ b/dl-flow-frontend/.codecheck/check.yml @@ -0,0 +1,11 @@ +version: 2.0 + +steps: + pre_codecheck: + - checkout + +tool_params: + secsolar: + source_dir: ./ + cmetrics: + exclude: vite.config.js|package.json|index.js|mockServer/assets diff --git a/dl-flow-frontend/.eslintignore b/dl-flow-frontend/.eslintignore new file mode 100644 index 0000000..997d732 --- /dev/null +++ b/dl-flow-frontend/.eslintignore @@ -0,0 +1,9 @@ +.vscode +dist +public +package-lock.json +**/node_modules/** +tmp +temp +mockServer +packages/vue-generator/**/output/** diff --git a/dl-flow-frontend/.eslintrc.js b/dl-flow-frontend/.eslintrc.js new file mode 100644 index 0000000..e6e8e1b --- /dev/null +++ b/dl-flow-frontend/.eslintrc.js @@ -0,0 +1,32 @@ +module.exports = { + env: { + browser: true, + es2015: true, + worker: true, + node: true, + jest: true + }, + extends: ['eslint:recommended', 'plugin:vue/vue3-essential'], + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@babel/eslint-parser', + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + babelOptions: { + parserOpts: { + plugins: ['jsx'] + } + } + }, + plugins: ['vue'], + rules: { + 'no-console': 'error', + 'no-debugger': 'error', + 'space-before-function-paren': 'off', + 'vue/multi-word-component-names': 'off', + 'no-use-before-define': 'error', + 'no-unused-vars': ['error', { ignoreRestSiblings: true, varsIgnorePattern: '^_', argsIgnorePattern: '^_' }], + 'no-undef': 'off' // e.g. defineEmits + } +} diff --git a/dl-flow-frontend/.github/ISSUE_TEMPLATE/bug-report.yml b/dl-flow-frontend/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..00f3a62 --- /dev/null +++ b/dl-flow-frontend/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,73 @@ +name: '🐛 Bug report' +description: Create a report to help us improve Tiny Engine +title: '🐛 [Bug]: ' +labels: ['🐛 bug'] +body: + - type: markdown + attributes: + value: | + Please fill out the following carefully in order to better fix the problem. + - type: input + id: Environment + attributes: + label: Environment + description: | + **Depending on your browser and operating system, websites may behave differently from one environment to another. Make sure your developers know your technical environment.** + placeholder: Please browser information. + validations: + required: true + - type: input + id: node-version + attributes: + label: Version + description: | + ### **Check if the issue is reproducible with the latest stable version.** + You can use the command `node -v` to view it + placeholder: latest + validations: + required: true + - type: input + id: tiny-vue-version + attributes: + label: Version + description: | + ### **Check if the issue is reproducible with the latest stable version.** + You can use the command `npm ls @opentiny/vue` to view it + placeholder: latest + validations: + required: true + - type: textarea + id: minimal-repo + attributes: + label: Link to minimal reproduction + description: | + **Provide a streamlined CodePen / CodeSandbox or GitHub repository link as much as possible. Please don't fill in a link randomly, it will only close your issue directly.** + placeholder: Please Input + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: Step to reproduce + description: | + **After the replay is turned on, what actions do we need to perform to make the bug appear? Simple and clear steps can help us locate the problem more quickly. Please clearly describe the steps of reproducing the issue. Issues without clear reproducing steps will not be repaired. If the issue marked with 'need reproduction' does not provide relevant steps within 7 days, it will be closed directly.** + placeholder: Please Input + validations: + required: true + - type: textarea + id: expected + attributes: + label: What is expected + placeholder: Please Input + - type: textarea + id: actually + attributes: + label: What is actually happening + placeholder: Please Input + - type: textarea + id: additional-comments + attributes: + label: Any additional comments (optional) + description: | + **Some background / context of how you ran into this bug.** + placeholder: Please Input diff --git a/dl-flow-frontend/.github/ISSUE_TEMPLATE/config.yml b/dl-flow-frontend/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..1f52164 --- /dev/null +++ b/dl-flow-frontend/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Questions or need help + url: https://github.com/opentiny/tiny-engine/discussions + about: Add this WeChat(opentiny), we will invite you to the WeChat discussion group later. diff --git a/dl-flow-frontend/.github/ISSUE_TEMPLATE/feature-request.yml b/dl-flow-frontend/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..1a31450 --- /dev/null +++ b/dl-flow-frontend/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,23 @@ +name: ✨ Feature Request +description: Propose new features to @opentiny/tiny-engine to improve it. +title: '✨ [Feature]: ' +labels: ['✨ feature'] +body: + - type: textarea + id: feature-solve + attributes: + label: What problem does this feature solve + description: | + Explain your use case, context, and rationale behind this feature request. More importantly, what is the end user experience you are trying to build that led to the need for this feature? + placeholder: Please Input + validations: + required: true + - type: textarea + id: feature-api + attributes: + label: What does the proposed API look like + description: | + Describe how you propose to solve the problem and provide code samples of how the API would work once implemented. Note that you can use Markdown to format your code blocks. + placeholder: Please Input + validations: + required: true diff --git a/dl-flow-frontend/.github/PULL_REQUEST_TEMPLATE.md b/dl-flow-frontend/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f4e2f22 --- /dev/null +++ b/dl-flow-frontend/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,52 @@ +English | [简体中文](https://github.com/opentiny/tiny-engine/blob/develop/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md) + +# PR + +## PR Checklist + +Please check if your PR fulfills the following requirements: + +- [ ] The commit message follows our [Commit Message Guidelines](https://github.com/opentiny/tiny-engine/blob/develop/CONTRIBUTING.md) +- [ ] Tests for the changes have been added (for bug fixes / features) +- [ ] Docs have been added / updated (for bug fixes / features) +- [ ] Built its own designer, fully self-validated + +## PR Type + +What kind of change does this PR introduce? + + + +- [ ] Bugfix +- [ ] Feature +- [ ] Code style update (formatting, local variables) +- [ ] Refactoring (no functional changes, no api changes) +- [ ] Build related changes +- [ ] CI related changes +- [ ] Documentation content changes +- [ ] Other... Please describe: + +## Background and solution + + +### What is the current behavior? + + + +Issue Number: N/A + +### What is the new behavior? + + +## Does this PR introduce a breaking change? + +- [ ] Yes +- [ ] No + + + +## Other information diff --git a/dl-flow-frontend/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md b/dl-flow-frontend/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 0000000..6ceff4d --- /dev/null +++ b/dl-flow-frontend/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -0,0 +1,52 @@ +[English](https://github.com/opentiny/tiny-engine/blob/develop/.github/PULL_REQUEST_TEMPLATE.md) | 简体中文 + +# PR + +## PR Checklist + +请检查您的 PR 是否满足以下要求: + +- [ ] commit message遵循我们的[提交贡献指南](https://github.com/opentiny/tiny-engine/blob/develop/CONTRIBUTING.md) +- [ ] 添加了更改内容的测试用例(用于bugfix/功能) +- [ ] 文档已添加/更新(用于bugfix/功能) +- [ ] 是否构建了自己的设计器,经过了充分的自验证 + +## PR 类型 + +这个PR的类型是? + +- [ ] 日常 bug 修复 +- [ ] 新特性支持 +- [ ] 代码风格优化 +- [ ] 重构 +- [ ] 构建优化 +- [ ] 测试用例 +- [ ] 文档更新 +- [ ] 分支合并 +- [ ] 其他改动(请补充) + + +## 需求背景和解决方案 + + + + +Issue Number: N/A + +### 修改前 + + +### 修改后 + +## 此PR是否含有 breaking change? + +- [ ] 是 +- [ ] 否 + + + +## Other information diff --git a/dl-flow-frontend/.github/release.yml b/dl-flow-frontend/.github/release.yml new file mode 100644 index 0000000..274543b --- /dev/null +++ b/dl-flow-frontend/.github/release.yml @@ -0,0 +1,26 @@ +changelog: + exclude: + labels: + - ignore-for-release + authors: + - allcontributors[bot] + categories: + - title: Breaking Changes 🛠 + labels: + - Semver-Major + - breaking-change + - title: Exciting New Features 🎉 + labels: + - Semver-Minor + - feature + - enhancement + - title: Bug Fixes 🐛 + labels: + - Semver-Patch + - bug + - title: Other Changes + labels: + - documentation + - refactoring + - unit-test + - ci diff --git a/dl-flow-frontend/.github/workflows/ai-code-review.yml b/dl-flow-frontend/.github/workflows/ai-code-review.yml new file mode 100644 index 0000000..29777ff --- /dev/null +++ b/dl-flow-frontend/.github/workflows/ai-code-review.yml @@ -0,0 +1,23 @@ +name: AI Code Review + +permissions: + contents: read + pull-requests: write + +on: + pull_request: + types: [opened, reopened, synchronize] + +jobs: + review: + runs-on: ubuntu-latest + steps: + - uses: anc95/ChatGPT-CodeReview@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + LANGUAGE: Chinese + OPENAI_API_ENDPOINT: https://api.openai.com/v1 + MODEL: gpt-3.5-turbo + MAX_TOKENS: 4096 + MAX_PATCH_LENGTH: 10000 diff --git a/dl-flow-frontend/.github/workflows/issue-translator.yml b/dl-flow-frontend/.github/workflows/issue-translator.yml new file mode 100644 index 0000000..8b3397b --- /dev/null +++ b/dl-flow-frontend/.github/workflows/issue-translator.yml @@ -0,0 +1,18 @@ +name: 'issue-translator' +on: + issue_comment: + types: [created] + issues: + types: [opened] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: usthe/issues-translate-action@v2.7 + with: + IS_MODIFY_TITLE: false + # 非必须,决定是否需要修改issue标题内容 + # 若是true,则机器人账户@Issues-translate-bot必须拥有修改此仓库issue权限。可以通过邀请@Issues-translate-bot加入仓库协作者实现。 + CUSTOM_BOT_NOTE: Bot detected the issue body's language is not English, translate it automatically. + # 非必须,自定义机器人翻译的前缀开始内容。 diff --git a/dl-flow-frontend/.github/workflows/push-check.yml b/dl-flow-frontend/.github/workflows/push-check.yml new file mode 100644 index 0000000..7f0d4ed --- /dev/null +++ b/dl-flow-frontend/.github/workflows/push-check.yml @@ -0,0 +1,36 @@ +name: Push And Create PR Check + +on: + push: + branches: [] + pull_request: + branches: [develop,main] + +jobs: + push-check: + runs-on: ubuntu-latest # windows-latest || macos-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 16 + + - name: Install pnpm + run: npm i -g pnpm + + - name: Install dependencies + run: pnpm i + + - name: Get changed files + id: get_changed_files + uses: tj-actions/changed-files@v40 + with: + files: | + **.js + **.vue + **.jsx + - name: Run ESLint + run: npx eslint ${{steps.get_changed_files.outputs.all_changed_files}} + - name: Run Build + run: pnpm run build:plugin && pnpm run build:alpha diff --git a/dl-flow-frontend/.gitignore b/dl-flow-frontend/.gitignore new file mode 100644 index 0000000..3e3d94e --- /dev/null +++ b/dl-flow-frontend/.gitignore @@ -0,0 +1,28 @@ +.DS_Store +node_modules +dist/ +package-lock.json +yarn.lock +pnpm-lock.yaml +lerna-debug.log + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +tmp +temp diff --git a/dl-flow-frontend/.husky/pre-commit b/dl-flow-frontend/.husky/pre-commit new file mode 100644 index 0000000..9179da3 --- /dev/null +++ b/dl-flow-frontend/.husky/pre-commit @@ -0,0 +1,6 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +# npm run lint +npx lint-staged -q + diff --git a/dl-flow-frontend/.npmignore b/dl-flow-frontend/.npmignore new file mode 100644 index 0000000..06d519d --- /dev/null +++ b/dl-flow-frontend/.npmignore @@ -0,0 +1,23 @@ +.build_config +.cid +.codecheck +.husky +.vscode +# 只忽略根目录的 dist 文件夹 +/dist +test +node_modules +.editorconfig +.eslintignore +.eslintrc.js +.prettierignore +.prettierrc +jsconfig.json +package-lock.json + +# 忽略可能存在的其它编辑器文件夹 +.idea + +/packages/design-core/public/mock/* +**/**/tmp +**/**/temp \ No newline at end of file diff --git a/dl-flow-frontend/.prettierignore b/dl-flow-frontend/.prettierignore new file mode 100644 index 0000000..2f118da --- /dev/null +++ b/dl-flow-frontend/.prettierignore @@ -0,0 +1,3 @@ +dist +package-lock.json +**/node_modules/** \ No newline at end of file diff --git a/dl-flow-frontend/.prettierrc b/dl-flow-frontend/.prettierrc new file mode 100644 index 0000000..d2baaec --- /dev/null +++ b/dl-flow-frontend/.prettierrc @@ -0,0 +1,5 @@ +semi: false +singleQuote: true +printWidth: 120 +trailingComma: 'none' +endOfLine: 'auto' \ No newline at end of file diff --git a/dl-flow-frontend/CHNAGELOG.md b/dl-flow-frontend/CHNAGELOG.md new file mode 100644 index 0000000..3f29a69 --- /dev/null +++ b/dl-flow-frontend/CHNAGELOG.md @@ -0,0 +1,17 @@ +# 更新日志 + +## v1.0.0-alpha.0 + +`2023/09/25` + +### 📢 破坏性变更 + +无 + +### ✨ 新特性 + +- 首个版本提交 + +### 🐞 缺陷修复 + +无 diff --git a/dl-flow-frontend/CONTRIBUTING.md b/dl-flow-frontend/CONTRIBUTING.md new file mode 100644 index 0000000..3070a8c --- /dev/null +++ b/dl-flow-frontend/CONTRIBUTING.md @@ -0,0 +1,80 @@ +# Contributing + +We are glad that you are willing to contribute to the TinyEngine open source project. There are many forms of contribution. You can choose one or more of them based on your strengths and interests: + +- Report [new defect](https://github.com/opentiny/tiny-engine/issues/new?template=bug-report.yml). +- Provide more detailed information for the [existing defects](https://github.com/opentiny/tiny-engine/labels/bug), such as supplementary screenshots, more detailed reproduction steps, minimum reproducible demo links, etc. +- Submit Pull requests to fix typos in the document or make the document clearer and better. +- Add the official assistant WeChat `opentiny-official` and join the technical exchange group to participate in the discussion. + +When you personally use the TinyEngine component library and participate in many of the above contributions, as you become familiar with TinyEngine , you can try to do something more challenging, such as: + +- Fix the defect. You can start with [Good-first issue](https://github.com/opentiny/tiny-engine/labels/good%20first%20issue). +- Implementation of new features +- Complete unit tests. +- Translate documents +- Participate in code review. + +## Bug Reports + +If you encounter problems in the process of using TinyEngine components, you are welcome to submit Issue to us. Before submitting Issue, please read the relevant [official documentation](https://opentiny.design/tiny-engine) carefully to confirm whether this is a defect or an unimplemented function. + +If it is a defect, select [Bug report](https://github.com/opentiny/tiny-engine/issues/new?template=bug-report.yml) template when creating a new Issue. The title follows the format of `[toolkitName/pluginName/EngineCore] defect description`. For example: `[tiny-engine-toolbar-refresh] The refresh function cannot be used`. + +Issue that reports defects mainly needs to fill in the following information: + +- Version numbers of `tiny-engine` and `node`. +- The performance of the defect can be illustrated by screenshot, and if there is an error, the error message can be posted. +- Defect reproduction step, preferably with a minimum reproducible demo link. + +If it is a new feature, select [Feature request](https://github.com/opentiny/tiny-engine/issues/new?template=feature-request.yml) template. The title follows the format of `[toolkitName/pluginName/EngineCore] new feature description`. For example: `[tiny-engine-theme] New Blue Theme`. + +The following information is required for the Issue of the new feature: + +- What problems does this feature mainly solve for users? +- What is the api of this feature? + +## Pull Requests + +Before submitting pull request, please make sure that your submission is in line with the overall plan of TinyEngine. Generally, issues that marked as [bug](https://github.com/opentiny/tiny-engine/labels/bug) are encouraged to submit pull requests. If you are not sure, you can create a [Discussion](https://github.com/opentiny/tiny-engine/discussions) for discussion. + +Local startup steps: + +- Click the Fork button in the upper right corner of the [TinyEngine](https://github.com/opentiny/tiny-engine) code repository to fork the upstream warehouse to the personal warehouse. +- Clone personal warehouse to local +- Run `npm install` under the TinyEngine root directory to install node dependencies. +- Run `npm install` under the TinyEngine mockServer to install node dependencies +- Run `npm run serve` under the TinyEngine root directory, and then `run npm run dev` in the mockServer directory to start local development. + +```shell +# username indicates the user name. Replace it before running the command. +git clone git@github.com:username/tiny-engine.git +cd tiny-engine +git remote add upstream git@github.com:opentiny/tiny-engine.git +pnpm i + +# Start the project. +$ pnpm dev + +``` + +To submit a PR: + +- Create a new branch `git checkout -b username/feature1`. The name of the branch should be `username/feat-xxx` / `username/fix-xxx`. +- Local coding. +- Submit according to [Commit Message Format](https://www.conventionalcommits.org/zh-hans/v1.0.0/) specification. PR that do not conform to the submission specification will not be merged. +- Submit to remote repository: `git push origin branchName`. +- (Optional) Synchronize upstream repository dev branch latest code: `git pull upstream develop`. +- Open the [Pull requests](https://github.com/opentiny/tiny-engine/pulls) link of the TinyEngine code repository and click the New pull request button to submit the PR. +- Project Committer conducts Code Review and makes comments. +- The PR author adjusts the code according to the opinion. Please note that when a branch initiates PR, the subsequent commit will be synchronized automatically, and there is no need to resubmit the PR. +- Project administrator merges PR. + +The contribution process is over, thank you for your contribution! + +## Join the open source community + +If you are interested in our open source projects, please join our open source community in the following ways. + +- Add the official assistant WeChat: opentiny-official, join our technical exchange group +- Join the mailing list: opentiny@googlegroups.com diff --git a/dl-flow-frontend/CONTRIBUTING.zh-CN.md b/dl-flow-frontend/CONTRIBUTING.zh-CN.md new file mode 100644 index 0000000..6729ec5 --- /dev/null +++ b/dl-flow-frontend/CONTRIBUTING.zh-CN.md @@ -0,0 +1,79 @@ +# 贡献指南 + +很高兴你有意愿参与 TinyEngine 开源项目的贡献,参与贡献的形式有很多种,你可以根据自己的特长和兴趣选择其中的一个或多个: + +- 报告[新缺陷](https://github.com/opentiny/tiny-engine/issues/new?template=bug-report.yml) +- 为[已有缺陷](https://github.com/opentiny/tiny-engine/labels/bug)提供更详细的信息,比如补充截图、提供更详细的复现步骤、提供最小可复现 demo 链接等 +- 提交 Pull requests 修复文档中的错别字或让文档更清晰和完善 +- 添加官方小助手微信 opentiny-official,加入技术交流群参与讨论 + +当你亲自使用 TinyEngine 组件库,并参与多次以上形式的贡献,对 TinyEngine 逐渐熟悉之后,可以尝试做一些更有挑战的事情,比如: + +- 修复缺陷,可以先从 [Good-first issue](https://github.com/opentiny/tiny-engine/labels/good%20first%20issue) 开始 +- 实现新特性 +- 完善单元测试 +- 翻译文档 +- 参与代码检视 + +## 提交 Issue + +如果你在使用 TinyEngine 组件过程中遇到问题,欢迎给我们提交 Issue,提交 Issue 之前,请先仔细阅读相关的[官方文档](https://opentiny.design/tiny-engine),确认这是一个缺陷还是尚未实现的功能。 + +如果是一个缺陷,创建新 Issue 时选择 [Bug report](https://github.com/opentiny/tiny-engine/issues/new?template=bug-report.yml) 模板,标题遵循 `[toolkitName/pluginName/EngineCore]缺陷简述` 的格式,比如:`[tiny-engine-toolbar-refresh] 刷新功能无法使用`。 + +报告缺陷的 Issue 主要需要填写以下信息: + +- tiny-engine 和 node 的版本号 +- 缺陷的表现,可截图辅助说明,如果有报错可贴上报错信息 +- 缺陷的复现步骤,最好能提供一个最小可复现 demo 链接 + +如果是一个新特性,则选择 [Feature request](https://github.com/opentiny/tiny-engine/issues/new?template=feature-request.yml) 模板,标题遵循 `[toolkitName/pluginName/EngineCore]新特性简述` 的格式,比如:`[tiny-engine-theme] 新增蓝色主题`。 + +新特性的 Issue 主要需要填写以下信息: + +- 该特性主要解决用户的什么问题 +- 该特性的 api 是什么样的 + +## 提交 PR + +提交 PR 之前,请先确保你提交的内容是符合 TinyEngine 整体规划的,一般已经标记为 [bug](https://github.com/opentiny/tiny-engine/labels/bug) 的 Issue 是鼓励提交 PR 的,如果你不是很确定,可以创建一个 [Discussion](https://github.com/opentiny/tiny-engine/discussions) 进行讨论。 + +本地启动步骤: + +- 点击 [TinyEngine](https://github.com/opentiny/tiny-engine) 代码仓库右上角的 Fork 按钮,将上游仓库 Fork 到个人仓库 +- Clone 个人仓库到本地 +- 在 TinyEngine 根目录下运行 `pnpm i`, 安装依赖 +- 在 TinyEngine 根目录下运行 `pnpm dev`,启动本地开发 + +```shell +# username 为用户名,执行前请替换 +git clone git@github.com:username/tiny-engine.git +cd tiny-engine +git remote add upstream git@github.com:opentiny/tiny-engine.git +pnpm i + +# 启动项目 +$ pnpm dev + +``` + +提交 PR 的步骤: + +- 创建新分支 `git checkout -b username/feature1`,分支名字建议为 `username/feat-xxx` / `username/fix-xxx` +- 本地编码 +- 遵循 Commit Message Format 规范进行提交,不符合提交规范的 PR 将不会被合并 +- 提交到远程仓库:git push origin branchName +- (可选)同步上游仓库 develop 分支最新代码:git pull upstream develop +- 打开 TinyEngine 代码仓库的 [Pull requests](https://github.com/opentiny/tiny-engine/pulls) 链接,点击 New pull request 按钮提交 PR +- 项目 Committer 进行 Code Review,并提出意见 +- PR 作者根据意见调整代码,请注意一个分支发起了 PR 后,后续的 commit 会自动同步,无需重新提交 PR +- 项目管理员合并 PR + +贡献流程结束,感谢你的贡献! + +## 加入开源社区 + +如果你对我们的开源项目感兴趣,欢迎通过以下方式加入我们的开源社区。 + +- 添加官方小助手微信:opentiny-official,加入我们的技术交流群 +- 加入邮件列表:opentiny@googlegroups.com \ No newline at end of file diff --git a/dl-flow-frontend/LICENSE b/dl-flow-frontend/LICENSE new file mode 100644 index 0000000..91221a7 --- /dev/null +++ b/dl-flow-frontend/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 - present TinyEngine Authors. +Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dl-flow-frontend/docker-compose.yaml b/dl-flow-frontend/docker-compose.yaml new file mode 100644 index 0000000..42465a4 --- /dev/null +++ b/dl-flow-frontend/docker-compose.yaml @@ -0,0 +1,11 @@ +version: '3' + +services: + front: + build: + context: . + dockerfile: dockerfile + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + ports: + - 80:80 \ No newline at end of file diff --git a/dl-flow-frontend/jsconfig.json b/dl-flow-frontend/jsconfig.json new file mode 100644 index 0000000..afcd804 --- /dev/null +++ b/dl-flow-frontend/jsconfig.json @@ -0,0 +1,75 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "jsx": "react", + "paths": { + "@/*": ["packages/*"], + "@opentiny/tiny-engine-canvas": ["packages/canvas/src/index.js"], + "@opentiny/tiny-engine-controller": ["packages/controller/src/index"], + "@opentiny/tiny-engine-plugin-materials": ["packages/plugins/materials/index"], + "@opentiny/tiny-engine-plugin-data": ["packages/plugins/data/index"], + "@opentiny/tiny-engine-plugin-script": ["packages/plugins/script/index"], + "@opentiny/tiny-engine-plugin-tree": ["packages/plugins/tree/index"], + "@opentiny/tiny-engine-plugin-help": ["packages/plugins/help/index"], + "@opentiny/tiny-engine-plugin-schema": ["packages/plugins/schema/index"], + "@opentiny/tiny-engine-plugin-page": ["packages/plugins/page/index"], + "@opentiny/tiny-engine-plugin-i18n": ["packages/plugins/i18n/index"], + "@opentiny/tiny-engine-plugin-bridge": ["packages/plugins/bridge/index"], + "@opentiny/tiny-engine-setting-events": ["packages/settings/events/index"], + "@opentiny/tiny-engine-setting-props": ["packages/settings/props/index"], + "@opentiny/tiny-engine-common": ["packages/common/index"], + "@opentiny/tiny-engine-setting-styles": ["packages/settings/styles/index"], + "@opentiny/tiny-engine-toolbar-breadcrumb": ["packages/toolbars/breadcrumb/index"], + "@opentiny/tiny-engine-toolbar-fullscreen": ["packages/toolbars/fullscreen/index"], + "@opentiny/tiny-engine-toolbar-lang": ["packages/toolbars/lang/index"], + "@opentiny/tiny-engine-toolbar-layout": ["packages/toolbars/layout/index"], + "@opentiny/tiny-engine-toolbar-checkinout": ["packages/toolbars/lock/index"], + "@opentiny/tiny-engine-toolbar-logo": ["packages/toolbars/logo/index"], + "@opentiny/tiny-engine-toolbar-media": ["packages/toolbars/media/index"], + "@opentiny/tiny-engine-toolbar-preview": ["packages/toolbars/preview/index"], + "@opentiny/tiny-engine-toolbar-generate-vue": ["packages/toolbars/generate-vue/index"], + "@opentiny/tiny-engine-toolbar-clean": ["packages/toolbars/clean/index"], + "@opentiny/tiny-engine-toolbar-save": ["packages/toolbars/save/index"], + "tiny-engine-canvas": ["packages/canvas/index"], + "@opentiny/tiny-engine-theme-dark": ["packages/theme/dark/index.less"], + "@opentiny/tiny-engine-theme-light": ["packages/theme/light/index.less"], + "@opentiny/tiny-engine-svgs": ["packages/svgs/index"], + "@opentiny/tiny-engine-http": ["packages/http/src/index"], + "@opentiny/tiny-engine-controller/*": ["packages/controller/src/*"], + "@opentiny/tiny-engine-plugin-materials/*": ["packages/plugins/materials/*"], + "@opentiny/tiny-engine-plugin-data/*": ["packages/plugins/data/*"], + "@opentiny/tiny-engine-plugin-script/*": ["packages/plugins/script/*"], + "@opentiny/tiny-engine-plugin-tree/*": ["packages/plugins/tree/*"], + "@opentiny/tiny-engine-plugin-help/*": ["packages/plugins/help/*"], + "@opentiny/tiny-engine-plugin-schema/*": ["packages/plugins/schema/*"], + "@opentiny/tiny-engine-plugin-page/*": ["packages/plugins/page/*"], + "@opentiny/tiny-engine-plugin-i18n/*": ["packages/plugins/i18n/*"], + "@opentiny/tiny-engine-plugin-bridge/*": ["packages/plugins/bridge/*"], + "@opentiny/tiny-engine-setting-events/*": ["packages/settings/events/*"], + "@opentiny/tiny-engine-setting-props/*": ["packages/settings/props/*"], + "@opentiny/tiny-engine-common/*": ["packages/common/*"], + "@opentiny/tiny-engine-setting-styles/*": ["packages/settings/styles/*"], + "@opentiny/tiny-engine-toolbar-breadcrumb/*": ["packages/toolbars/breadcrumb/*"], + "@opentiny/tiny-engine-toolbar-fullscreen/*": ["packages/toolbars/fullscreen/*"], + "@opentiny/tiny-engine-toolbar-lang/*": ["packages/toolbars/lang/*"], + "@opentiny/tiny-engine-toolbar-layout/*": ["packages/toolbars/layout/*"], + "@opentiny/tiny-engine-toolbar-checkinout/*": ["packages/toolbars/lock/*"], + "@opentiny/tiny-engine-toolbar-logo/*": ["packages/toolbars/logo/*"], + "@opentiny/tiny-engine-toolbar-media/*": ["packages/toolbars/media/*"], + "@opentiny/tiny-engine-toolbar-preview/*": ["packages/toolbars/preview/*"], + "@opentiny/tiny-engine-toolbar-clean/*": ["packages/toolbars/clean/*"], + "@opentiny/tiny-engine-toolbar-save/*": ["packages/toolbars/save/*"], + "@opentiny/tiny-engine-theme-dark/*": ["packages/theme/dark/*"], + "@opentiny/tiny-engine-theme-light/*": ["packages/theme/light/*"], + "@opentiny/tiny-engine-svgs/*": ["packages/svgs/*"], + "@opentiny/tiny-engine-http/*": ["packages/http/*"], + "@opentiny/tiny-engine-utils": ["packages/utils/src/index.js"], + "@opentiny/tiny-engine-webcomponent-core": ["packages/webcomponent/src/lib"], + "@opentiny/tiny-engine-i18n-host": ["packages/i18n/src/lib"], + "dl-flow-toolbar-export": ["packages/toolbars/export/index.js"], + "dl-flow-toolbar-save": ["packages/toolbars/save/index.js"] + } + }, + "include": ["packages/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/dl-flow-frontend/lerna.json b/dl-flow-frontend/lerna.json new file mode 100644 index 0000000..74c0687 --- /dev/null +++ b/dl-flow-frontend/lerna.json @@ -0,0 +1,15 @@ +{ + "command": { + "version": { + "message": "chore(release): publish" + } + }, + "useNx": false, + "version": "independent", + "npmClient": "pnpm", + "publish": { + "npmClient": "pnpm" + }, + "ignoreChanges": ["**/*.md", "**/test/**", ".npmrc"], + "granularPathspec": false +} diff --git a/dl-flow-frontend/lint-staged.config.js b/dl-flow-frontend/lint-staged.config.js new file mode 100644 index 0000000..d673344 --- /dev/null +++ b/dl-flow-frontend/lint-staged.config.js @@ -0,0 +1,4 @@ +module.exports = { + './packages/**/**.{js,vue,jsx}': 'eslint', + './packages/**/**.{vue,js,ts,html,json,less}': 'prettier --write' +} diff --git a/dl-flow-frontend/logo.svg b/dl-flow-frontend/logo.svg new file mode 100644 index 0000000..59d1b06 --- /dev/null +++ b/dl-flow-frontend/logo.svg @@ -0,0 +1,44 @@ + + + logo-top + + + + + + + + + + + + + + + + + + + + + + + + + + + + OpenTiny + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/mockServer/.babelrc b/dl-flow-frontend/mockServer/.babelrc new file mode 100644 index 0000000..f9f35a2 --- /dev/null +++ b/dl-flow-frontend/mockServer/.babelrc @@ -0,0 +1,21 @@ +{ + "presets": [ + ["@babel/preset-env", { + "targets": { + "node": "current" + } + }] + ], + "env": { + "test": { + "presets": [ + ["@babel/preset-env", { + "targets": { + "node": "current" + } + }] + ] + } + }, + "plugins": ["@babel/plugin-transform-runtime"] +} \ No newline at end of file diff --git a/dl-flow-frontend/mockServer/.editorconfig b/dl-flow-frontend/mockServer/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/dl-flow-frontend/mockServer/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/dl-flow-frontend/mockServer/.eslintignore b/dl-flow-frontend/mockServer/.eslintignore new file mode 100644 index 0000000..e59172b --- /dev/null +++ b/dl-flow-frontend/mockServer/.eslintignore @@ -0,0 +1,3 @@ +build/*.js +assets/*.js +test/**/*.js \ No newline at end of file diff --git a/dl-flow-frontend/mockServer/.eslintrc.js b/dl-flow-frontend/mockServer/.eslintrc.js new file mode 100644 index 0000000..997ea0e --- /dev/null +++ b/dl-flow-frontend/mockServer/.eslintrc.js @@ -0,0 +1,36 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + ecmaVersion: 2017, //指定ECMAScript支持的版本,6为ES6,这里为了兼容async和await,设置为2017 + sourceType: 'module' + }, + extends: 'standard', + plugins: ['html', 'promise'], + env: { + node: true + }, + rules: { + // allow console + 'no-console': 0, + // allow paren-less arrow functions + 'arrow-parens': 0, + // allow async-await + 'generator-star-spacing': 0, + // allow debugger during development + 'no-debugger': 0, + camelcase: 'off' + } +} diff --git a/dl-flow-frontend/mockServer/.gitignore b/dl-flow-frontend/mockServer/.gitignore new file mode 100644 index 0000000..89e6609 --- /dev/null +++ b/dl-flow-frontend/mockServer/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log +test/unit/coverage +test/e2e/reports +selenium-debug.log +.idea/ +package-lock.json \ No newline at end of file diff --git a/dl-flow-frontend/mockServer/.jsbeautifyrc b/dl-flow-frontend/mockServer/.jsbeautifyrc new file mode 100644 index 0000000..f4b0e8c --- /dev/null +++ b/dl-flow-frontend/mockServer/.jsbeautifyrc @@ -0,0 +1,11 @@ +{ + "indent_size": 2, + "indent_char": " ", + "other": " ", + "indent_level": 0, + "indent_with_tabs": false, + "preserve_newlines": true, + "max_preserve_newlines": 2, + "jslint_happy": true, + "indent_handlebars": true +} diff --git a/dl-flow-frontend/mockServer/assets/css/0.1.20/index.css b/dl-flow-frontend/mockServer/assets/css/0.1.20/index.css new file mode 100644 index 0000000..9a0397a --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/css/0.1.20/index.css @@ -0,0 +1,24981 @@ +[class*='tiny-'] { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +[class*='tiny-'] :after, +[class*='tiny-'] :before { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +[class*='tiny-'] a { + cursor: pointer; + background-image: none; + text-decoration: none; + outline: 0; +} +[class*='tiny-'] a:active, +[class*='tiny-'] a:focus, +[class*='tiny-'] a:hover { + outline: 0; + text-decoration: none; +} +[class*='tiny-'] dd, +[class*='tiny-'] dl, +[class*='tiny-'] dt, +[class*='tiny-'] li, +[class*='tiny-'] ol, +[class*='tiny-'] td, +[class*='tiny-'] th, +[class*='tiny-'] ul { + margin: 0; + padding: 0; +} +[class*='tiny-'] ol, +[class*='tiny-'] ul { + list-style: none; +} +[class*='tiny-'] audio, +[class*='tiny-'] canvas, +[class*='tiny-'] video { + display: inline-block; +} +[class*='tiny-'] audio:not([controls]) { + display: none; + height: 0; +} +[class*='tiny-'] mark { + background: #ff0; + color: #000; +} +[class*='tiny-'] pre { + white-space: pre-wrap; +} +[class*='tiny-'] sub, +[class*='tiny-'] sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +[class*='tiny-'] sup { + top: -0.5em; +} +[class*='tiny-'] sub { + bottom: -0.25em; +} +[class*='tiny-'] fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +[class*='tiny-'] legend { + border: 0; + padding: 0; +} +[class*='tiny-'] input::-ms-clear, +[class*='tiny-'] input::-ms-reveal { + display: none; +} +[class*='tiny-'] button::-moz-focus-inner, +[class*='tiny-'] input::-moz-focus-inner { + border: 0; + padding: 0; +} +[class*='tiny-'] textarea { + overflow: auto; + vertical-align: top; +} +[class*='tiny-'] table { + border-collapse: collapse; + border-spacing: 0; +} +[class*='tiny-'] .tiny-hide { + display: none; +} +[class*='tiny-'] .popper__arrow, +[class*='tiny-'] .popper__arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +@media (min-width: 768px) { + [class*='tiny-'] ::-webkit-scrollbar { + width: 4px; + height: 4px; + } + [class*='tiny-'] ::-webkit-scrollbar-track-piece { + background: #fafafa; + } + [class*='tiny-'] ::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: 6px; + } + [class*='tiny-'] ::-webkit-scrollbar-thumb:hover { + background: #999; + } + [class*='tiny-'] ::-webkit-scrollbar-thumb:active { + background: #999; + } + [class*='tiny-'] .tiny-scrollbar::-webkit-scrollbar { + width: 8px; + height: 8px; + } + [class*='tiny-'] .tiny-scrollbar::-webkit-scrollbar-track-piece { + background: 0 0; + border: 0; + } + [class*='tiny-'] .tiny-scrollbar::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: 4px; + } + [class*='tiny-'] .tiny-scrollbar::-webkit-scrollbar-thumb:hover { + background: #999; + } + [class*='tiny-'] .tiny-scrollbar::-webkit-scrollbar-thumb:active { + background: #999; + } + [class*='tiny-'] .tiny-min-scrollbar::-webkit-scrollbar { + width: 4px; + height: 4px; + } + [class*='tiny-'] .tiny-min-scrollbar::-webkit-scrollbar-track-piece { + background: 0 0; + border: 0; + } + [class*='tiny-'] .tiny-min-scrollbar::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: 2px; + } + [class*='tiny-'] .tiny-min-scrollbar::-webkit-scrollbar-thumb:hover { + background: #999; + } + [class*='tiny-'] .tiny-min-scrollbar::-webkit-scrollbar-thumb:active { + background: #999; + } +} +:root { + --ti-base-color-white: #fff; + --ti-base-color-brand-6: #5e7ce0; + --ti-base-color-brand-8: #344899; + --ti-base-color-brand-7: #526ecc; + --ti-base-color-brand-5: #7693f5; + --ti-base-color-brand-4: #96adfa; + --ti-base-color-brand-3: #beccfa; + --ti-base-color-brand-2: #e9edfa; + --ti-base-color-brand-1: #f2f5fc; + --ti-base-color-common-9: #181818; + --ti-base-color-common-8: #282b33; + --ti-base-color-common-7: #252b3a; + --ti-base-color-common-6: #464c59; + --ti-base-color-common-5: #575d6c; + --ti-base-color-common-4: #5c6173; + --ti-base-color-common-3: #8a8e99; + --ti-base-color-common-2: #adb0b8; + --ti-base-color-common-1: #dfe1e6; + --ti-base-color-bg-9: #b12220; + --ti-base-color-bg-8: #c7000b; + --ti-base-color-bg-7: #d64a52; + --ti-base-color-bg-6: #eef0f5; + --ti-base-color-bg-5: #f5f5f6; + --ti-base-color-bg-4: #fafafa; + --ti-base-color-bg-3: #ffffff; + --ti-base-color-bg-2: #ffffff; + --ti-base-color-bg-1: #ffffff; + --ti-base-color-error-4: #de504e; + --ti-base-color-error-3: #f66f6a; + --ti-base-color-error-2: #ffbcba; + --ti-base-color-error-1: #ffeeed; + --ti-base-color-success-4: #3ac295; + --ti-base-color-success-3: #50d4ab; + --ti-base-color-success-2: #acf2dc; + --ti-base-color-success-1: #edfff9; + --ti-base-color-warn-5: #e37d29; + --ti-base-color-warn-4: #fa9841; + --ti-base-color-warn-3: #fac20a; + --ti-base-color-warn-2: #ffd0a6; + --ti-base-color-warn-1: #fff3e8; + --ti-base-color-prompt-4: var(--ti-base-color-brand-7); + --ti-base-color-prompt-3: var(--ti-base-color-brand-6); + --ti-base-color-prompt-2: var(--ti-base-color-brand-3); + --ti-base-color-prompt-1: #ebf6ff; + --ti-base-color-prompt-icon-from: #7769e8; + --ti-base-color-prompt-icon-to: #58bbff; + --ti-base-color-icon-info: #6cbfff; + --ti-base-color-data-3: #a6dd82; + --ti-base-color-data-4: #f3689a; + --ti-base-color-data-5: #a97af8; + --ti-base-color-transparent: transparent; + --ti-common-color-success: var(--ti-base-color-success-3); + --ti-common-color-text-success: var(--ti-base-color-success-4); + --ti-common-color-success-bg: var(--ti-base-color-success-1); + --ti-common-color-success-border: var(--ti-base-color-success-2); + --ti-common-color-error: var(--ti-base-color-error-3); + --ti-common-color-error-text: var(--ti-base-color-error-4); + --ti-common-color-error-bg: var(--ti-base-color-error-1); + --ti-common-color-error-border: var(--ti-base-color-error-3); + --ti-common-color-error-border-secondary: var(--ti-base-color-error-2); + --ti-common-color-info: var(--ti-base-color-info-normal); + --ti-common-color-info-text: var(--ti-base-color-common-7); + --ti-common-color-info-bg: rgba(51, 51, 51, 0.06); + --ti-common-color-info-border: #d3d4d6; + --ti-common-color-warn: var(--ti-base-color-warn-4); + --ti-common-color-warn-text: var(--ti-base-color-warn-5); + --ti-common-color-warn-bg: var(--ti-base-color-warn-1); + --ti-common-color-warn-border: var(--ti-base-color-warn-2); + --ti-common-color-warn-secondary: var(--ti-base-color-warn-3); + --ti-common-color-prompt: var(--ti-base-color-prompt-3); + --ti-common-color-prompt-text: var(--ti-base-color-prompt-4); + --ti-common-color-prompt-bg: var(--ti-base-color-prompt-1); + --ti-common-color-prompt-border: var(--ti-base-color-prompt-2); + --ti-common-color-prompt-icon-from: var(--ti-base-color-prompt-icon-from); + --ti-common-color-prompt-icon-to: var(--ti-base-color-prompt-icon-to); + --ti-common-color-text-primary: var(--ti-base-color-common-7); + --ti-common-color-text-secondary: var(--ti-base-color-common-5); + --ti-common-color-text-weaken: var(--ti-base-color-common-3); + --ti-common-color-text-disabled: var(--ti-base-color-common-2); + --ti-common-color-text-darkbg: var(--ti-base-color-common-2); + --ti-common-color-text-darkbg-disabled: var(--ti-base-color-common-5); + --ti-common-color-text-link: var(--ti-base-color-brand-7); + --ti-common-color-text-link-hover: var(--ti-base-color-brand-8); + --ti-common-color-text-link-darkbg: var(--ti-base-color-brand-4); + --ti-common-color-text-link-darkbg-hover: var(--ti-base-color-brand-3); + --ti-common-color-text-highlight: var(--ti-base-color-brand-7); + --ti-common-color-text-white: var(--ti-base-color-white); + --ti-common-color-text-gray: var(--ti-base-color-white); + --ti-common-color-text-gray-disabled: var(--ti-base-color-common-4); + --ti-common-color-text-important: var(--ti-base-color-error-4); + --ti-common-color-icon-normal: var(--ti-base-color-common-5); + --ti-common-color-icon-hover: var(--ti-base-color-brand-6); + --ti-common-color-icon-active: var(--ti-base-color-brand-6); + --ti-common-color-icon-disabled: var(--ti-base-color-common-2); + --ti-common-color-icon-white: var(--ti-base-color-white); + --ti-common-color-icon-graybg-normal: var(--ti-base-color-common-2); + --ti-common-color-icon-graybg-hover: var(--ti-base-color-brand-6); + --ti-common-color-icon-graybg-active: var(--ti-base-color-brand-6); + --ti-common-color-icon-graybg-disabled: var(--ti-base-color-common-1); + --ti-common-color-icon-darkbg-normal: var(--ti-base-color-common-2); + --ti-common-color-icon-darkbg-hover: var(--ti-base-color-brand-5); + --ti-common-color-icon-darkbg-active: var(--ti-base-color-brand-5); + --ti-common-color-icon-darkbg-disabled: var(--ti-base-color-common-5); + --ti-common-color-icon-info: var(--ti-base-color-icon-info); + --ti-common-color-line-normal: var(--ti-base-color-common-2); + --ti-common-color-line-hover: var(--ti-base-color-common-5); + --ti-common-color-line-active: var(--ti-base-color-brand-6); + --ti-common-color-line-disabled: var(--ti-base-color-common-1); + --ti-common-color-line-dividing: var(--ti-base-color-common-1); + --ti-common-color-dash-line-normal: var(--ti-base-color-common-5); + --ti-common-color-dash-line-hover: var(--ti-base-color-brand-7); + --ti-common-color-bg-normal: var(--ti-base-color-bg-6); + --ti-common-color-bg-emphasize: var(--ti-base-color-brand-6); + --ti-common-color-bg-disabled: var(--ti-base-color-bg-5); + --ti-common-color-bg-hover: var(--ti-base-color-brand-8); + --ti-common-color-bg-gray: var(--ti-base-color-bg-4); + --ti-common-color-bg-secondary: var(--ti-base-color-common-2); + --ti-common-bg-primary: var(--ti-base-color-bg-8); + --ti-common-bg-primary-hover: var(--ti-base-color-bg-7); + --ti-common-bg-primary-active: var(--ti-base-color-bg-9); + --ti-common-bg-minor: var(--ti-base-color-bg-2); + --ti-common-bg-minor-hover: var(--ti-base-color-bg-1); + --ti-common-bg-minor-active: var(--ti-base-color-bg-3); + --ti-common-color-bg-white-normal: var(--ti-base-color-white); + --ti-common-color-bg-white-emphasize: var(--ti-base-color-brand-1); + --ti-common-color-bg-light-normal: var(--ti-base-color-brand-2); + --ti-common-color-bg-light-emphasize: var(--ti-base-color-brand-3); + --ti-common-color-bg-dark-normal: var(--ti-base-color-common-6); + --ti-common-color-bg-dark-emphasize: var(--ti-base-color-common-4); + --ti-common-color-bg-dark-active: var(--ti-common-color-bg-normal); + --ti-common-color-bg-dark-deep: var(--ti-base-color-common-6); + --ti-common-color-bg-dark-disabled: var(--ti-base-color-common-1); + --ti-common-color-bg-navigation: var(--ti-base-color-common-8); + --ti-common-color-bg-dark-select: var(--ti-base-color-common-9); + --ti-common-color-data-1: var(--ti-base-color-success-3); + --ti-common-color-data-2: var(--ti-base-color-icon-info); + --ti-common-color-data-3: var(--ti-base-color-data-3); + --ti-common-color-data-4: var(--ti-base-color-data-4); + --ti-common-color-data-5: var(--ti-base-color-data-5); + --ti-common-color-data-6: var(--ti-base-color-warn-3); + --ti-common-color-data-7: var(--ti-base-color-warn-4); + --ti-common-color-data-8: var(--ti-base-color-error-3); + --ti-common-color-transparent: var(--ti-base-color-transparent); + --ti-common-border-radius-normal: 2px; + --ti-common-border-radius-0: 0px; + --ti-common-border-radius-1: 4px; + --ti-common-border-radius-2: 8px; + --ti-common-border-radius-3: 50%; + --ti-common-font-size-base: 12px; + --ti-common-font-size-1: 14px; + --ti-common-font-size-2: 16px; + --ti-common-font-size-3: 18px; + --ti-common-font-size-4: 20px; + --ti-common-font-size-5: 24px; + --ti-common-font-size-6: 32px; + --ti-common-font-size-7: 36px; + --ti-common-line-height-number: 1.5; + --ti-common-space-base: 4px; + --ti-common-space-2x: calc(var(--ti-common-space-base) * 2); + --ti-common-space-3x: calc(var(--ti-common-space-base) * 3); + --ti-common-space-4x: calc(var(--ti-common-space-base) * 4); + --ti-common-space-5x: calc(var(--ti-common-space-base) * 5); + --ti-common-space-6x: calc(var(--ti-common-space-base) * 6); + --ti-common-space-8x: calc(var(--ti-common-space-base) * 8); + --ti-common-space-10x: calc(var(--ti-common-space-base) * 10); + --ti-common-space-0: 0px; + --ti-common-space-1: 1px; + --ti-common-space-6: 6px; + --ti-common-space-10: 10px; + --ti-common-shadow-1-up: 0 -1px 4px 0 rgba(0, 0, 0, 0.1); + --ti-common-shadow-1-down: 0 1px 4px 0 rgba(0, 0, 0, 0.1); + --ti-common-shadow-1-left: -1px 0px 4px 0 rgba(0, 0, 0, 0.1); + --ti-common-shadow-1-right: 1px 0px 4px 0 rgba(0, 0, 0, 0.1); + --ti-common-shadow-2-up: 0 -2px 8px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-2-down: 0 2px 8px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-2-left: -2px 0 8px 0 rgba(238, 10, 10, 0.2); + --ti-common-shadow-2-right: 2px 0 8px 0 rgba(252, 5, 5, 0.2); + --ti-common-shadow-3-up: 0 -4px 16px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-3-down: 0 4px 16px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-3-left: -4px 0 16px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-3-right: 4px 0 16px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-4-up: 0 -8px 40px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-4-down: 0 8px 40px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-4-left: -8px 0 40px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-4-right: 8px 0 40px 0 rgba(0, 0, 0, 0.2); + --ti-common-shadow-error: 0 1px 3px 0 rgba(199, 54, 54, 0.25); + --ti-common-shadow-warn: 0 1px 3px 0 rgba(204, 100, 20, 0.25); + --ti-common-shadow-prompt: 0 1px 3px 0 rgba(70, 94, 184, 0.25); + --ti-common-shadow-success: 0 1px 3px 0 rgba(39, 176, 128, 0.25); + --ti-common-font-family: 'Helvetica', 'Arial', 'PingFangSC-Regular', 'Hiragino Sans GB', 'Microsoft YaHei', + '寰蒋闆呴粦', 'Microsoft JhengHei'; + --ti-common-font-weight-1: 100; + --ti-common-font-weight-2: 200; + --ti-common-font-weight-3: 300; + --ti-common-font-weight-4: normal; + --ti-common-font-weight-5: 500; + --ti-common-font-weight-6: 600; + --ti-common-font-weight-7: bold; + --ti-common-font-weight-8: 800; + --ti-common-font-weight-9: 900; + --ti-common-border-weight-normal: 1px; + --ti-common-border-weight-1: 2px; + --ti-common-border-weight-2: 3px; + --ti-common-border-style-dashed: dashed; + --ti-common-border-style-dotted: dotted; + --ti-common-border-style-solid: solid; + --ti-common-size-base: 4px; + --ti-common-size-2x: calc(var(--ti-common-size-base) * 2); + --ti-common-size-3x: calc(var(--ti-common-size-base) * 3); + --ti-common-size-4x: calc(var(--ti-common-size-base) * 4); + --ti-common-size-5x: calc(var(--ti-common-size-base) * 5); + --ti-common-size-6x: calc(var(--ti-common-size-base) * 6); + --ti-common-size-7x: calc(var(--ti-common-size-base) * 7); + --ti-common-size-8x: calc(var(--ti-common-size-base) * 8); + --ti-common-size-9x: calc(var(--ti-common-size-base) * 9); + --ti-common-size-10x: calc(var(--ti-common-size-base) * 10); + --ti-common-size-11x: calc(var(--ti-common-size-base) * 11); + --ti-common-size-12x: calc(var(--ti-common-size-base) * 12); + --ti-common-size-13x: calc(var(--ti-common-size-base) * 13); + --ti-common-size-14x: calc(var(--ti-common-size-base) * 14); + --ti-common-size-15x: calc(var(--ti-common-size-base) * 15); + --ti-common-size-16x: calc(var(--ti-common-size-base) * 16); + --ti-common-size-17x: calc(var(--ti-common-size-base) * 17); + --ti-common-size-18x: calc(var(--ti-common-size-base) * 18); + --ti-common-size-19x: calc(var(--ti-common-size-base) * 19); + --ti-common-size-20x: calc(var(--ti-common-size-base) * 20); + --ti-common-size-21x: calc(var(--ti-common-size-base) * 21); + --ti-common-size-22x: calc(var(--ti-common-size-base) * 22); + --ti-common-size-23x: calc(var(--ti-common-size-base) * 23); + --ti-common-size-24x: calc(var(--ti-common-size-base) * 24); + --ti-common-size-25x: calc(var(--ti-common-size-base) * 25); + --ti-common-size-26x: calc(var(--ti-common-size-base) * 26); + --ti-common-size-27x: calc(var(--ti-common-size-base) * 27); + --ti-common-size-28x: calc(var(--ti-common-size-base) * 28); + --ti-common-size-29x: calc(var(--ti-common-size-base) * 29); + --ti-common-size-30x: calc(var(--ti-common-size-base) * 30); + --ti-common-size-31x: calc(var(--ti-common-size-base) * 31); + --ti-common-size-32x: calc(var(--ti-common-size-base) * 32); + --ti-common-size-33x: calc(var(--ti-common-size-base) * 33); + --ti-common-size-34x: calc(var(--ti-common-size-base) * 34); + --ti-common-size-35x: calc(var(--ti-common-size-base) * 35); + --ti-common-size-36x: calc(var(--ti-common-size-base) * 36); + --ti-common-size-37x: calc(var(--ti-common-size-base) * 37); + --ti-common-size-38x: calc(var(--ti-common-size-base) * 38); + --ti-common-size-39x: calc(var(--ti-common-size-base) * 39); + --ti-common-size-40x: calc(var(--ti-common-size-base) * 40); + --ti-common-size-41x: calc(var(--ti-common-size-base) * 41); + --ti-common-size-42x: calc(var(--ti-common-size-base) * 42); + --ti-common-size-43x: calc(var(--ti-common-size-base) * 43); + --ti-common-size-44x: calc(var(--ti-common-size-base) * 44); + --ti-common-size-45x: calc(var(--ti-common-size-base) * 45); + --ti-common-size-46x: calc(var(--ti-common-size-base) * 46); + --ti-common-size-47x: calc(var(--ti-common-size-base) * 47); + --ti-common-size-48x: calc(var(--ti-common-size-base) * 48); + --ti-common-size-49x: calc(var(--ti-common-size-base) * 49); + --ti-common-size-50x: calc(var(--ti-common-size-base) * 50); + --ti-common-size-0: 0px; + --ti-common-size-auto: auto; + --ti-base-color-primary-normal: var(--ti-base-color-brand-6); + --ti-base-color-primary-hover: var(--ti-base-color-brand-5); + --ti-base-color-primary-active: var(--ti-base-color-brand-5); + --ti-base-color-primary-disabled: var(--ti-common-color-bg-disabled); + --ti-base-color-primary-disabled-border: var(--ti-common-color-line-disabled); + --ti-base-color-primary-disabled-text: var(--ti-common-color-text-disabled); + --ti-base-color-success-normal: var(--ti-common-color-success); + --ti-base-color-success-hover: var(--ti-common-color-success-border); + --ti-base-color-success-active: var(--ti-common-color-success-border); + --ti-base-color-success-disabled: var(--ti-common-color-bg-disabled); + --ti-base-color-success-disabled-border: var(--ti-common-color-line-disabled); + --ti-base-color-success-disabled-text: var(--ti-common-color-text-disabled); + --ti-base-color-warning-normal: var(--ti-common-color-warn); + --ti-base-color-warning-hover: var(--ti-common-color-warn-secondary); + --ti-base-color-warning-active: var(--ti-common-color-warn-secondary); + --ti-base-color-warning-disabled: var(--ti-common-color-bg-disabled); + --ti-base-color-warning-disabled-border: var(--ti-common-color-line-disabled); + --ti-base-color-warning-disabled-text: var(--ti-common-color-text-disabled); + --ti-base-color-danger-normal: var(--ti-common-bg-primary); + --ti-base-color-danger-hover: var(--ti-common-bg-primary-hover); + --ti-base-color-danger-active: var(--ti-common-bg-primary-active); + --ti-base-color-danger-disabled: var(--ti-common-color-bg-disabled); + --ti-base-color-danger-disabled-border: var(--ti-common-color-line-disabled); + --ti-base-color-danger-disabled-text: var(--ti-common-color-text-disabled); + --ti-base-color-info-normal: var(--ti-base-color-common-7); + --ti-base-color-info-hover: #54657e; + --ti-base-color-info-active: #54657e; + --ti-base-color-info-disabled: var(--ti-common-color-bg-disabled); + --ti-base-color-info-disabled-border: var(--ti-common-color-line-disabled); + --ti-base-color-info-disabled-text: var(--ti-common-color-text-disabled); + --ti-base-color-border: var(--ti-base-color-common-2); + --ti-base-color-border-hover: var(--ti-base-color-common-5); + --ti-base-color-light: #fff; + --ti-base-color-hover-background: var(--ti-base-color-brand-1); + --ti-base-color-selected-background: var(--ti-base-color-brand-6); + --ti-base-color-selected-font-color: var(--ti-base-color-light); + --ti-base-size-height-normal: 30px; + --ti-base-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); + --ti-base-dropdown-gap: 2px; + --ti-base-color-dark: #000; + --ti-base-color-secondary: #666; + --ti-base-color-placeholder: #999; + --ti-base-color-navigation-background: #2e3243; + --ti-base-radius-large: 3px; + --ti-base-radius-medium: 2px; + --ti-base-radius-small: 1px; + --ti-base-font-size: 12px; + --ti-base-font-size-normal: 1em; + --ti-base-font-size-large: 1.125em; + --ti-base-font-weight-bold: 700; + --ti-base-size-width-large: 130px; + --ti-base-size-width-medium: 120px; + --ti-base-size-width-normal: 80px; + --ti-base-size-width-small: 36px; + --ti-base-size-width-minor: 30px; + --ti-base-size-width-mini: 24px; + --ti-base-size-height-large: 48px; + --ti-base-size-height-medium: 42px; + --ti-base-size-height-small: 28px; + --ti-base-size-height-minor: 30px; + --ti-base-size-height-mini: 24px; +} +:root { + --ti-errortips-box-background: var(--ti-base-color-light); + --ti-errortips-body-color: #5a5e66; + --ti-errortips-body-font-size: var(--ti-common-font-size-1); + --ti-errortips-body-code-font-size: 100px; + --ti-errortips-body-code-color: #9ac7ef; + --ti-errortips-body-content-font-size: var(--ti-common-font-size-2); + --ti-errortips-body-bottom-font-weight: var(--ti-common-font-weight-8); + --ti-errortips-sso-box-background: var(--ti-base-color-light); + --ti-errortips-sso-body-color: #5a5e66; + --ti-errortips-sso-body-font-size: var(--ti-common-font-size-1); + --ti-errortips-not-sso-background: #dcdfe4; + --ti-errortips-not-sso-body-background: #f4f5f9; + --ti-errortips-not-sso-body-border-color: #d4d5d7; + --ti-errortips-not-sso-body-title-border-color: #b6babf; + --ti-errortips-not-sso-body-title-font-size: var(--ti-common-font-size-4); + --ti-errortips-not-sso-body-login-font-size: var(--ti-common-font-size-2); + --ti-errortips-not-sso-body-color: #5a5e66; + --ti-errortips-not-sso-body-input-border-color: var(--ti-base-color-bg-5); + --ti-errortips-not-sso-body-input-border-radius: var(--ti-common-border-radius-normal); + --ti-errortips-not-sso-body-input-placeholder: var(--ti-base-color-placeholder); + --ti-errortips-not-sso-body-input-hover: var(--ti-base-color-placeholder); + --ti-errortips-not-sso-body-input-focus: var(--ti-base-color-border); + --ti-errortips-not-sso-body-input-danger: var(--ti-base-color-bg-8); + --ti-errortips-not-sso-body-button-color: var(--ti-base-color-light); + --ti-errortips-not-sso-body-button-background: var(--ti-base-color-brand-6); + --ti-errortips-not-sso-body-button-border-radius: var(--ti-common-border-radius-normal); + --ti-errortips-not-sso-body-button-hover: var(--ti-base-color-brand-5); + --ti-errortips-not-sso-body-errmessage-color: #f00; +} +.aurora-popup__wrapper { + z-index: 2147483647 !important; + background: rgba(0, 0, 0, 0.5); + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: auto; + margin: 0; +} +.aurora-popup__wrapper .aurora-errortips__box { + position: absolute; + width: var(--ti-errortips-width); + min-height: var(--ti-errortips-min-height); + max-height: var(--ti-errortips-max-height); + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + overflow: hidden; + background: var(--ti-errortips-box-background); + border: 1px solid transparent; + -webkit-box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.2); + text-align: center; + overflow-y: auto; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body { + height: 100%; + text-align: initial; + padding: 20px; + color: var(--ti-errortips-body-color); + font-size: var(--ti-errortips-body-font-size); + display: table; + margin: auto; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body .errortips { + text-align: center; + display: table-cell; + vertical-align: middle; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body .errortips .error-code { + font-size: var(--ti-errortips-body-code-font-size); + color: var(--ti-errortips-body-code-color); + margin: 0 auto -45px; + text-shadow: 0 2px 0 #fff, -2px 0 0 #fff, 2px 0 0 #fff; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body .errortips .error-img { + width: 260px; + height: 180px; + margin: 0 auto; + background: url(../images/errortips-bg.png) no-repeat; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body .errortips .error-content { + font-size: var(--ti-errortips-body-content-font-size); + margin: 24px 0; + font-weight: 700; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body .errortips .error-bottom a { + font-weight: var(--ti-errortips-body-bottom-font-weight); + cursor: pointer; +} +.aurora-popup__wrapper .aurora-errortips__box .aurora-errortips__body .errortips .error-bottom span { + padding-right: 15px; +} +.aurora-popup__wrapper .aurora-sso__box { + position: absolute; + background: var(--ti-errortips-sso-box-background); + border: 1px solid transparent; + -webkit-box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 2px 0 rgba(0, 0, 0, 0.2); + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.aurora-popup__wrapper .aurora-sso__box .aurora-sso__body { + text-align: initial; + padding: 20px; + color: var(--ti-errortips-sso-body-color); + line-height: 32px; + font-size: var(--ti-errortips-sso-body-font-size); +} +.aurora-popup__wrapper .aurora-sso__box .aurora-sso__body .aurora-sso__body-iframe { + width: 350px; + height: 350px; + overflow: hidden; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .aurora-popup__wrapper .aurora-sso__box .aurora-sso__body .aurora-sso__body-iframe { + height: 460px; + } +} +@supports (-ms-ime-align: auto) { + .aurora-popup__wrapper .aurora-sso__box .aurora-sso__body .aurora-sso__body-iframe { + height: 460px; + } +} +.aurora-popup__wrapper.login-not-sso { + background: var(--ti-errortips-not-sso-background); + background-size: cover; +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box { + width: 100%; + height: 100%; + overflow: hidden; +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body { + width: 650px; + height: 400px; + background: var(--ti-errortips-not-sso-body-background); + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + border: 1px solid var(--ti-errortips-not-sso-body-border-color); + -webkit-box-shadow: 0 2px 4px #989a9e; + box-shadow: 0 2px 4px #989a9e; +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .title { + background: -webkit-gradient(linear, left top, left bottom, from(#ecedf1), to(#dadde2)); + background: linear-gradient(to bottom, #ecedf1, #dadde2); + border-bottom: 1px solid var(--ti-errortips-not-sso-body-title-border-color); + padding: 16px 20px; + font-size: var(--ti-errortips-not-sso-body-title-font-size); +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .tbl-login { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + font-size: var(--ti-errortips-not-sso-body-login-font-size); + margin-top: 28px; +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .tbl-login .form-item { + height: 60px; + line-height: 60px; +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .tbl-login .form-item td.label { + width: 30%; + text-align: right; + color: var(--ti-errortips-not-sso-body-color); +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .tbl-login .form-item td.cell { + width: 70%; + text-align: left; + padding-left: 12px; +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .tbl-login .form-item td.cell input { + border: 1px solid var(--ti-errortips-not-sso-body-input-border-color); + border-radius: var(--ti-errortips-not-sso-body-input-border-radius); + outline: 0; + width: 75%; + height: 40px; + line-height: 40px; + padding: 0 8px; + background: 0 0; + color: var(--ti-errortips-not-sso-body-color); +} +.aurora-popup__wrapper.login-not-sso + .aurora-not-sso__box + .aurora-not-sso__body + .tbl-login + .form-item + td.cell + input::-webkit-input-placeholder { + color: var(--ti-errortips-not-sso-body-input-placeholder); +} +.aurora-popup__wrapper.login-not-sso + .aurora-not-sso__box + .aurora-not-sso__body + .tbl-login + .form-item + td.cell + input:hover { + border-color: var(--ti-errortips-not-sso-body-input-placeholder); +} +.aurora-popup__wrapper.login-not-sso + .aurora-not-sso__box + .aurora-not-sso__body + .tbl-login + .form-item + td.cell + input:focus::-webkit-input-placeholder { + color: var(--ti-errortips-not-sso-body-input-focus); +} +.aurora-popup__wrapper.login-not-sso + .aurora-not-sso__box + .aurora-not-sso__body + .tbl-login + .form-item + td.cell + input.text-danger { + border-color: var(--ti-errortips-not-sso-body-input-danger); +} +.aurora-popup__wrapper.login-not-sso .aurora-not-sso__box .aurora-not-sso__body .tbl-login .form-item td.cell button { + width: 75%; + height: 40px; + line-height: 40px; + padding: 0 24px; + text-align: center; + color: var(--ti-errortips-not-sso-body-button-color); + background-color: var(--ti-errortips-not-sso-body-button-background); + border: none; + border-radius: var(--ti-errortips-not-sso-body-button-border-radius); + -webkit-transition: 0.3s; + transition: 0.3s; + outline: 0; +} +.aurora-popup__wrapper.login-not-sso + .aurora-not-sso__box + .aurora-not-sso__body + .tbl-login + .form-item + td.cell + button:hover { + background-color: var(--ti-errortips-not-sso-body-button-hover); +} +.aurora-popup__wrapper.login-not-sso + .aurora-not-sso__box + .aurora-not-sso__body + .tbl-login + .form-item + td.cell + .errmessage { + color: var(--ti-errortips-not-sso-body-errmessage-color); + line-height: 20px; +} +.tiny-svg { + width: 1em; + height: 1em; + vertical-align: middle; + overflow: hidden; + display: inline-block; +} +.tiny-transition-alert-fade-enter, +.tiny-transition-alert-fade-enter-from, +.tiny-transition-alert-fade-leave-active { + opacity: 0; +} +.tiny-transition-alert-fade-leave-active { + -webkit-transition: opacity 0.3s ease-in; + transition: opacity 0.3s ease-in; +} +.tiny-alert { + --ti-alert-description-font-size: var(--ti-common-font-size-base); + --ti-alert-close-font-size: var(--ti-common-font-size-base); + --ti-alert-radius: var(--ti-common-border-radius-normal); + --ti-alert-title-color: var(--ti-base-color-info-normal); + --ti-alert-nomal-content-line-height: var(--ti-common-line-height-number); + --ti-alert-description-color: var(--ti-base-color-info-normal); + --ti-alert-opration-color: var(--ti-base-color-brand-7); + --ti-alert-warning-border-color: var(--ti-common-color-warn-border); + --ti-alert-warning-icon-color: var(--ti-common-color-warn); + --ti-alert-warning-link-color: var(--ti-common-color-warn-text); + --ti-alert-warning-bg-color: var(--ti-common-color-warn-bg); + --ti-alert-error-border-color: var(--ti-common-color-error-border-secondary); + --ti-alert-error-icon-color: var(--ti-common-color-error); + --ti-alert-error-link-color: var(--ti-common-color-error-text); + --ti-alert-error-bg-color: var(--ti-common-color-error-bg); + --ti-alert-success-border-color: var(--ti-common-color-success-border); + --ti-alert-success-icon-color: var(--ti-common-color-success); + --ti-alert-success-link-color: var(--ti-common-color-text-success); + --ti-alert-success-bg-color: var(--ti-common-color-success-bg); + --ti-alert-info-border-color: var(--ti-common-color-prompt-border); + --ti-alert-info-icon-color: var(--ti-common-color-prompt); + --ti-alert-info-link-color: var(--ti-common-color-prompt-text); + --ti-alert-info-bg-color: var(--ti-common-color-prompt-bg); + position: relative; + border: 1px solid; + border-radius: var(--ti-alert-radius); +} +.tiny-alert.tiny-alert--normal { + padding: 11px 16px; + margin: 8px 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-alert.tiny-alert--normal .tiny-alert__content { + padding: 0 8px; + display: table-cell; + line-height: var(--ti-alert-nomal-content-line-height); + max-width: calc(100% - 30px); +} +.tiny-alert.tiny-alert--large { + padding: 18px 24px 14px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-alert.tiny-alert--large .tiny-alert__content { + padding-left: 16px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.tiny-alert.tiny-alert--large .tiny-alert__description { + margin-bottom: 6px; + margin-top: 12px; + line-height: 1; +} +.tiny-alert.tiny-alert--large .tiny-alert__description.is-hide { + margin: 0; +} +.tiny-alert.tiny-alert--large .tiny-alert__icon { + font-size: 24px; + vertical-align: top; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.tiny-alert.tiny-alert--large .tiny-alert__icon.tiny-alert__close { + font-size: 12px; +} +.tiny-alert.tiny-alert--large .tiny-alert__close { + top: 12px; + right: 12px; + -webkit-transform: none; + transform: none; +} +.tiny-alert.tiny-alert--success { + background: var(--ti-alert-success-bg-color); + border-color: var(--ti-alert-success-border-color); + color: var(--ti-alert-title-color); +} +.tiny-alert.tiny-alert--success hr { + border-top-color: var(--ti-alert-success-link-color); +} +.tiny-alert.tiny-alert--success .alert-link { + color: var(--ti-alert-success-link-color); +} +.tiny-alert.tiny-alert--success .tiny-alert__icon { + fill: var(--ti-alert-success-icon-color); +} +.tiny-alert.tiny-alert--info { + background: var(--ti-alert-info-bg-color); + border-color: var(--ti-alert-info-border-color); + color: var(--ti-alert-title-color); +} +.tiny-alert.tiny-alert--info hr { + border-top-color: var(--ti-alert-info-link-color); +} +.tiny-alert.tiny-alert--info .alert-link { + color: var(--ti-alert-info-link-color); +} +.tiny-alert.tiny-alert--info .tiny-alert__icon { + fill: var(--ti-alert-info-icon-color); +} +.tiny-alert.tiny-alert--warning { + background: var(--ti-alert-warning-bg-color); + border-color: var(--ti-alert-warning-border-color); + color: var(--ti-alert-title-color); +} +.tiny-alert.tiny-alert--warning hr { + border-top-color: var(--ti-alert-warning-link-color); +} +.tiny-alert.tiny-alert--warning .alert-link { + color: var(--ti-alert-warning-link-color); +} +.tiny-alert.tiny-alert--warning .tiny-alert__icon { + fill: var(--ti-alert-warning-icon-color); +} +.tiny-alert.tiny-alert--error { + background: var(--ti-alert-error-bg-color); + border-color: var(--ti-alert-error-border-color); + color: var(--ti-alert-title-color); +} +.tiny-alert.tiny-alert--error hr { + border-top-color: var(--ti-alert-error-link-color); +} +.tiny-alert.tiny-alert--error .alert-link { + color: var(--ti-alert-error-link-color); +} +.tiny-alert.tiny-alert--error .tiny-alert__icon { + fill: var(--ti-alert-error-icon-color); +} +.tiny-alert__icon { + font-size: 16px; +} +.tiny-alert.is-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; +} +.tiny-alert .is-custom { + position: absolute; + top: 50%; + right: 12px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + cursor: pointer; +} +.tiny-alert .tiny-alert__close { + font-size: var(--ti-alert-close-font-size); + position: absolute; + top: 50%; + right: 12px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + cursor: pointer; +} +.tiny-alert .tiny-alert__content .tiny-alert__opration { + font-size: 12px; + color: var(--ti-alert-opration-color); + line-height: 1; +} +.tiny-alert .tiny-alert__content .tiny-alert__opration a { + font-size: 12px; + color: var(--ti-alert-opration-color); +} +.tiny-alert .tiny-alert__content .tiny-alert__opration a:not(:last-child) { + margin-right: 16px; +} +.tiny-alert .tiny-alert__title { + font-size: 16px; + color: var(--ti-alert-title-color); + font-weight: 700; +} +.tiny-alert .tiny-alert__description { + font-size: var(--ti-alert-description-font-size); + color: var(--ti-alert-description-color); +} +.tiny-alert p { + display: inline-block; + line-height: 16px; + padding-left: 8px; +} +.tiny-amount { + --ti-amount-icon-color: var(--ti-base-color-brand-6); + --ti-amount-icon-font-size: var(--ti-common-font-size-1); + width: 270px; +} +.tiny-amount .tiny-amount-input-icon .tiny-svg { + fill: var(--ti-amount-icon-color); + font-size: var(--ti-amount-icon-font-size); +} +.tiny-amount-popper { + width: 270px; +} +.tiny-amount-popper .popover-con .module:not(:last-child) { + margin-bottom: 12px; +} +.tiny-amount-popper .popover-con .module { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-amount-popper .popover-con .module .popover-left { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin-right: 8px; + width: 30%; + text-align: right; +} +.tiny-amount-popper + .popover-con + .module + .popover-right:not(.tiny-input-prefix):not(.tiny-input-suffiX) + .tiny-input__inner { + padding: 0 8px; +} +.tiny-amount-popper .popover-con .module .popover-right.tiny-input { + display: inline-block; +} +.tiny-amount .tiny-input { + outline: 0; +} +.tiny-amount span.tiny-popover__reference { + width: 100%; +} +.tiny-area .tiny-select { + width: 270px; + margin-right: 10px; +} +.tiny-autocomplete { + --ti-autocomplete-suggestion-border-radius: var(--ti-common-border-radius-normal); + --ti-autocomplete-suggestion-border-color: var(--ti-base-color-white); + --ti-autocomplete-suggestion-bgcolor: var(--ti-base-color-light); + --ti-autocomplete-li-color: var(--ti-base-color-info-normal); + --ti-autocomplete-li-font-size: var(--ti-common-font-size-base); + --ti-autocomplete-li-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-autocomplete-li-select-bgcolor: var(--ti-base-color-selected-background); + --ti-autocomplete-li-selected-font-color: var(--ti-base-color-selected-font-color); + --ti-autocomplete-li-divider-border-color: var(--ti-base-color-dark); + --ti-autocomplete-li-height: 30px; + --ti-autocomplete-loading-color: var(--ti-base-color-placeholder); + position: relative; + display: inline-block; +} +.tiny-autocomplete-suggestion { + border: 1px solid var(--ti-autocomplete-suggestion-border-color); + border-radius: var(--ti-autocomplete-suggestion-border-radius); + background-color: var(--ti-autocomplete-suggestion-bgcolor); + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-box-shadow: var(--ti-base-box-shadow); + box-shadow: var(--ti-base-box-shadow); +} +.tiny-autocomplete-suggestion__wrap { + max-height: 280px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-autocomplete-suggestion__wrap { + margin-bottom: -17px !important; + padding-bottom: 6px; + } +} +.tiny-autocomplete-suggestion__list { + margin: 0; + padding: 0; +} +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item { + padding: 0 8px; + margin: 0; + line-height: var(--ti-autocomplete-li-height); + color: var(--ti-autocomplete-li-color); + font-size: var(--ti-autocomplete-li-font-size); + list-style: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; +} +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item.highlighted, +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item:hover { + background-color: var(--ti-autocomplete-li-hover-bgcolor); +} +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item.divider { + margin-top: 6px; + border-top: 1px solid var(--ti-autocomplete-li-divider-border-color); +} +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item.divider:last-child { + margin-bottom: -6px; +} +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item:only-of-type, +.tiny-autocomplete-suggestion .tiny-autocomplete-suggestion__list-item:only-of-type:hover { + background-color: var(--ti-autocomplete-li-select-bgcolor); + color: var(--ti-autocomplete-li-selected-font-color); +} +.tiny-autocomplete-suggestion.is-loading .tiny-autocomplete-suggestion__list-loading { + text-align: center; + height: 100px; + line-height: 100px; + font-size: var(--ti-common-font-size-4); + color: var(--ti-autocomplete-loading-color); +} +.tiny-autocomplete-suggestion.is-loading .tiny-autocomplete-suggestion__list-loading::after { + display: inline-block; + content: ''; + height: 100%; + vertical-align: middle; +} +.tiny-autocomplete-suggestion.is-loading .tiny-autocomplete-suggestion__list-loading:hover { + background-color: #fff; +} +.tiny-autocomplete-suggestion.is-loading .tiny-icon-loading { + vertical-align: middle; +} +.tiny-autocomplete-suggestion.tiny-popper[x-placement^='bottom'] { + margin-top: var(--ti-base-dropdown-gap); +} +.tiny-badge { + --ti-badge-size: var(--ti-common-size-5x); + --ti-badge-font-size: 12px; + --ti-badge-font-weight: var(--ti-common-font-weight-7); + --ti-badge-border-raidus: 12px; + --ti-badge-color: var(--ti-base-color-light); + --ti-badge-bgcolor: var(--ti-base-color-error-3); + --ti-badge-link-hover-color: var(--ti-base-color-light); + --ti-badge-active-color: var(--ti-base-color-brand-6); + --ti-badge-active-bgcolor: var(--ti-base-color-light); + --ti-badge-primary-bgcolor: var(--ti-base-color-brand-6); + --ti-badge-success-bgcolor: var(--ti-base-color-success-normal); + --ti-badge-warning-bgcolor: var(--ti-base-color-warning-normal); + --ti-badge-danger-bgcolor: var(--ti-base-color-error-3); + --ti-badge-info-bgcolor: var(--ti-base-color-info-normal); + display: inline-block; + min-width: var(--ti-badge-size); + height: var(--ti-badge-size); + line-height: var(--ti-badge-size); + border-radius: var(--ti-badge-border-raidus); + padding: 0 4px; + font-size: var(--ti-badge-font-size); + font-weight: var(--ti-badge-font-weight); + color: var(--ti-badge-color); + background-color: var(--ti-badge-bgcolor); + vertical-align: baseline; + white-space: nowrap; + text-align: center; +} +.tiny-badge.tiny-badge--max { + padding: 0 6px; + border-radius: 10px; +} +.tiny-badge.tiny-badge--default { + width: 6px; + height: 6px; + min-width: auto; + background-color: var(--ti-badge-bgcolor); + display: inline-block; + vertical-align: top; + padding: 0; + border-radius: 50%; +} +.tiny-badge.tiny-badge--primary { + background-color: var(--ti-badge-primary-bgcolor); +} +.tiny-badge.tiny-badge--success { + background-color: var(--ti-badge-success-bgcolor); +} +.tiny-badge.tiny-badge--warning { + background-color: var(--ti-badge-warning-bgcolor); +} +.tiny-badge.tiny-badge--danger { + background-color: var(--ti-badge-danger-bgcolor); +} +.tiny-badge.tiny-badge--info { + background-color: var(--ti-badge-info-bgcolor); +} +.tiny-badge:empty { + display: none; +} +.btn .tiny-badge { + position: relative; + top: -1px; +} +.tiny-badge a, +.tiny-badge a:hover { + color: var(--ti-badge-color); + text-decoration: none; +} +a.badge:focus, +a.badge:hover { + color: var(--ti-badge-link-hover-color); + text-decoration: none; + cursor: pointer; +} +.nav-pills > .active > a > .badge, +a.list-group-item.active > .badge { + color: var(--ti-badge-active-color); + background-color: var(--ti-badge-active-bgcolor); +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.tiny-breadcrumb { + --ti-breadcrumb-font-size: var(--ti-common-font-size-base); + --ti-breadcrumb-text-line-height: 1em; + --ti-breadcrumb-text-color: var(--ti-base-color-info-normal); + --ti-breadcrumb-separator-color: var(--ti-base-color-placeholder); + --ti-breadcrumb-text-hover-color: var(--ti-base-color-brand-6); + --ti-breadcrumb-text-font-weight: var(--ti-common-font-weight-7); + font-size: var(--ti-breadcrumb-font-size); + line-height: var(--ti-breadcrumb-text-line-height); +} +.tiny-breadcrumb:after, +.tiny-breadcrumb:before { + content: ''; + display: table; +} +.tiny-breadcrumb:after { + clear: both; +} +.tiny-breadcrumb .tiny-breadcrumb__item { + cursor: pointer; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-breadcrumb .tiny-breadcrumb__item:last-child .tiny-breadcrumb__inner { + font-weight: var(--ti-breadcrumb-text-font-weight); +} +.tiny-breadcrumb .tiny-breadcrumb__item:last-child .tiny-breadcrumb__inner a { + cursor: text; +} +.tiny-breadcrumb .tiny-breadcrumb__item:last-child .tiny-breadcrumb__separator, +.tiny-breadcrumb .tiny-breadcrumb__item:last-child .tiny-breadcrumb__separator-cls { + display: none; +} +.tiny-breadcrumb .tiny-breadcrumb__inner { + vertical-align: middle; +} +.tiny-breadcrumb .tiny-breadcrumb__inner, +.tiny-breadcrumb .tiny-breadcrumb__inner a { + color: var(--ti-breadcrumb-text-color); +} +.tiny-breadcrumb .tiny-breadcrumb__inner:hover { + color: var(--ti-breadcrumb-text-hover-color); +} +.tiny-breadcrumb .tiny-breadcrumb__separator { + font-family: '\5B8B\4F53', sans-serif; + color: var(--ti-breadcrumb-separator-color); + padding: 0 4px; + vertical-align: middle; +} +.tiny-breadcrumb .tiny-breadcrumb__separator-cls { + font-size: var(--ti-breadcrumb-font-size); + fill: var(--ti-breadcrumb-separator-color); + margin: 0 4px; + vertical-align: middle; +} +.tiny-breadcrumb .tiny-breadcrumb__inner a:hover, +.tiny-breadcrumb .tiny-breadcrumb__item:last-child:hover { + color: var(--ti-breadcrumb-text-hover-color); + text-decoration: none; +} +.tiny-bulletin-board { + --ti-bulletin-board-title-font-size: var(--ti-common-font-size-3); + --ti-bulletin-board-title-font-weight: var(--ti-common-font-weight-7); + --ti-bulletin-board-title-color: var(--ti-base-color-info-normal); + --ti-bulletin-board-item-title-color: var(--ti-base-color-dark); + --ti-bulletin-board-item-date-color: var(--ti-base-color-placeholder); + --ti-bulletin-board-item-date-font-size: var(--ti-common-font-size-base); + --ti-bulletin-board-new-background: var(--ti-base-color-error-3); + --ti-bulletin-board-new-color: var(--ti-base-color-light); + --ti-bulletin-board-new-border-radius: var(--ti-common-border-radius-normal); + --ti-bulletin-board-more-color: var(--ti-base-color-brand-6); + --ti-bulletin-board-more-hover-color: var(--ti-base-color-brand-5); + --ti-bulletin-board-more-font-size: var(--ti-common-font-size-base); + --ti-bulletin-board-more-icon-font-size: var(--ti-common-font-size-1); + --ti-bulletin-board-tabs-item-color: var(--ti-base-color-info-normal); + --ti-bulletin-board-tabs-item-hover-color: var(--ti-base-color-brand-6); + --ti-bulletin-board-tabs-item-disabled-color: var(--ti-base-color-placeholder); + --ti-bulletin-board-tabs-header-border-color: var(--ti-base-color-border); +} +.tiny-bulletin-board__item { + margin-bottom: 12px; +} +.tiny-bulletin-board__item .tiny-bulletin-board__textTitle { + display: block; + color: var(--ti-bulletin-board-item-title-color); + margin-bottom: 2px; + font-size: var(--ti-common-font-size-base); + white-space: normal; + font-family: Helvetica, Arial, 'microsoft yahei'; + line-height: initial; +} +.tiny-bulletin-board__item .tiny-bulletin-board__textTitle, +.tiny-bulletin-board__item .tiny-bulletin-board__textTitle:hover { + text-decoration: none; +} +.tiny-bulletin-board__item .tiny-bulletin-board__textDate { + color: var(--ti-bulletin-board-item-date-color); + font-size: var(--ti-bulletin-board-item-date-font-size); +} +.tiny-bulletin-board__title { + font-size: var(--ti-bulletin-board-title-font-size); + padding: 12px 0 8px 24px; + color: var(--ti-bulletin-board-title-color); + font-weight: var(--ti-bulletin-board-title-font-weight); +} +.tiny-bulletin-board__more { + text-align: right; +} +.tiny-bulletin-board__more .tiny-bulletin-board__more-link { + color: var(--ti-bulletin-board-more-color); + font-size: var(--ti-bulletin-board-more-font-size); + line-height: normal; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-bulletin-board__more .tiny-bulletin-board__more-link .tiny-svg { + fill: var(--ti-bulletin-board-more-color); + font-size: var(--ti-bulletin-board-more-icon-font-size); + margin-left: 4px; +} +.tiny-bulletin-board__more .tiny-bulletin-board__more-link:hover { + text-decoration: none; +} +.tiny-bulletin-board__more .tiny-bulletin-board__more-link:hover .tiny-svg { + fill: var(--ti-bulletin-board-more-hover-color); +} +.tiny-bulletin-board__new { + background-color: var(--ti-bulletin-board-new-background); + color: var(--ti-bulletin-board-new-color); + border-radius: var(--ti-bulletin-board-new-border-radius); + min-width: 30px; + min-height: 16px; + line-height: 16px; + font-size: var(--ti-common-font-size-base); + display: inline-block; + font-family: '瀹嬩綋', cursive, Helvetica, Arial, 'microsoft yahei'; + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs--left, +.tiny-bulletin-board .tiny-tabs .tiny-tabs--right, +.tiny-bulletin-board .tiny-tabs .tiny-tabs__content, +.tiny-bulletin-board .tiny-tabs .tiny-tabs__nav-scroll, +.tiny-bulletin-board .tiny-tabs .tiny-tabs__nav-wrap { + overflow: hidden; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__header .tiny-tabs__nav-wrap { + margin-bottom: -1px; + position: relative; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__header .tiny-tabs__nav-wrap:after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background-color: var(--ti-tabs-border-color); + z-index: 1; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__header .tiny-tabs__nav-wrap.is-scrollable { + padding: 0 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__header .tiny-tabs__nav { + top: 1px; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__nav { + white-space: nowrap; + position: relative; + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s; + float: left; + z-index: 2; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item { + line-height: 36px; + height: 36px; + padding: 0 24px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + list-style: none; + font-size: var(--ti-common-font-size-1); + font-weight: 500; + color: var(--ti-bulletin-board-tabs-item-color); + position: relative; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item:active, +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item:focus { + outline: 0; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item:hover { + color: var(--ti-bulletin-board-tabs-item-hover-color); + cursor: pointer; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item.is-active { + color: var(--ti-bulletin-board-tabs-item-hover-color); +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item.is-disabled { + color: var(--ti-bulletin-board-tabs-item-disabled-color); + cursor: default; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item.is-closable > div { + display: inline-block; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item.is-closable .icon-close { + display: initial; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item .icon-close { + border-radius: 50%; + text-align: center; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + margin-left: 5px; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item .icon-close:before { + -webkit-transform: scale(0.9); + transform: scale(0.9); + display: inline-block; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item .icon-close:hover { + background-color: #b4bccc; + color: #fff; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__item::before { + bottom: 0; + top: auto !important; + left: auto !important; +} +.tiny-bulletin-board .tiny-tabs .tiny-tabs__content { + padding: 12px 24px 24px; +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card .tiny-tabs__header .tiny-tabs__nav { + border: none; +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card .tiny-tabs__header .tiny-tabs__item { + border-left: none; +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card > .tiny-tabs__header { + border-bottom: 1px solid var(--ti-bulletin-board-tabs-header-border-color); +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item { + border-bottom: 1px solid transparent; + -webkit-transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item:first-child { + border-left: none; +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item.is-active { + border-bottom-color: #fff; +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item.is-active.is-closable { + padding-left: 24px; + padding-right: 24px; +} +.tiny-bulletin-board .tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item.is-active:before { + position: absolute; + content: ''; + width: 100%; + height: 3px; + background: var(--ti-bulletin-board-tabs-item-hover-color); + margin-left: -24px; +} +.tiny-button { + --ti-button-radius: var(--ti-common-border-radius-normal); + --ti-button-font-size: var(--ti-common-font-size-base); + --ti-button-plain-disabled-font-color: var(--ti-base-color-common-2); + --ti-button-size-normal-min-width: var(--ti-base-size-width-normal); + --ti-button-size-normal-max-width: var(--ti-base-size-width-medium); + --ti-button-size-normal-height: var(--ti-common-size-7x); + --ti-button-size-normal-padding: var(--ti-common-space-2x); + --ti-button-size-large-min-width: var(--ti-base-size-width-normal); + --ti-button-size-large-max-width: var(--ti-base-size-width-large); + --ti-button-size-large-height: var(--ti-base-size-height-large); + --ti-button-size-large-font-size: var(--ti-common-font-size-2); + --ti-button-size-large-padding: var(--ti-common-space-14); + --ti-button-size-medium-min-width: var(--ti-base-size-width-normal); + --ti-button-size-medium-max-width: var(--ti-base-size-width-large); + --ti-button-size-medium-height: var(--ti-base-size-height-medium); + --ti-button-size-medium-font-size: var(--ti-common-font-size-1); + --ti-button-size-medium-padding: var(--ti-common-space-3x); + --ti-button-size-small-min-width: var(--ti-base-size-width-normal); + --ti-button-size-small-max-width: var(--ti-base-size-width-medium); + --ti-button-size-small-height: var(--ti-base-size-height-small); + --ti-button-size-small-font-size: var(--ti-common-font-size-1); + --ti-button-size-small-padding: var(--ti-common-space-10); + --ti-button-size-mini-min-width: var(--ti-base-size-width-normal); + --ti-button-size-mini-max-width: var(--ti-base-size-width-medium); + --ti-button-size-mini-height: var(--ti-base-size-height-mini); + --ti-button-size-mini-font-size: var(--ti-common-font-size-base); + --ti-button-size-mini-padding: var(--ti-common-space-2x); + --ti-button-normal-color: var(--ti-base-color-common-7); + --ti-button-normal-border-color: var(--ti-base-color-border); + --ti-button-normal-background-color: var(--ti-base-color-light); + --ti-button-normal-hover-color: var(--ti-base-color-brand-6); + --ti-button-normal-hover-border-color: var(--ti-base-color-brand-6); + --ti-button-normal-hover-background-color: var(--ti-base-color-light); + --ti-button-normal-active-color: var(--ti-base-color-brand-6); + --ti-button-normal-active-border-color: var(--ti-base-color-brand-6); + --ti-button-normal-active-background-color: var(--ti-base-color-hover-background); + --ti-button-normal-disabled-color: var(--ti-common-color-text-disabled); + --ti-button-normal-disabled-border-color: var(--ti-common-color-line-disabled); + --ti-button-normal-disabled-background-color: var(--ti-common-color-bg-disabled); + --ti-button-text-color: var(--ti-base-color-brand-6); + --ti-button-text-hover-color: var(--ti-base-color-brand-5); + --ti-button-text-active-color: var(--ti-base-color-primary-active); + --ti-button-text-disabled-color: var(--ti-base-color-placeholder); + --ti-button-primary-normal-color: var(--ti-base-color-primary-normal); + --ti-button-primary-hover-color: var(--ti-base-color-primary-hover); + --ti-button-primary-active-color: var(--ti-base-color-primary-active); + --ti-button-primary-disabled-bgcolor: var(--ti-base-color-primary-disabled); + --ti-button-primary-color: var(--ti-base-color-light); + --ti-button-primary-disabled-color: var(--ti-common-color-text-disabled); + --ti-button-primary-disabled-border-color: var(--ti-base-color-primary-disabled-border); + --ti-button-primary-plain-bgcolor: rgba(24, 144, 255, 0.06); + --ti-button-primary-plain-disabled-bgcolor: rgba(191, 191, 191, 0.1); + --ti-button-success-normal-color: var(--ti-base-color-success-normal); + --ti-button-success-hover-color: var(--ti-base-color-success-hover); + --ti-button-success-active-color: var(--ti-base-color-success-active); + --ti-button-success-disabled-bgcolor: var(--ti-base-color-success-disabled); + --ti-button-success-color: var(--ti-base-color-light); + --ti-button-success-disabled-color: var(--ti-common-color-text-disabled); + --ti-button-success-disabled-border-color: var(--ti-base-color-success-disabled-border); + --ti-button-success-plain-bgcolor: rgba(82, 196, 26, 0.06); + --ti-button-success-plain-disabled-bgcolor: rgba(166, 195, 185, 0.1); + --ti-button-warning-normal-color: var(--ti-base-color-warning-normal); + --ti-button-warning-hover-color: var(--ti-base-color-warning-hover); + --ti-button-warning-active-color: var(--ti-base-color-warning-active); + --ti-button-warning-disabled-bgcolor: var(--ti-base-color-warning-disabled); + --ti-button-warning-color: var(--ti-base-color-light); + --ti-button-warning-disabled-color: var(--ti-common-color-text-disabled); + --ti-button-warning-disabled-border-color: var(--ti-base-color-warning-disabled-border); + --ti-button-warning-plain-bgcolor: rgba(250, 173, 20, 0.06); + --ti-button-warning-plain-disabled-bgcolor: rgba(211, 198, 162, 0.1); + --ti-button-danger-normal-color: var(--ti-base-color-danger-normal); + --ti-button-danger-hover-color: var(--ti-base-color-danger-hover); + --ti-button-danger-active-color: var(--ti-base-color-danger-active); + --ti-button-danger-disabled-bgcolor: var(--ti-base-color-danger-disabled); + --ti-button-danger-color: var(--ti-base-color-light); + --ti-button-danger-disabled-color: var(--ti-common-color-text-disabled); + --ti-button-danger-disabled-border-color: var(--ti-base-color-danger-disabled-border); + --ti-button-danger-plain-bgcolor: rgba(245, 34, 45, 0.06); + --ti-button-danger-plain-disabled-bgcolor: rgba(216, 186, 181, 0.1); + --ti-button-info-normal-color: var(--ti-base-color-info-normal); + --ti-button-info-hover-color: var(--ti-base-color-info-hover); + --ti-button-info-active-color: var(--ti-base-color-info-active); + --ti-button-info-disabled-bgcolor: var(--ti-base-color-info-disabled); + --ti-button-info-color: var(--ti-base-color-light); + --ti-button-info-disabled-color: var(--ti-common-color-text-disabled); + --ti-button-info-disabled-border-color: var(--ti-base-color-info-disabled-border); + --ti-button-info-plain-bgcolor: rgba(51, 51, 51, 0.06); + --ti-button-info-plain-disabled-bgcolor: rgba(191, 191, 191, 0.1); + --ti-button-padding: 0 var(--ti-common-space-5x); + display: inline-block; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: var(--ti-button-size-normal-height); + line-height: calc(var(--ti-button-size-normal-height) - 2px); + color: var(--ti-button-normal-color); + fill: var(--ti-button-normal-color); + font-size: var(--ti-button-font-size); + white-space: nowrap; + text-overflow: ellipsis; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-width: 1px; + border-style: solid; + border-color: var(--ti-button-normal-border-color); + -o-border-image: initial; + border-image: initial; + border-radius: var(--ti-button-radius); + background: var(--ti-button-normal-background-color); + padding: var(--ti-button-padding); + overflow: hidden; + -webkit-transition: border 0.3s ease 0s, color 0.3s ease 0s, background 0.3s ease 0s; + transition: border 0.3s ease 0s, color 0.3s ease 0s, background 0.3s ease 0s; + outline: 0; +} +.tiny-button .tiny-svg { + vertical-align: text-top; +} +.tiny-button > img { + margin-right: 4px; + vertical-align: middle; +} +.tiny-button::-moz-focus-inner { + border: 0; +} +.tiny-button:focus, +.tiny-button:hover { + color: var(--ti-button-normal-hover-color); + fill: var(--ti-button-normal-hover-color); + border-color: var(--ti-button-normal-hover-border-color); + background-color: var(--ti-button-normal-hover-background-color); +} +.tiny-button.is-active, +.tiny-button.is-plain:active, +.tiny-button:active { + color: var(--ti-button-normal-active-color); + fill: var(--ti-button-normal-active-color); + border-color: var(--ti-button-normal-active-border-color); + background-color: var(--ti-button-normal-active-background-color); +} +.tiny-button.is-disabled, +.tiny-button.is-disabled:focus, +.tiny-button.is-disabled:hover { + cursor: not-allowed; + color: var(--ti-button-normal-disabled-color); + fill: var(--ti-button-normal-disabled-color); + border-color: var(--ti-button-normal-disabled-border-color); + background-color: var(--ti-button-normal-disabled-background-color); +} +.tiny-button.is-plain:focus, +.tiny-button.is-plain:hover { + color: var(--ti-button-normal-hover-color); + fill: var(--ti-button-normal-hover-color); + border-color: var(--ti-button-normal-hover-border-color); + background-color: var(--ti-button-normal-hover-background-color); +} +.tiny-button.is-disabled.is-plain, +.tiny-button.is-disabled.is-plain:focus, +.tiny-button.is-disabled.is-plain:hover { + color: var(--ti-button-normal-disabled-color); + fill: var(--ti-button-normal-disabled-color); + border-color: var(--ti-button-normal-disabled-border-color); + background-color: var(--ti-button-normal-disabled-background-color); +} +.tiny-button + .tiny-button { + margin-left: 8px; +} +.tiny-button.is-loading { + position: relative; + pointer-events: none; + overflow: initial; +} +.tiny-button.is-loading:before { + pointer-events: none; + content: ''; + position: absolute; + left: -1px; + top: -1px; + right: -1px; + bottom: -1px; + border-radius: inherit; + background-color: rgba(255, 255, 255, 0.35); +} +.tiny-button.is-loading .tiny-svg { + fill: var(--ti-button-info-color); +} +.tiny-button.is-loading.tiny-button--default .tiny-svg { + fill: var(--ti-button-normal-color); +} +.tiny-button.is-round { + border-radius: calc(var(--ti-button-size-normal-height, 30px) / 2); +} +.tiny-button.is-icon { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-button:not(.is-circle) .tiny-svg.is-text { + margin-right: 8px; +} +.tiny-button:not(.is-circle).is-loading .tiny-svg { + margin-right: 4px; + margin-top: 2px; +} +.tiny-button.is-circle { + border-radius: 50%; + min-width: var(--ti-button-size-normal-height); + min-height: var(--ti-button-size-normal-height); + line-height: 1; + padding: var(--ti-button-size-normal-padding); +} +.tiny-button.is-circle.tiny-button--large { + min-width: var(--ti-button-size-large-height); + min-height: var(--ti-button-size-large-height); + height: auto; + line-height: 1; + padding: var(--ti-button-size-large-padding); +} +.tiny-button.is-circle.tiny-button--medium { + min-width: var(--ti-button-size-medium-height); + min-height: var(--ti-button-size-medium-height); + height: auto; + line-height: 1; + padding: var(--ti-button-size-medium-padding); +} +.tiny-button.is-circle.tiny-button--small { + min-width: var(--ti-button-size-small-height); + min-height: var(--ti-button-size-small-height); + height: auto; + line-height: 1; + padding: var(--ti-button-size-small-padding); +} +.tiny-button.is-circle.tiny-button--mini { + min-width: var(--ti-button-size-mini-height); + min-height: var(--ti-button-size-mini-height); + height: auto; + line-height: 1; + padding: var(--ti-button-size-mini-padding); +} +.tiny-button.tiny-button--primary { + color: var(--ti-button-primary-color); + fill: var(--ti-button-primary-color); + border-color: var(--ti-button-primary-normal-color); + background-color: var(--ti-button-primary-normal-color); +} +.tiny-button.tiny-button--primary:hover { + color: var(--ti-button-primary-color); + fill: var(--ti-button-primary-color); + border-color: var(--ti-button-primary-hover-color); + background-color: var(--ti-button-primary-hover-color); +} +.tiny-button.tiny-button--primary.is-active, +.tiny-button.tiny-button--primary:active, +.tiny-button.tiny-button--primary:focus { + color: var(--ti-button-primary-color); + fill: var(--ti-button-primary-color); + border-color: var(--ti-button-primary-active-color); + background-color: var(--ti-button-primary-active-color); + outline: 0; +} +.tiny-button.tiny-button--primary.is-disabled, +.tiny-button.tiny-button--primary.is-disabled:active, +.tiny-button.tiny-button--primary.is-disabled:focus, +.tiny-button.tiny-button--primary.is-disabled:hover { + color: var(--ti-button-primary-disabled-color); + fill: var(--ti-button-primary-disabled-color); + border-color: var(--ti-button-primary-disabled-border-color); + background-color: var(--ti-button-primary-disabled-bgcolor); +} +.tiny-button.tiny-button--primary.is-plain { + color: var(--ti-button-primary-normal-color); + fill: var(--ti-button-primary-normal-color); + border-color: var(--ti-button-primary-normal-color); + background-color: var(--ti-button-primary-plain-bgcolor); +} +.tiny-button.tiny-button--primary.is-plain:hover { + color: var(--ti-button-primary-color); + fill: var(--ti-button-primary-color); + border-color: var(--ti-button-primary-normal-color); + background-color: var(--ti-button-primary-normal-color); +} +.tiny-button.tiny-button--primary.is-plain.is-active, +.tiny-button.tiny-button--primary.is-plain:active, +.tiny-button.tiny-button--primary.is-plain:focus { + color: var(--ti-button-primary-color); + fill: var(--ti-button-primary-color); + border-color: var(--ti-button-primary-active-color); + background-color: var(--ti-button-primary-active-color); + outline: 0; +} +.tiny-button.tiny-button--primary.is-plain.is-disabled, +.tiny-button.tiny-button--primary.is-plain.is-disabled:active, +.tiny-button.tiny-button--primary.is-plain.is-disabled:focus, +.tiny-button.tiny-button--primary.is-plain.is-disabled:hover { + color: var(--ti-button-plain-disabled-font-color); + fill: var(--ti-button-primary-disabled-bgcolor); + border-color: var(--ti-button-primary-disabled-bgcolor); + background-color: var(--ti-button-primary-plain-disabled-bgcolor); +} +.tiny-button.tiny-button--success { + color: var(--ti-button-success-color); + fill: var(--ti-button-success-color); + border-color: var(--ti-button-success-normal-color); + background-color: var(--ti-button-success-normal-color); +} +.tiny-button.tiny-button--success:hover { + color: var(--ti-button-success-color); + fill: var(--ti-button-success-color); + border-color: var(--ti-button-success-hover-color); + background-color: var(--ti-button-success-hover-color); +} +.tiny-button.tiny-button--success.is-active, +.tiny-button.tiny-button--success:active, +.tiny-button.tiny-button--success:focus { + color: var(--ti-button-success-color); + fill: var(--ti-button-success-color); + border-color: var(--ti-button-success-active-color); + background-color: var(--ti-button-success-active-color); + outline: 0; +} +.tiny-button.tiny-button--success.is-disabled, +.tiny-button.tiny-button--success.is-disabled:active, +.tiny-button.tiny-button--success.is-disabled:focus, +.tiny-button.tiny-button--success.is-disabled:hover { + color: var(--ti-button-success-disabled-color); + fill: var(--ti-button-success-disabled-color); + border-color: var(--ti-button-success-disabled-border-color); + background-color: var(--ti-button-success-disabled-bgcolor); +} +.tiny-button.tiny-button--success.is-plain { + color: var(--ti-button-success-normal-color); + fill: var(--ti-button-success-normal-color); + border-color: var(--ti-button-success-normal-color); + background-color: var(--ti-button-success-plain-bgcolor); +} +.tiny-button.tiny-button--success.is-plain:hover { + color: var(--ti-button-success-color); + fill: var(--ti-button-success-color); + border-color: var(--ti-button-success-normal-color); + background-color: var(--ti-button-success-normal-color); +} +.tiny-button.tiny-button--success.is-plain.is-active, +.tiny-button.tiny-button--success.is-plain:active, +.tiny-button.tiny-button--success.is-plain:focus { + color: var(--ti-button-success-color); + fill: var(--ti-button-success-color); + border-color: var(--ti-button-success-active-color); + background-color: var(--ti-button-success-active-color); + outline: 0; +} +.tiny-button.tiny-button--success.is-plain.is-disabled, +.tiny-button.tiny-button--success.is-plain.is-disabled:active, +.tiny-button.tiny-button--success.is-plain.is-disabled:focus, +.tiny-button.tiny-button--success.is-plain.is-disabled:hover { + color: var(--ti-button-plain-disabled-font-color); + fill: var(--ti-button-success-disabled-bgcolor); + border-color: var(--ti-button-success-disabled-bgcolor); + background-color: var(--ti-button-success-plain-disabled-bgcolor); +} +.tiny-button.tiny-button--warning { + color: var(--ti-button-warning-color); + fill: var(--ti-button-warning-color); + border-color: var(--ti-button-warning-normal-color); + background-color: var(--ti-button-warning-normal-color); +} +.tiny-button.tiny-button--warning:hover { + color: var(--ti-button-warning-color); + fill: var(--ti-button-warning-color); + border-color: var(--ti-button-warning-hover-color); + background-color: var(--ti-button-warning-hover-color); +} +.tiny-button.tiny-button--warning.is-active, +.tiny-button.tiny-button--warning:active, +.tiny-button.tiny-button--warning:focus { + color: var(--ti-button-warning-color); + fill: var(--ti-button-warning-color); + border-color: var(--ti-button-warning-active-color); + background-color: var(--ti-button-warning-active-color); + outline: 0; +} +.tiny-button.tiny-button--warning.is-disabled, +.tiny-button.tiny-button--warning.is-disabled:active, +.tiny-button.tiny-button--warning.is-disabled:focus, +.tiny-button.tiny-button--warning.is-disabled:hover { + color: var(--ti-button-warning-disabled-color); + fill: var(--ti-button-warning-disabled-color); + border-color: var(--ti-button-warning-disabled-border-color); + background-color: var(--ti-button-warning-disabled-bgcolor); +} +.tiny-button.tiny-button--warning.is-plain { + color: var(--ti-button-warning-normal-color); + fill: var(--ti-button-warning-normal-color); + border-color: var(--ti-button-warning-normal-color); + background-color: var(--ti-button-warning-plain-bgcolor); +} +.tiny-button.tiny-button--warning.is-plain:hover { + color: var(--ti-button-warning-color); + fill: var(--ti-button-warning-color); + border-color: var(--ti-button-warning-normal-color); + background-color: var(--ti-button-warning-normal-color); +} +.tiny-button.tiny-button--warning.is-plain.is-active, +.tiny-button.tiny-button--warning.is-plain:active, +.tiny-button.tiny-button--warning.is-plain:focus { + color: var(--ti-button-warning-color); + fill: var(--ti-button-warning-color); + border-color: var(--ti-button-warning-active-color); + background-color: var(--ti-button-warning-active-color); + outline: 0; +} +.tiny-button.tiny-button--warning.is-plain.is-disabled, +.tiny-button.tiny-button--warning.is-plain.is-disabled:active, +.tiny-button.tiny-button--warning.is-plain.is-disabled:focus, +.tiny-button.tiny-button--warning.is-plain.is-disabled:hover { + color: var(--ti-button-plain-disabled-font-color); + fill: var(--ti-button-warning-disabled-bgcolor); + border-color: var(--ti-button-warning-disabled-bgcolor); + background-color: var(--ti-button-warning-plain-disabled-bgcolor); +} +.tiny-button.tiny-button--danger { + color: var(--ti-button-danger-color); + fill: var(--ti-button-danger-color); + border-color: var(--ti-button-danger-normal-color); + background-color: var(--ti-button-danger-normal-color); +} +.tiny-button.tiny-button--danger:hover { + color: var(--ti-button-danger-color); + fill: var(--ti-button-danger-color); + border-color: var(--ti-button-danger-hover-color); + background-color: var(--ti-button-danger-hover-color); +} +.tiny-button.tiny-button--danger.is-active, +.tiny-button.tiny-button--danger:active, +.tiny-button.tiny-button--danger:focus { + color: var(--ti-button-danger-color); + fill: var(--ti-button-danger-color); + border-color: var(--ti-button-danger-active-color); + background-color: var(--ti-button-danger-active-color); + outline: 0; +} +.tiny-button.tiny-button--danger.is-disabled, +.tiny-button.tiny-button--danger.is-disabled:active, +.tiny-button.tiny-button--danger.is-disabled:focus, +.tiny-button.tiny-button--danger.is-disabled:hover { + color: var(--ti-button-danger-disabled-color); + fill: var(--ti-button-danger-disabled-color); + border-color: var(--ti-button-danger-disabled-border-color); + background-color: var(--ti-button-danger-disabled-bgcolor); +} +.tiny-button.tiny-button--danger.is-plain { + color: var(--ti-button-danger-normal-color); + fill: var(--ti-button-danger-normal-color); + border-color: var(--ti-button-danger-normal-color); + background-color: var(--ti-button-danger-plain-bgcolor); +} +.tiny-button.tiny-button--danger.is-plain:hover { + color: var(--ti-button-danger-color); + fill: var(--ti-button-danger-color); + border-color: var(--ti-button-danger-normal-color); + background-color: var(--ti-button-danger-normal-color); +} +.tiny-button.tiny-button--danger.is-plain.is-active, +.tiny-button.tiny-button--danger.is-plain:active, +.tiny-button.tiny-button--danger.is-plain:focus { + color: var(--ti-button-danger-color); + fill: var(--ti-button-danger-color); + border-color: var(--ti-button-danger-active-color); + background-color: var(--ti-button-danger-active-color); + outline: 0; +} +.tiny-button.tiny-button--danger.is-plain.is-disabled, +.tiny-button.tiny-button--danger.is-plain.is-disabled:active, +.tiny-button.tiny-button--danger.is-plain.is-disabled:focus, +.tiny-button.tiny-button--danger.is-plain.is-disabled:hover { + color: var(--ti-button-plain-disabled-font-color); + fill: var(--ti-button-danger-disabled-bgcolor); + border-color: var(--ti-button-danger-disabled-bgcolor); + background-color: var(--ti-button-danger-plain-disabled-bgcolor); +} +.tiny-button.tiny-button--info { + color: var(--ti-button-info-color); + fill: var(--ti-button-info-color); + border-color: var(--ti-button-info-normal-color); + background-color: var(--ti-button-info-normal-color); +} +.tiny-button.tiny-button--info:hover { + color: var(--ti-button-info-color); + fill: var(--ti-button-info-color); + border-color: var(--ti-button-info-hover-color); + background-color: var(--ti-button-info-hover-color); +} +.tiny-button.tiny-button--info.is-active, +.tiny-button.tiny-button--info:active, +.tiny-button.tiny-button--info:focus { + color: var(--ti-button-info-color); + fill: var(--ti-button-info-color); + border-color: var(--ti-button-info-active-color); + background-color: var(--ti-button-info-active-color); + outline: 0; +} +.tiny-button.tiny-button--info.is-disabled, +.tiny-button.tiny-button--info.is-disabled:active, +.tiny-button.tiny-button--info.is-disabled:focus, +.tiny-button.tiny-button--info.is-disabled:hover { + color: var(--ti-button-info-disabled-color); + fill: var(--ti-button-info-disabled-color); + border-color: var(--ti-button-info-disabled-border-color); + background-color: var(--ti-button-info-disabled-bgcolor); +} +.tiny-button.tiny-button--info.is-plain { + color: var(--ti-button-info-normal-color); + fill: var(--ti-button-info-normal-color); + border-color: var(--ti-button-info-normal-color); + background-color: var(--ti-button-info-plain-bgcolor); +} +.tiny-button.tiny-button--info.is-plain:hover { + color: var(--ti-button-info-color); + fill: var(--ti-button-info-color); + border-color: var(--ti-button-info-normal-color); + background-color: var(--ti-button-info-normal-color); +} +.tiny-button.tiny-button--info.is-plain.is-active, +.tiny-button.tiny-button--info.is-plain:active, +.tiny-button.tiny-button--info.is-plain:focus { + color: var(--ti-button-info-color); + fill: var(--ti-button-info-color); + border-color: var(--ti-button-info-active-color); + background-color: var(--ti-button-info-active-color); + outline: 0; +} +.tiny-button.tiny-button--info.is-plain.is-disabled, +.tiny-button.tiny-button--info.is-plain.is-disabled:active, +.tiny-button.tiny-button--info.is-plain.is-disabled:focus, +.tiny-button.tiny-button--info.is-plain.is-disabled:hover { + color: var(--ti-button-plain-disabled-font-color); + fill: var(--ti-button-info-disabled-bgcolor); + border-color: var(--ti-button-info-disabled-bgcolor); + background-color: var(--ti-button-info-plain-disabled-bgcolor); +} +.tiny-button.tiny-button--text { + color: var(--ti-button-text-color); + font-size: var(--ti-common-font-size-1); + border-color: transparent; + background-color: transparent; +} +.tiny-button.tiny-button--text:hover { + color: var(--ti-button-text-hover-color); + border-color: transparent; + background-color: transparent; +} +.tiny-button.tiny-button--text.is-active, +.tiny-button.tiny-button--text:active, +.tiny-button.tiny-button--text:focus { + color: var(--ti-button-text-active-color); + border-color: transparent; + background-color: transparent; +} +.tiny-button.tiny-button--text.is-disabled, +.tiny-button.tiny-button--text.is-disabled:active, +.tiny-button.tiny-button--text.is-disabled:focus, +.tiny-button.tiny-button--text.is-disabled:hover { + color: var(--ti-button-text-disabled-color); + border-color: transparent; + background-color: transparent; +} +.tiny-button.tiny-button--large { + height: var(--ti-button-size-large-height); + line-height: var(--ti-button-size-large-height); + font-size: var(--ti-button-size-large-font-size); +} +.tiny-button.tiny-button--large.is-round { + border-radius: calc(var(--ti-button-size-large-height) / 2); +} +.tiny-button.tiny-button--large.is-circle { + border-radius: 50%; +} +.tiny-button.tiny-button--medium { + height: var(--ti-button-size-medium-height); + line-height: var(--ti-button-size-medium-height); + font-size: var(--ti-button-size-medium-font-size); +} +.tiny-button.tiny-button--medium.is-round { + border-radius: calc(var(--ti-button-size-medium-height) / 2); +} +.tiny-button.tiny-button--medium.is-circle { + border-radius: 50%; +} +.tiny-button.tiny-button--small { + height: var(--ti-button-size-small-height); + line-height: var(--ti-button-size-small-height); + font-size: var(--ti-button-size-small-font-size); +} +.tiny-button.tiny-button--small.is-round { + border-radius: calc(var(--ti-button-size-small-height) / 2); +} +.tiny-button.tiny-button--small.is-circle { + border-radius: 50%; +} +.tiny-button.tiny-button--mini { + height: var(--ti-button-size-mini-height); + line-height: var(--ti-button-size-mini-height); + font-size: var(--ti-button-size-mini-font-size); +} +.tiny-button.tiny-button--mini.is-round { + border-radius: calc(var(--ti-button-size-mini-height) / 2); +} +.tiny-button.tiny-button--mini.is-circle { + border-radius: 50%; +} +.tiny-icon-loading { + font-size: var(--ti-common-font-size-1); + line-height: 1; + -webkit-animation: rotating 2s linear infinite; + animation: rotating 2s linear infinite; +} +@-webkit-keyframes rotating { + 0% { + -webkit-transform: rotateZ(0); + transform: rotateZ(0); + } + 100% { + -webkit-transform: rotateZ(360deg); + transform: rotateZ(360deg); + } +} +@keyframes rotating { + 0% { + -webkit-transform: rotateZ(0); + transform: rotateZ(0); + } + 100% { + -webkit-transform: rotateZ(360deg); + transform: rotateZ(360deg); + } +} +.tiny-button-group { + --ti-button-group-border-color: var(--ti-base-color-border); + --ti-button-group-border-radius: var(--ti-common-border-radius-normal); + --ti-button-group-hover-border-color: var(--ti-base-color-brand-6); + --ti-button-group-info-border-color: rgba(255, 255, 255, 0.5); + --ti-button-group-disabled-color: var(--ti-common-color-bg-disabled); + --ti-button-group-item-background: var(--ti-base-color-light); + --ti-button-group-item-button-color: var(--ti-base-color-info-normal); + --ti-button-group-item-button-width: var(--ti-base-size-width-normal); + --ti-button-group-item-button-height: var(--ti-base-size-height-minor); + --ti-button-group-item-button-font-size: var(--ti-common-font-size-base); + --ti-button-group-item-button-disabled-background: var(--ti-common-color-bg-disabled); + --ti-button-group-item-button-disabled-border-color: var(--ti-base-color-border); + --ti-button-group-item-button-disabled-color: var(--ti-base-color-placeholder); + --ti-button-group-item-button-hover-background: var(--ti-base-color-brand-5); + --ti-button-group-item-button-hover-color: var(--ti-base-color-light); + --ti-button-group-item-button-plain-color: var(--ti-base-color-brand-6); + --ti-button-group-item-button-plain-background: rgba(24, 144, 255, 0.06); + --ti-button-group-item-button-plain-border-color: var(--ti-base-color-brand-6); + --ti-button-group-item-active-background: var(--ti-base-color-brand-6); + --ti-button-group-item-active-color: var(--ti-base-color-light); + display: inline-block; + vertical-align: middle; +} +.tiny-button-group:after, +.tiny-button-group:before { + content: ''; + display: table; +} +.tiny-button-group:after { + clear: both; +} +.tiny-button-group .tiny-group-item { + display: inline-block; + vertical-align: middle; +} +.tiny-button-group .tiny-group-item li { + line-height: 28px; + background: var(--ti-button-group-item-background); + float: left; + position: relative; +} +.tiny-button-group .tiny-group-item li button { + border: 1px solid var(--ti-button-group-border-color); + display: block; + text-align: center; + color: var(--ti-button-group-item-button-color); + background: var(--ti-button-group-item-background); + min-width: var(--ti-button-group-item-button-width); + height: var(--ti-button-group-item-button-height); + padding: 0 8px; + text-decoration: none; + font-size: var(--ti-button-group-item-button-font-size); + outline: 0; + cursor: pointer; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} +.tiny-button-group .tiny-group-item li button.disabled, +.tiny-button-group .tiny-group-item li button[disabled] { + background: var(--ti-button-group-item-button-disabled-background); + border-color: var(--ti-button-group-item-button-disabled-border-color); + cursor: not-allowed; + color: var(--ti-button-group-item-button-disabled-color); +} +.tiny-button-group .tiny-group-item li button.plain, +.tiny-button-group .tiny-group-item li button[plain] { + background: 0 0; +} +.tiny-button-group .tiny-group-item li:hover { + z-index: 1; +} +.tiny-button-group .tiny-group-item li:hover button:not(.disabled) { + background: var(--ti-button-group-item-button-hover-background); + color: var(--ti-button-group-item-button-hover-color); + border-color: var(--ti-button-group-item-button-hover-background); + outline: 0; +} +.tiny-button-group .tiny-group-item li:hover button:not(.disabled).plain, +.tiny-button-group .tiny-group-item li:hover button:not(.disabled)[plain] { + color: var(--ti-button-group-item-button-plain-color); + background-color: var(--ti-button-group-item-button-plain-background); + border-color: var(--ti-button-group-item-button-plain-border-color); +} +.tiny-button-group .tiny-group-item li.active { + z-index: 1; +} +.tiny-button-group .tiny-group-item li.active:hover button:not(.disabled) { + background: var(--ti-button-group-item-button-hover-background); + border-color: var(--ti-button-group-item-button-hover-background); +} +.tiny-button-group .tiny-group-item li.active:hover button:not(.disabled).plain, +.tiny-button-group .tiny-group-item li.active:hover button:not(.disabled)[plain] { + background-color: var(--ti-button-group-item-button-plain-background); +} +.tiny-button-group .tiny-group-item li.active button:not(.disabled) { + background: var(--ti-button-group-item-active-background); + color: var(--ti-button-group-item-active-color); + border-color: var(--ti-button-group-item-active-background); + outline: 0; +} +.tiny-button-group .tiny-group-item li.active button:not(.disabled).plain, +.tiny-button-group .tiny-group-item li.active button:not(.disabled)[plain] { + color: var(--ti-button-group-item-active-background); + background: 0 0; +} +.tiny-button-group .tiny-group-item li:first-child button { + border-radius: var(--ti-common-border-radius-normal) 0 0 var(--ti-common-border-radius-normal); +} +.tiny-button-group .tiny-group-item li:last-child button { + border-radius: 0 var(--ti-common-border-radius-normal) var(--ti-common-border-radius-normal) 0; +} +.tiny-button-group .tiny-group-item li:not(:last-child) { + margin-right: -1px; +} +.tiny-button-group > .tiny-button { + float: left; + position: relative; +} +.tiny-button-group > .tiny-button + .tiny-button { + margin-left: 0; +} +.tiny-button-group > .tiny-button:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right-color: var(--ti-button-group-info-border-color); +} +.tiny-button-group > .tiny-button:first-child.tiny-button--default { + border-right-color: var(--ti-button-group-border-color); +} +.tiny-button-group > .tiny-button:first-child.tiny-button--default:active, +.tiny-button-group > .tiny-button:first-child.tiny-button--default:focus, +.tiny-button-group > .tiny-button:first-child.tiny-button--default:hover { + border-right-color: var(--ti-button-group-hover-border-color); + z-index: 1; +} +.tiny-button-group > .tiny-button:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-color: var(--ti-button-group-info-border-color); +} +.tiny-button-group > .tiny-button:last-child.tiny-button--default { + border-left-color: var(--ti-button-group-border-color); +} +.tiny-button-group > .tiny-button:last-child.tiny-button--default:active, +.tiny-button-group > .tiny-button:last-child.tiny-button--default:focus, +.tiny-button-group > .tiny-button:last-child.tiny-button--default:hover { + border-left-color: var(--ti-button-group-hover-border-color); + z-index: 1; +} +.tiny-button-group > .tiny-button:first-child:last-child { + border-radius: var(--ti-button-group-border-radius); +} +.tiny-button-group > .tiny-button:first-child:last-child.is-round { + border-radius: calc(var(--ti-button-size-normal-height, 30px) / 2); +} +.tiny-button-group > .tiny-button:first-child:last-child.is-circle { + border-radius: 50%; +} +.tiny-button-group > .tiny-button:not(:first-child):not(:last-child) { + border-radius: 0; + border-left-color: var(--ti-button-group-info-border-color); + border-right-color: var(--ti-button-group-info-border-color); +} +.tiny-button-group > .tiny-button:not(:first-child):not(:last-child).tiny-button--default { + border-left-color: var(--ti-button-group-border-color); + border-right-color: var(--ti-button-group-border-color); +} +.tiny-button-group > .tiny-button:not(:first-child):not(:last-child).tiny-button--default:active, +.tiny-button-group > .tiny-button:not(:first-child):not(:last-child).tiny-button--default:focus, +.tiny-button-group > .tiny-button:not(:first-child):not(:last-child).tiny-button--default:hover { + border-left-color: var(--ti-button-group-hover-border-color); + border-right-color: var(--ti-button-group-hover-border-color); + z-index: 1; +} +.tiny-button-group > .tiny-button:not(:last-child) { + margin-right: -1px; +} +.tiny-button-group > .tiny-button > .tiny-dropdown > .tiny-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-color: var(--ti-button-group-info-border-color); +} +.tiny-transition-zoom-in-top-enter-active, +.tiny-transition-zoom-in-top-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: center top; + transform-origin: center top; +} +.tiny-transition-zoom-in-top-enter, +.tiny-transition-zoom-in-top-enter-from, +.tiny-transition-zoom-in-top-leave-to { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0); + -webkit-transform-origin: center top; + transform-origin: center top; +} +.tiny-calendar { + --ti-calendar-bgcolor: var(--ti-base-color-light); + --ti-calendar-list-item-selected-font-color: var(--ti-base-color-light); + --ti-calendar-hover-color: var(--ti-base-color-brand-5); + --ti-calendar-border-color: var(--ti-base-color-border); + --ti-calendar-color-primary: var(--ti-base-color-brand-6); + --ti-calendar-background-color-primary: rgba(24, 144, 255, 0.1); + --ti-calendar-color-success: var(--ti-base-color-success-normal); + --ti-calendar-color-warning: var(--ti-base-color-warning-normal); + --ti-calendar-color-danger: var(--ti-base-color-bg-8); + --ti-calendar-color-info: var(--ti-base-color-info-normal); + --ti-calendar-tool-width: var(--ti-base-size-width-normal); + --ti-calendar-content-heard-font-size: var(--ti-common-font-size-1); + --ti-calendar-selected-border-radius: var(--ti-base-radius-large); + --ti-calendar-input-height: var(--ti-base-size-height-minor); + --ti-calendar-input-border-radius: var(--ti-common-border-radius-normal); + --ti-calendar-input-font-size: var(--ti-common-font-size-base); + --ti-calendar-list-item-height: var(--ti-base-size-height-minor); + --ti-calendar-list-item-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-calendar-list-item-selected-bgcolor: var(--ti-base-color-selected-background); + --ti-calendar-disabled-color: var(--ti-common-color-text-disabled); + --ti-calendar-disabled-info-color: var(--ti-base-color-bg-5); + --ti-calendar-disabled-success-color: var(--ti-base-color-bg-5); + --ti-calendar-disabled-warning-color: var(--ti-base-color-bg-5); + --ti-calendar-disabled-error-color: var(--ti-base-color-bg-5); + background: var(--ti-calendar-bgcolor); + overflow: hidden; + margin: 10px; +} +.tiny-calendar.is-popover.tiny-popover.tiny-popper { + padding: 0; + margin: 2px 0 0; +} +.tiny-calendar .tiny-calendar__header { + overflow: hidden; + margin-bottom: 12px; +} +.tiny-calendar .tiny-calendar__selected { + border: 1px solid var(--ti-calendar-color-primary); + background: var(--ti-calendar-background-color-primary); + padding: 8px; + color: var(--ti-calendar-color-info); + line-height: 140%; + border-radius: var(--ti-calendar-selected-border-radius); + margin-bottom: 8px; +} +.tiny-calendar .tiny-calendar__tool { + list-style: none; + overflow: hidden; + float: right; + margin-bottom: 8px; +} +.tiny-calendar .tiny-calendar__tool > li { + float: left; + margin-right: 8px; +} +.tiny-calendar .tiny-calendar__tool > li > span { + display: inline-block; +} +.tiny-calendar .tiny-calendar__tool > li:last-child { + margin-left: 16px; + margin-right: 0; +} +.tiny-calendar .tiny-calendar__input { + width: var(--ti-calendar-tool-width); + position: relative; + outline: 0; +} +.tiny-calendar .tiny-calendar__input > input { + width: 100%; + height: var(--ti-calendar-input-height); + line-height: var(--ti-calendar-input-height); + border: 1px solid var(--ti-calendar-border-color); + color: var(--ti-calendar-color-info); + border-radius: var(--ti-calendar-input-border-radius); + background: var(--ti-calendar-bgcolor); + font-size: var(--ti-calendar-input-font-size); + padding: 0 30px 0 8px; + display: block; + white-space: nowrap; + -webkit-transition: border 0.3s; + transition: border 0.3s; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-calendar .tiny-calendar__input > input.active, +.tiny-calendar .tiny-calendar__input > input:active, +.tiny-calendar .tiny-calendar__input > input:focus, +.tiny-calendar .tiny-calendar__input > input:hover, +.tiny-calendar .tiny-calendar__input > input[active] { + border: 1px solid var(--ti-calendar-color-primary); +} +.tiny-calendar .tiny-calendar__input > input[readonly] { + cursor: not-allowed; +} +.tiny-calendar .tiny-calendar__input-btn { + bottom: 0; + right: 4px; + position: absolute; + top: 0; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + overflow: hidden; + font-size: var(--ti-common-font-size-base); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; +} +.tiny-calendar .tiny-calendar__input-btn svg { + fill: var(--ti-calendar-color-primary); +} +.tiny-calendar .tiny-calendar__input-btn svg:hover { + fill: var(--ti-calendar-hover-color); +} +.tiny-calendar .tiny-calendar__tabs { + list-style: none; + overflow: hidden; +} +.tiny-calendar .tiny-calendar__tabs > li { + position: relative; + float: left; + width: calc(var(--ti-calendar-tool-width) / 2); + height: var(--ti-calendar-input-height); + line-height: var(--ti-calendar-input-height); + border: 1px solid var(--ti-calendar-border-color); + text-align: center; + font-size: var(--ti-calendar-input-font-size); + font-weight: 500; + color: var(--ti-calendar-color-info); + cursor: pointer; +} +.tiny-calendar .tiny-calendar__tabs > li:first-child { + border-radius: 3px 0 0 3px; +} +.tiny-calendar .tiny-calendar__tabs > li:last-child { + margin-left: -1px; + border-radius: 0 3px 3px 0; +} +.tiny-calendar .tiny-calendar__tabs > li:hover { + color: var(--ti-calendar-color-primary); +} +.tiny-calendar .tiny-calendar__tabs > .active { + color: var(--ti-calendar-color-primary); + border: 1px solid var(--ti-calendar-color-primary); + z-index: 1; +} +.tiny-calendar .tiny-calendar__main { + width: 100%; + overflow: hidden; +} +.tiny-calendar .tiny-calendar__main table { + width: 100%; +} +.tiny-calendar .tiny-calendar__main table > tr > th { + line-height: 18px; + padding: 0 10px 5px 10px; + font-size: var(--ti-calendar-content-heard-font-size); + text-align: right; + width: 14.28571429%; +} +.tiny-calendar .tiny-calendar__main table > tr > td { + text-align: right; + padding: 0 5px 0 0; +} +.tiny-calendar .tiny-calendar__main.year table > tr > td { + width: 33.33333333%; +} +.tiny-calendar .tiny-calendar__day { + border-top: 3px solid var(--ti-calendar-border-color); + margin: 0 3px 5px 3px; + height: 100px; + padding: 5px; +} +.tiny-calendar .tiny-calendar__day.selected { + background: var(--ti-calendar-background-color-primary); +} +.tiny-calendar .tiny-calendar__day.selected .label { + color: var(--ti-calendar-color-primary); +} +.tiny-calendar .tiny-calendar__day:hover { + background: var(--ti-calendar-background-color-primary); +} +.tiny-calendar .tiny-calendar__day.disable { + color: var(--ti-calendar-disabled-color); +} +.tiny-calendar .tiny-calendar__day.disable .info:before { + background: var(--ti-calendar-disabled-info-color); +} +.tiny-calendar .tiny-calendar__day.disable .success:before { + background: var(--ti-calendar-disabled-success-color); +} +.tiny-calendar .tiny-calendar__day.disable .warning:before { + background: var(--ti-calendar-disabled-warning-color); +} +.tiny-calendar .tiny-calendar__day.disable .error:before { + background: var(--ti-calendar-disabled-error-color); +} +.tiny-calendar .tiny-calendar__day.this-month, +.tiny-calendar .tiny-calendar__day.today { + border-color: var(--ti-calendar-color-primary); +} +.tiny-calendar .tiny-calendar__events { + text-align: left; + height: calc(100% - 18px); + overflow-y: auto; +} +.tiny-calendar .tiny-calendar__events .event { + margin: 5px 10px; + cursor: pointer; +} +.tiny-calendar .tiny-calendar__events .event:before { + content: ''; + width: 6px; + height: 6px; + border-radius: 50%; + display: inline-block; + margin-right: 3px; +} +.tiny-calendar .tiny-calendar__events .info:before { + background: var(--ti-calendar-color-info); +} +.tiny-calendar .tiny-calendar__events .success:before { + background: var(--ti-calendar-color-success); +} +.tiny-calendar .tiny-calendar__events .warning:before { + background: var(--ti-calendar-color-warning); +} +.tiny-calendar .tiny-calendar__events .error:before { + background: var(--ti-calendar-color-danger); +} +.tiny-calendar__tip { + display: block; + min-width: 160px; +} +.tiny-calendar__tip-header { + overflow: hidden; + border-bottom: 1px solid rgba(255, 255, 255, 0.5); + padding: 5px 0; + font-size: var(--ti-calendar-content-heard-font-size); +} +.tiny-calendar__tip-year { + float: left; +} +.tiny-calendar__tip-hours { + float: right; +} +.tiny-calendar__tip-title { + margin: 5px 0; + font-weight: 700; +} +.tiny-calendar .tiny-calendar__selector { + width: var(--ti-calendar-tool-width); + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; +} +.tiny-calendar .tiny-calendar__list-item { + min-height: var(--ti-calendar-list-item-height); + line-height: var(--ti-calendar-list-item-height); + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0 8px; + color: var(--ti-calendar-color-info); +} +.tiny-calendar .tiny-calendar__list-item:hover { + cursor: pointer; + background: var(--ti-calendar-list-item-hover-bgcolor); +} +.tiny-calendar .tiny-calendar__list-item.is-selected { + background: var(--ti-calendar-list-item-selected-bgcolor); + color: var(--ti-calendar-list-item-selected-font-color); +} +.tiny-cards { + --ti-card-background: var(--ti-base-color-light); + --ti-card-drop-border-color: var(--ti-base-color-brand-6); + border-radius: 0; + background-color: var(--ti-card-background); + overflow: hidden; + position: relative; + -webkit-box-shadow: none; + box-shadow: none; + border: 0; +} +.tiny-cards .tiny-cards_body { + padding: 12px 24px 24px; +} +.tiny-cards.card-layout { + border: none; + border-radius: 0; + overflow: hidden; + -webkit-box-shadow: none; + box-shadow: none; + position: relative; + -webkit-transition: height 0.2s ease; + transition: height 0.2s ease; +} +.tiny-cards.card-layout .tiny-cards_body { + padding: 0; +} +.tiny-cards.card-layout.drop-active { + border: 1px solid var(--ti-card-drop-border-color); + background-color: var(--ti-card-background); +} +.tiny-card-template { + --ti-card-background: var(--ti-base-color-light); + --ti-card-tool-icon-size: 16px; + --ti-card-tool-icon-color: var(--ti-base-color-brand-6); + --ti-card-tool-icon-hover-color: var(--ti-base-color-brand-5); + --ti-card-tool-icon-active-color: var(--ti-base-color-primary-active); + --ti-card-tool-selector-height: var(--ti-common-size-10x); + --ti-card-tool-selector-color: var(--ti-base-color-info-normal); + --ti-card-tool-selector-hover-color: var(--ti-base-color-brand-6); + --ti-card-tool-selector-hover-background: var(--ti-base-color-selected-background); + --ti-card-tool-selector-active-color: var(--ti-base-color-primary-active); + --ti-card-tool-selector-active-background: var(--ti-base-color-selected-background); + --ti-card-header-height: 46px; + --ti-card-header-border-color: var(--ti-base-color-border); + --ti-card-header-title-font-weight: var(--ti-common-font-weight-7); + --ti-card-header-title-font-size: var(--ti-common-font-size-1); + --ti-card-header-title-color: var(--ti-base-color-info-normal); + border-radius: 0; + background-color: var(--ti-card-background); + overflow: hidden; + position: relative; + -webkit-box-shadow: none; + box-shadow: none; + border: 0; +} +.tiny-card-template .tiny-card-template__header { + padding: 0 24px; + height: var(--ti-card-header-height); + line-height: var(--ti-card-header-height); +} +.tiny-card-template .tiny-card-template__header.is-line { + border-bottom: 1px solid var(--ti-card-header-border-color); +} +.tiny-card-template .tiny-card-template__title { + font-weight: var(--ti-card-header-title-font-weight); + font-size: var(--ti-card-header-title-font-size); + color: #333; + color: var(--ti-card-header-title-color); + float: left; +} +.tiny-card-template .tiny-card-template__tools:after, +.tiny-card-template .tiny-card-template__tools:before { + content: ''; + display: table; +} +.tiny-card-template .tiny-card-template__tools:after { + clear: both; +} +.tiny-card-template .tiny-card-template__tools .tiny-icon { + font-size: var(--ti-card-tool-icon-size); + cursor: pointer; +} +.tiny-card-template .tiny-card-template__list { + overflow: hidden; + float: right; +} +.tiny-card-template .tiny-card-template__list > li { + height: var(--ti-card-header-height); + line-height: var(--ti-card-header-height); + float: left; + font-size: var(--ti-common-font-size-2); + margin: 0 12px 0 0; +} +.tiny-card-template .tiny-card-template__list > li svg { + fill: var(--ti-card-tool-icon-color); + cursor: pointer; +} +.tiny-card-template .tiny-card-template__list > li .tiny-icon { + color: var(--ti-card-tool-icon-color); +} +.tiny-card-template .tiny-card-template__list > li .tiny-icon:hover { + color: var(--ti-card-tool-icon-hover-color); +} +.tiny-card-template .tiny-card-template__list > li .tiny-icon:active { + color: var(--ti-card-tool-icon-active-color); +} +.tiny-card-template .tiny-card-template__list > li:last-child { + margin: 0; +} +.tiny-card-template .tiny-card-template__more { + position: absolute; + top: calc(var(--ti-card-header-height, 45px) - 1 * 1px); + right: 5px; + border: 1px solid var(--ti-card-header-border-color); + border-radius: 2px; + -webkit-box-shadow: var(--ti-base-box-shadow); + box-shadow: var(--ti-base-box-shadow); + background: var(--ti-card-background); + color: #333; + color: var(--ti-card-tool-selector-color); + margin-top: 2px; +} +.tiny-card-template .tiny-card-template__more:before { + content: ''; + position: absolute; + display: block; + top: -5px; + right: 21px; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + border-color: #fff #fff transparent transparent; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-box-shadow: 1px -1px 1px rgba(0, 0, 0, 0.2); + box-shadow: 1px -1px 1px rgba(0, 0, 0, 0.2); +} +.tiny-card-template .tiny-card-template__more > ul > li { + height: var(--ti-card-tool-selector-height); + line-height: var(--ti-card-tool-selector-height); + padding: 0 18px; + color: var(--ti-card-tool-selector-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-card-template .tiny-card-template__more > ul > li .tiny-icon { + color: var(--ti-card-tool-icon-color); + margin-right: 10px; +} +.tiny-card-template .tiny-card-template__more > ul > li svg { + font-size: var(--ti-common-font-size-2); +} +.tiny-card-template .tiny-card-template__more > ul > li:hover { + cursor: pointer; + color: var(--ti-card-tool-selector-hover-color); + background: var(--ti-card-tool-selector-hover-background); +} +.tiny-card-template .tiny-card-template__more > ul > li:hover .tiny-icon { + color: var(--ti-card-tool-icon-hover-color); +} +.tiny-card-template .tiny-card-template__more > ul > li:active { + color: var(--ti-card-tool-selector-active-color); + background: var(--ti-card-tool-selector-active-background); +} +.tiny-card-template .tiny-card-template__more > ul > li:active .tiny-icon { + color: var(--ti-card-tool-icon-active-color); +} +.tiny-card-template .tiny-card-template__body { + padding: 12px 24px 24px; +} +.tiny-transition-carousel-arrow-left-enter, +.tiny-transition-carousel-arrow-left-enter-from, +.tiny-transition-carousel-arrow-left-leave-to { + opacity: 0; + left: 0; +} +.tiny-transition-carousel-arrow-left-enter-active { + -webkit-animation: animation-left 0.3s; + animation: animation-left 0.3s; +} +.tiny-transition-carousel-arrow-left-leave-active { + animation: animation-left 0.3s reverse; +} +.tiny-transition-carousel-arrow-right-enter, +.tiny-transition-carousel-arrow-right-enter-from, +.tiny-transition-carousel-arrow-right-leave-to { + opacity: 0; + right: 0; +} +.tiny-transition-carousel-arrow-right-enter-active { + -webkit-animation: animation-right 0.3s; + animation: animation-right 0.3s; +} +.tiny-transition-carousel-arrow-right-leave-active { + animation: animation-right 0.3s reverse; +} +@-webkit-keyframes animation-right { + 0% { + opacity: 0; + right: 0; + } + 100% { + opacity: 1; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + right: 16px; + } +} +@keyframes animation-right { + 0% { + opacity: 0; + right: 0; + } + 100% { + opacity: 1; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + right: 16px; + } +} +@-webkit-keyframes animation-left { + 0% { + opacity: 0; + left: 0; + } + 100% { + opacity: 1; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + left: 16px; + } +} +@keyframes animation-left { + 0% { + opacity: 0; + left: 0; + } + 100% { + opacity: 1; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + left: 16px; + } +} +.tiny-carousel { + --ti-carousel-arrow-height: var(--ti-base-size-height-minor); + --ti-carousel-arrow-width: var(--ti-base-size-width-minor); + --ti-carousel-arrow-font-size: var(--ti-common-font-size-base); + --ti-carousel-arrow-hover-color: rgba(0, 0, 0, 0.6); + --ti-carousel-arrow-background: rgba(0, 0, 0, 0.3); + --ti-carousel-arrow-box-shadow: none; + --ti-carousel-arrow-active-color: var(--ti-base-color-light); + --ti-carousel-indicators-background: rgba(3, 2, 2, 0.3); + --ti-carousel-indicators-radius: 13px; + --ti-carousel-indicators-height: var(--ti-common-size-4x); + --ti-carousel-indicators-radius-background: rgba(0, 0, 0, 0.3); + --ti-carousel-indicator-active-color: var(--ti-base-color-light); + --ti-carousel-indicator-button-width: var(--ti-common-size-2x); + --ti-carousel-indicator-button-height: var(--ti-common-size-2x); + --ti-carousel-indicator-button-color: #bfbfbf; + --ti-carousel-indicator-margin-right: 0; + --ti-carousel-indicator-active-width: var(--ti-common-size-3x); + --ti-carousel-indicator-padding: 0px 2px; + --ti-carousel-indicator-active-transition-property: none; + --ti-carousel-indicator-active-background-color: var(--ti-base-color-transparent); + --ti-carousel-indicator-active-button-width: var(--ti-carousel-indicator-button-width); + --ti-carousel-indicator-active-border-radius: var(--ti-carousel-indicators-radius); + --ti-carousel-indicator-active-transition: none; + --ti-carousel-outside-button-background: var(--ti-base-color-dark); + --ti-carousel-outside-button-active-background: var(--ti-base-color-secondary); + --ti-carousel-labels-button-font-size: var(--ti-common-font-size-base); + --ti-carousel-hover-opacity: 0.6; + overflow: hidden; + position: relative; +} +.tiny-carousel.tiny-carousel--card .tiny-carousel__indicators { + display: none; +} +.tiny-carousel__container { + position: relative; + height: 300px; +} +.tiny-carousel__container .tiny-carousel__arrow { + border: none; + outline: 0; + padding: 0; + margin: 0; + height: var(--ti-carousel-arrow-height); + width: var(--ti-carousel-arrow-width); + cursor: pointer; + -webkit-transition: 0.3s; + transition: 0.3s; + border-radius: 50%; + -webkit-box-shadow: var(--ti-carousel-arrow-box-shadow); + box-shadow: var(--ti-carousel-arrow-box-shadow); + background-color: var(--ti-carousel-arrow-background); + color: var(--ti-carousel-indicator-active-color); + position: absolute; + top: 50%; + z-index: 3; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + text-align: center; + font-size: var(--ti-carousel-arrow-font-size); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-carousel__container .tiny-carousel__arrow .tiny-svg { + fill: var(--ti-carousel-indicator-active-color); +} +.tiny-carousel__container .tiny-carousel__arrow.tiny-carousel__arrow-left { + left: 16px; +} +.tiny-carousel__container .tiny-carousel__arrow.tiny-carousel__arrow-right { + right: 16px; +} +.tiny-carousel__container .tiny-carousel__arrow:hover { + background-color: var(--ti-carousel-arrow-hover-color); +} +.tiny-carousel__container .tiny-carousel__arrow i { + cursor: pointer; +} +.tiny-carousel .tiny-carousel__indicators { + position: absolute; + list-style: none; + bottom: 8px; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + margin: 0; + padding: 0 4px; + z-index: 2; + background: var(--ti-carousel-indicators-background); + border-radius: var(--ti-carousel-indicators-radius); + height: var(--ti-carousel-indicators-height); +} +.tiny-carousel .tiny-carousel__indicators .tiny-carousel__indicator { + display: inline-block; + background-color: transparent; + padding: var(--ti-carousel-indicator-padding); + margin-right: var(--ti-carousel-indicator-margin-right); + cursor: pointer; +} +.tiny-carousel .tiny-carousel__indicators .tiny-carousel__indicator:hover button { + opacity: var(--ti-carousel-hover-opacity); +} +.tiny-carousel .tiny-carousel__indicators .tiny-carousel__indicator.is-active { + width: var(--ti-carousel-indicator-active-width); + background-color: var(--ti-carousel-indicator-active-background-color); + border-radius: var(--ti-carousel-indicator-active-border-radius); + -webkit-transition: var(--ti-carousel-indicator-active-transition); + transition: var(--ti-carousel-indicator-active-transition); +} +.tiny-carousel .tiny-carousel__indicators .tiny-carousel__indicator.is-active button { + -webkit-transition-property: var(--ti-carousel-indicator-active-transition-property); + transition-property: var(--ti-carousel-indicator-active-transition-property); + -webkit-transition-timing-function: cubic-bezier(0.16, 0.75, 0.5, 1); + transition-timing-function: cubic-bezier(0.16, 0.75, 0.5, 1); + border-radius: var(--ti-carousel-indicator-active-border-radius); + background-color: var(--ti-carousel-indicator-active-color); + width: var(--ti-carousel-indicator-active-button-width); +} +.tiny-carousel .tiny-carousel__indicators .tiny-carousel__indicator .tiny-carousel__button { + display: block; + width: var(--ti-carousel-indicator-button-width); + height: var(--ti-carousel-indicator-button-height); + background-color: var(--ti-carousel-indicator-button-color); + border: none; + outline: 0; + padding: 0; + margin: 0; + cursor: pointer; + -webkit-transition: 0.3s; + transition: 0.3s; + border-radius: 50%; +} +.tiny-carousel .tiny-carousel__indicators .tiny-carousel__button._radius { + height: 8px; + width: 8px; + border-radius: 50%; + background-color: var(--ti-carousel-indicators-radius-background); +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-outside { + bottom: 26px; + text-align: center; + position: static; + -webkit-transform: none; + transform: none; + margin-top: 16px; + background: 0 0; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-outside button { + background-color: var(--ti-carousel-outside-button-background); +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-outside .tiny-carousel__indicator:hover button { + opacity: 0.6; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-outside .tiny-carousel__indicator.is-active button { + background-color: var(--ti-carousel-outside-button-active-background); +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-labels { + left: 0; + right: 0; + -webkit-transform: none; + transform: none; + text-align: center; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-labels .tiny-carousel__button { + padding: 2px 18px; + font-size: var(--ti-carousel-labels-button-font-size); +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-labels .tiny-carousel__indicator { + padding: 6px 4px; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-title { + left: auto; + right: 12px; + bottom: 3px; + -webkit-transform: none; + transform: none; + background: 0 0; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-vertical { + left: 12px; + right: 0; + bottom: 50%; + width: 16px; + height: 56px; + -webkit-transform: translateY(50%); + transform: translateY(50%); + padding: 2px 4px; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-vertical .tiny-carousel__indicator { + display: block; + margin: 4px 0; + padding: 0; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-vertical .tiny-carousel__indicator:first-child { + padding-left: 0; +} +.tiny-carousel .tiny-carousel__indicators.tiny-carousel__indicators-vertical .tiny-carousel__indicator:last-child { + padding-right: 0; +} +.tiny-carousel .tiny-carousel__indicators:not(.tiny-carousel__indicators-vertical) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-carousel { + --ti-carousel-item-title-height: var(--ti-base-size-height-small); + --ti-carousel-item-title-color: var(--ti-base-color-light); + --ti-carousel-item-title-background: rgba(0, 0, 0, 0.3); + --ti-carousel-item-title-span-font-size: var(--ti-common-font-size-base); + --ti-carousel-mask-background: var(--ti-base-color-light); +} +.tiny-carousel__item, +.tiny-carousel__mask { + position: absolute; + height: 100%; + top: 0; + left: 0; +} +.tiny-carousel__item { + width: 100%; + display: inline-block; + overflow: hidden; + z-index: 0; +} +.tiny-carousel__item .item-title { + position: absolute; + bottom: 0; + height: var(--ti-carousel-item-title-height); + width: 100%; + line-height: var(--ti-carousel-item-title-height); + color: var(--ti-carousel-item-title-color, #fff); + text-align: left; + background: var(--ti-carousel-item-title-background); +} +.tiny-carousel__item .item-title span { + padding: 0 12px; + font-size: var(--ti-carousel-item-title-span-font-size); + width: 80%; + display: inline-block; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.tiny-carousel__item.is-active { + z-index: 2; +} +.tiny-carousel__item.is-animating { + -webkit-transition: -webkit-transform 0.4s ease-in-out; + transition: -webkit-transform 0.4s ease-in-out; + transition: transform 0.4s ease-in-out; + transition: transform 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out; +} +.tiny-carousel__item--card { + width: 50%; + -webkit-transition: -webkit-transform 0.4s ease-in-out; + transition: -webkit-transform 0.4s ease-in-out; + transition: transform 0.4s ease-in-out; + transition: transform 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out; +} +.tiny-carousel__item--card.is-in-stage { + cursor: pointer; + z-index: 1; +} +.tiny-carousel__item--card.is-in-stage.is-hover .tiny-carousel__mask, +.tiny-carousel__item--card.is-in-stage:hover .tiny-carousel__mask { + opacity: 0.12; +} +.tiny-carousel__item--card.is-active { + z-index: 2; +} +.tiny-carousel__mask { + width: 100%; + background-color: var(--ti-carousel-mask-background); + opacity: 0.24; + -webkit-transition: 0.2s; + transition: 0.2s; +} +.tiny-cascader { + --ti-cascader-font-size: var(--ti-common-font-size-1); + --ti-cascader-hover-border-color: var(--ti-base-color-common-5); + --ti-cascader-focus-border-color: var(--ti-base-color-brand-6); + --ti-cascader-border-radius: var(--ti-common-border-radius-1); + --ti-cascader-icon-color: #909399; + --ti-cascader-medium-font-size: var(--ti-common-font-size-1); + --ti-cascader-medium-line-height: 36px; + --ti-cascader-small-line-height: 32px; + --ti-cascader-mini-line-height: 28px; + --ti-cascader-small-font-size: 13px; + --ti-cascader-mini-font-size: var(--ti-common-font-size-base, 12px); + --ti-cascader-disabled-color: #c0c4cc; + --ti-cascader-dropdown-background: var(--ti-base-color-light); + --ti-cascader-dropdown-border-color: #e4e7ed; + --ti-cascader-tag-background: #f0f2f5; + --ti-cascader-tag-icon-bgcolor: #c0c4cc; + --ti-cascader-tag-icon-color: var(--ti-base-color-light); + --ti-cascader-tag-icon-hover-bgcolor: #909399; + --ti-cascader-list-color: #606266; + --ti-cascader-item-height: var(--ti-base-size-height-minor); + --ti-cascader-item-hover-background: #f5f7fa; + --ti-cascader-item-checked-color: var(--ti-base-color-brand-5); + --ti-cascader-empty-text-color: #c0c4cc; + --ti-cascader-search-input-color: var(--ti-base-color-info-normal); + --ti-cascader-search-input-placeholder-color: var(--ti-base-color-placeholder); + --ti-cascader-dropdown-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-cascader-width: '100%'; + display: inline-block; + position: relative; + font-size: var(--ti-cascader-font-size); +} +.tiny-cascader:not(.is-disabled):hover .tiny-input__inner { + cursor: pointer; + border-color: var(--ti-cascader-hover-border-color); +} +.tiny-cascader .tiny-input { + cursor: pointer; +} +.tiny-cascader .tiny-input .tiny-input__inner { + text-overflow: ellipsis; +} +.tiny-cascader .tiny-input .tiny-input__inner:focus { + border-color: var(--ti-cascader-focus-border-color); +} +.tiny-cascader .tiny-input.is-focus .tiny-input__inner { + border-color: var(--ti-cascader-focus-border-color); +} +.tiny-cascader .tiny-input .tiny-icon-arrow-down { + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s; + font-size: var(--ti-cascader-font-size); +} +.tiny-cascader .tiny-input .tiny-icon-arrow-down.is-reverse { + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg); +} +.tiny-cascader .tiny-input .tiny-icon-circle-close:hover { + color: var(--ti-cascader-icon-color); +} +.tiny-cascader--medium { + font-size: var(--ti-cascader-medium-font-size); + line-height: var(--ti-cascader-medium-line-height); +} +.tiny-cascader--small { + font-size: var(--ti-cascader-small-font-size); + line-height: var(--ti-cascader-small-line-height); +} +.tiny-cascader--mini { + font-size: var(--ti-cascader-mini-font-size); + line-height: var(--ti-cascader-mini-line-height); +} +.tiny-cascader.is-disabled .tiny-cascader__label { + z-index: 2; + color: var(--ti-cascader-disabled-color); +} +.tiny-cascader__dropdown { + --ti-cascader-font-size: var(--ti-common-font-size-1); + --ti-cascader-hover-border-color: var(--ti-base-color-common-5); + --ti-cascader-focus-border-color: var(--ti-base-color-brand-6); + --ti-cascader-border-radius: var(--ti-common-border-radius-1); + --ti-cascader-icon-color: #909399; + --ti-cascader-medium-font-size: var(--ti-common-font-size-1); + --ti-cascader-medium-line-height: 36px; + --ti-cascader-small-line-height: 32px; + --ti-cascader-mini-line-height: 28px; + --ti-cascader-small-font-size: 13px; + --ti-cascader-mini-font-size: var(--ti-common-font-size-base, 12px); + --ti-cascader-disabled-color: #c0c4cc; + --ti-cascader-dropdown-background: var(--ti-base-color-light); + --ti-cascader-dropdown-border-color: #e4e7ed; + --ti-cascader-tag-background: #f0f2f5; + --ti-cascader-tag-icon-bgcolor: #c0c4cc; + --ti-cascader-tag-icon-color: var(--ti-base-color-light); + --ti-cascader-tag-icon-hover-bgcolor: #909399; + --ti-cascader-list-color: #606266; + --ti-cascader-item-height: var(--ti-base-size-height-minor); + --ti-cascader-item-hover-background: #f5f7fa; + --ti-cascader-item-checked-color: var(--ti-base-color-brand-5); + --ti-cascader-empty-text-color: #c0c4cc; + --ti-cascader-search-input-color: var(--ti-base-color-info-normal); + --ti-cascader-search-input-placeholder-color: var(--ti-base-color-placeholder); + --ti-cascader-dropdown-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-cascader-width: '100%'; + margin: 5px 0; + font-size: var(--ti-cascader-font-size); + background: var(--ti-cascader-dropdown-background); + border: 1px solid var(--ti-cascader-dropdown-border-color); + border-radius: var(--ti-cascader-border-radius); + -webkit-box-shadow: var(--ti-cascader-dropdown-box-shadow); + box-shadow: var(--ti-cascader-dropdown-box-shadow); +} +.tiny-cascader__dropdown.is-auto-size { + background: 0 0; + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-cascader__dropdown.is-auto-size .tiny-cascader-panel { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.tiny-cascader__dropdown.is-auto-size .tiny-cascader-menu { + border: 1px solid #e4e7ed; + background: #fff; +} +.tiny-cascader__dropdown.is-auto-size .tiny-cascader-menu:not(:first-child) { + margin-left: -1px; +} +.tiny-cascader__dropdown.is-auto-size .tiny-cascader-menu .tiny-cascader-menu__wrap { + height: auto; + padding-bottom: 6px; + max-height: 220px; +} +.tiny-cascader__tags { + position: absolute; + left: 0; + right: 30px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + line-height: normal; + text-align: left; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-cascader__tags .tiny-tag { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + max-width: 100%; + margin: 2px 0 2px 6px; + text-overflow: ellipsis; + background: var(--ti-cascader-tag-background); +} +.tiny-cascader__tags .tiny-tag:not(.is-hit) { + border-color: transparent; +} +.tiny-cascader__tags .tiny-tag > span { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-cascader__tags .tiny-tag > span { + -ms-flex-preferred-size: auto; + flex-basis: auto; + } +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-cascader__tags .tiny-tag .tiny-tag__close { + -ms-flex-negative: 0; + flex-shrink: 0; + } +} +.tiny-cascader__tags .tiny-tag .tiny-icon-close { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + background-color: var(--ti-cascader-tag-icon-bgcolor); + color: var(--ti-cascader-tag-icon-color); +} +.tiny-cascader__tags .tiny-tag .tiny-icon-close:hover { + background-color: var(--ti-cascader-tag-icon-hover-bgcolor); +} +.tiny-cascader__suggestion-panel { + border-radius: var(--ti-cascader-border-radius); +} +.tiny-cascader__suggestion-list { + max-height: 204px; + margin: 0; + padding: 6px 0; + font-size: var(--ti-cascader-font-size); + color: var(--ti-cascader-list-color); + text-align: center; +} +.tiny-cascader__suggestion-panel .tiny-cascader__suggestion-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: var(--ti-cascader-item-height); + padding: 0 8px; + font-size: var(--ti-common-font-size-base); + color: var(--ti-cascader-search-input-color); + text-align: left; + outline: 0; + cursor: pointer; +} +.tiny-cascader__suggestion-panel .tiny-cascader__suggestion-item:focus, +.tiny-cascader__suggestion-panel .tiny-cascader__suggestion-item:hover { + background: var(--ti-cascader-item-hover-background); +} +.tiny-cascader__suggestion-panel .tiny-cascader__suggestion-item.is-checked { + color: var(--ti-cascader-item-checked-color); + font-weight: 700; +} +.tiny-cascader__suggestion-panel .tiny-cascader__suggestion-item.is-checked .icon-check { + fill: var(--ti-cascader-item-checked-color); +} +.tiny-cascader__suggestion-panel .tiny-cascader__suggestion-item > span { + margin-right: 10px; +} +.tiny-cascader__empty-text { + margin: 10px 0; + color: var(--ti-cascader-empty-text-color); +} +.tiny-cascader__search-input { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + height: 24px; + min-width: 60px; + margin-left: 2px; + padding-left: 8px; + color: var(--ti-cascader-search-input-color); + font-size: var(--ti-common-font-size-base); + border: none; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-cascader__search-input::-moz-placeholder { + color: var(--ti-cascader-search-input-placeholder-color); + opacity: 1; +} +.tiny-cascader__search-input:-ms-input-placeholder { + color: var(--ti-cascader-search-input-placeholder-color); +} +.tiny-cascader__search-input::-webkit-input-placeholder { + color: var(--ti-cascader-search-input-placeholder-color); +} +.tiny-cascader__search-input::-ms-input-placeholder { + color: var(--ti-cascader-search-input-placeholder-color); +} +.tiny-cascader__search-input::placeholder { + color: var(--ti-cascader-search-input-placeholder-color); +} +.tiny-cascader-multiple { + width: var(--ti-cascader-width); +} +.tiny-cascader-menu { + --ti-cascader-menu-color: var(--ti-base-color-info-normal); + --ti-cascader-menu-border-color: #e4e7ed; + --ti-cascader-menu-empty-text-color: #c0c4cc; + --ti-cascader-menu-list-padding: 0; + --ti-cascader-menu-width: 180px; + min-width: var(--ti-cascader-menu-width); + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: var(--ti-cascader-menu-color); + border-right: solid 1px var(--ti-cascader-menu-border-color); +} +.tiny-cascader-menu:last-child { + border-right: none; +} +.tiny-cascader-menu:last-child .tiny-cascader-node { + padding-right: 20px; +} +.tiny-cascader-menu .tiny-cascader-menu__wrap { + height: 204px; +} +.tiny-cascader-menu .tiny-cascader-menu__list { + position: relative; + min-height: 100%; + margin: 0; + list-style: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: var(--ti-cascader-menu-list-padding); +} +.tiny-cascader-menu__hover-zone { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} +.tiny-cascader-menu__empty-text { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + color: var(--ti-cascader-menu-empty-text-color); +} +.tiny-cascader-node { + --ti-cascader-node-hover-bgcolor: var(--ti-base-color-brand-1); + --ti-cascader-node-hover-color: var(--ti-base-color-brand-6); + --ti-cascader-node-font-color: var(--ti-base-color-white); + --ti-cascader-node-selectable-hover-bgcolor: var(--ti-base-color-selected-background); + --ti-cascader-node-selectable-font-color: var(--ti-base-color-selected-font-color); + --ti-cascader-node-disabled-color: var(--ti-base-color-placeholder); + --ti-cascader-node-icon-font-size: var(--ti-common-font-size-1); + --ti-cascader-node-icon-color: #bfbfbf; + --ti-cascader-node-prefix-display: 'inline-block'; + --ti-cascader-node-label-padding: 0 10px; +} +.tiny-cascader-node.is-selectable.in-active-path { + color: var(--ti-cascader-node-font-color); +} +.tiny-cascader-node.in-active-path, +.tiny-cascader-node.is-active { + background: var(--ti-cascader-node-selectable-hover-bgcolor); + color: var(--ti-cascader-node-selectable-font-color); +} +.tiny-cascader-node.in-active-path, +.tiny-cascader-node.in-active-path:hover, +.tiny-cascader-node.is-active, +.tiny-cascader-node.is-active:hover { + background: var(--ti-cascader-node-selectable-hover-bgcolor); +} +.tiny-cascader-node:not(.is-disabled):not(.in-active-path):not(.is-active):focus, +.tiny-cascader-node:not(.is-disabled):not(.in-active-path):not(.is-active):hover { + background: var(--ti-cascader-node-hover-bgcolor); + color: var(--ti-cascader-node-hover-color); +} +.tiny-cascader-node:not(.is-disabled) { + cursor: pointer; +} +.tiny-cascader-node.is-disabled { + color: var(--ti-cascader-node-disabled-color); + fill: var(--ti-cascader-node-disabled-color); + background-color: var(--ti-cascader-node-disabled-bgcolor); + cursor: not-allowed; +} +.tiny-cascader-node__postfix, +.tiny-cascader-node__prefix { + font-size: var(--ti-cascader-node-icon-font-size); + fill: var(--ti-cascader-node-icon-color); +} +.tiny-cascader-node__prefix { + position: absolute; + left: 10px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + display: var(--ti-cascader-node-prefix-display) !important; +} +.tiny-cascader-node__postfix { + position: absolute; + top: 50%; + right: 10px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.tiny-cascader-node__label { + max-width: 360px; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + padding: var(--ti-cascader-node-label-padding); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-cascader-node__label { + -ms-flex-preferred-size: auto; + flex-basis: auto; + } +} +.tiny-cascader-node > .tiny-radio { + margin-right: var(--ti-common-space-base); +} +.tiny-cascader-node > .tiny-radio .tiny-radio__label { + padding-left: 0; +} +.tiny-cascader-node > .tiny-checkbox { + margin-right: var(--ti-common-space-base); +} +.tiny-cascader-panel { + --ti-cascader-panel-border-radius: var(--ti-common-border-radius-normal); + --ti-cascader-panel-border-color: var(--ti-base-color-border); + --ti-cascader-panel-font-size: var(--ti-common-font-size-base); + --ti-cascader-panel-node-height: var(--ti-base-size-height-minor); + --ti-cascader-panel-node-gap: 0; + --ti-cascader-panel-node-label-padding: 0 30px 0 20px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + border-radius: var(--ti-cascader-panel-border-radius); + font-size: var(--ti-cascader-panel-font-size); +} +.tiny-cascader-panel.is-bordered { + border: 1px solid var(--ti-cascader-panel-border-color); + border-radius: var(--ti-cascader-panel-border-radius); +} +.tiny-cascader-panel .tiny-cascader-node { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: var(--ti-cascader-panel-node-label-padding); + height: var(--ti-cascader-panel-node-height); + line-height: var(--ti-cascader-panel-node-height); + outline: 0; + border-radius: var(--ti-common-border-radius-normal); + margin-top: var(--ti-cascader-panel-node-gap); +} +.tiny-chart { + --ti-chart-core-data-empty-color: #888; + --ti-chart-core-data-empty-font-size: var(--ti-common-font-size-1); + --ti-chart-core-data-empty-bgcolor: rgba(255, 255, 255, 0.9); +} +.tiny-chart-data-empty { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: var(--ti-chart-core-data-empty-bgcolor); + color: var(--ti-chart-core-data-empty-color); + font-size: var(--ti-chart-core-data-empty-font-size); +} +.tiny-chart-component-loading { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: var(--ti-chart-core-data-empty-bgcolor); +} +.tiny-chart-component-loading .circular { + width: 42px; + height: 42px; + -webkit-animation: loading-rotate 2s linear infinite; + animation: loading-rotate 2s linear infinite; +} +.tiny-chart-component-loading .path { + -webkit-animation: loading-dash 1.5s ease-in-out infinite; + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: #20a0ff; + stroke-linecap: round; +} +.tiny-chart-mask-status { + -webkit-filter: blur(1px); + filter: blur(1px); +} +@-webkit-keyframes loading-rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes loading-rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px; + } +} +@keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px; + } +} +.tiny-checkbox { + --ti-checkbox-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-font-size: var(--ti-common-font-size-base); + --ti-checkbox-background-color: var(--ti-base-color-brand-2); + --ti-checkbox-bg-color: var(--ti-base-color-white); + --ti-checkbox-shadow-color: #dfe1e6; + --ti-checkbox-border-radius: var(--ti-common-border-radius-normal); + --ti-checkbox-hover-color: var(--ti-base-color-common-7); + --ti-checkbox-checked-color: var(--ti-base-color-brand-6); + --ti-checkbox-disabled-color: var(--ti-base-color-placeholder); + --ti-checkbox-disabled-bgcolor: var(--ti-base-color-bg-5); + --ti-checkbox-disabled-border-color: var(--ti-base-color-bg-5); + --ti-checkbox-button-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-button-checked-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-inner-border-color: var(--ti-base-color-light); + --ti-checkbox-bg-color-checked: var(--ti-base-color-brand-6); + --ti-checkbox-border-color-checked: var(--ti-base-color-brand-6); + --ti-checkbox-border-color: var(--ti-common-color-line-normal); + --ti-checkbox-border-color-hover: var(--ti-base-color-brand-6); + --ti-checkbox-icon-height: 8px; + --ti-checkbox-icon-width: 4px; + --ti-checkbox-icon-left: 4.5px; + --ti-checkbox-icon-top: 0; + --ti-checkbox-bg-color-disable: var(--ti-base-color-bg-5); + --ti-checkbox-border-color-unchecked-disabled: var(--ti-base-color-common-1); + --ti-checkbox-label-color-disabled: var(--ti-base-color-common-2); + --ti-checkbox-bg-color-hover: var(--ti-base-color-brand-3); + position: relative; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: var(--ti-checkbox-font-color); + font-weight: 500; + font-size: 0; + white-space: nowrap; + margin-right: 30px; + outline: 0; + cursor: pointer; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-checkbox:last-of-type { + margin-right: 0; +} +.tiny-checkbox.is-bordered { + padding: 9px 20px 9px 10px; + border-radius: 2px; + border: 1px solid var(--ti-checkbox-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: normal; + height: 40px; +} +.tiny-checkbox.is-bordered + .tiny-checkbox.is-bordered { + margin-left: 10px; +} +.tiny-checkbox.is-bordered.is-checked { + border-color: var(--ti-checkbox-checked-color); +} +.tiny-checkbox.is-bordered.is-disabled { + border-color: var(--ti-checkbox-border-color-unchecked-disabled); + color: var(--ti-checkbox-bg-color-disable); + pointer-events: none; + cursor: not-allowed; +} +.tiny-checkbox.is-bordered.is-disabled .tiny-checkbox__inner, +.tiny-checkbox.is-bordered.is-disabled .tiny-checkbox__inner:hover { + border-color: var(--ti-checkbox-border-color-unchecked-disabled); + cursor: not-allowed; +} +.tiny-checkbox.is-bordered.is-disabled.is-checked { + border-color: var(--ti-checkbox-bg-color-disable); +} +.tiny-checkbox.is-bordered.is-disabled.is-checked .tiny-checkbox__inner, +.tiny-checkbox.is-bordered.is-disabled.is-checked .tiny-checkbox__inner:hover { + background-color: var(--ti-checkbox-bg-color-disable); + border-color: var(--ti-checkbox-bg-color-disable); +} +.tiny-checkbox.is-bordered.is-disabled.is-checked .tiny-checkbox__inner::after, +.tiny-checkbox.is-bordered.is-disabled.is-checked .tiny-checkbox__inner:hover::after { + border-color: var(--ti-checkbox-border-color-unchecked-disabled); +} +.tiny-checkbox.is-bordered.tiny-checkbox--medium { + padding: 7px 20px 7px 10px; + border-radius: 4px; + height: 36px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--medium .tiny-checkbox__label { + line-height: 17px; + font-size: var(--ti-common-font-size-1); +} +.tiny-checkbox.is-bordered.tiny-checkbox--medium .tiny-checkbox__inner { + height: 14px; + width: 14px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--small { + padding: 5px 15px 5px 10px; + border-radius: 3px; + height: 32px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--small .tiny-checkbox__label { + line-height: 15px; + font-size: var(--ti-common-font-size-base); +} +.tiny-checkbox.is-bordered.tiny-checkbox--small .tiny-checkbox__inner { + height: 12px; + width: 12px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--small .tiny-checkbox__inner::after { + height: 6px; + width: 2px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--mini { + padding: 3px 15px 3px 10px; + border-radius: 3px; + height: 28px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--mini .tiny-checkbox__label { + line-height: 12px; + font-size: var(--ti-common-font-size-base); +} +.tiny-checkbox.is-bordered.tiny-checkbox--mini .tiny-checkbox__inner { + height: 12px; + width: 12px; +} +.tiny-checkbox.is-bordered.tiny-checkbox--mini .tiny-checkbox__inner::after { + height: 6px; + width: 2px; +} +.tiny-checkbox__input { + position: relative; + display: inline-block; + white-space: nowrap; + vertical-align: middle; + outline: 0; + line-height: 1; + cursor: pointer; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-checkbox__input { + display: inline-block; + } +} +@supports (-ms-ime-align: auto) { + .tiny-checkbox__input { + display: inline-block; + } +} +.tiny-checkbox__input .tiny-checkbox__inner svg { + fill: var(--ti-checkbox-border-color); +} +.tiny-checkbox__input .tiny-checkbox__inner:hover svg { + fill: var(--ti-checkbox-hover-color); +} +.tiny-checkbox__input.is-disabled .tiny-checkbox__inner { + background-color: var(--ti-checkbox-bg-color-disable); + border-color: var(--ti-checkbox-border-color-unchecked-disabled); + cursor: not-allowed; +} +.tiny-checkbox__input.is-disabled .tiny-checkbox__inner svg { + fill: var(--ti-checkbox-border-color-unchecked-disabled); +} +.tiny-checkbox__input.is-disabled .tiny-checkbox__inner + .tiny-checkbox__label { + cursor: not-allowed; +} +.tiny-checkbox__input.is-disabled.is-checked .tiny-checkbox__inner, +.tiny-checkbox__input.is-disabled.is-checked .tiny-checkbox__inner:hover { + background-color: var(--ti-checkbox-label-color-disabled); + border-color: var(--ti-checkbox-label-color-disabled); +} +.tiny-checkbox__input.is-disabled.is-checked .tiny-checkbox__inner::after, +.tiny-checkbox__input.is-disabled.is-checked .tiny-checkbox__inner:hover::after { + border-color: var(--ti-checkbox-bg-color-disable); +} +.tiny-checkbox__input.is-disabled.is-indeterminate .tiny-checkbox__inner, +.tiny-checkbox__input.is-disabled.is-indeterminate .tiny-checkbox__inner:hover { + background-color: var(--ti-checkbox-label-color-disabled); + border-color: var(--ti-checkbox-label-color-disabled); +} +.tiny-checkbox__input.is-disabled.is-indeterminate .tiny-checkbox__inner::before, +.tiny-checkbox__input.is-disabled.is-indeterminate .tiny-checkbox__inner:hover::before { + background-color: var(--ti-checkbox-bg-color-disable); + border-color: var(--ti-checkbox-bg-color-disable); +} +.tiny-checkbox__input.is-disabled + span.tiny-checkbox__label { + color: var(--ti-checkbox-label-color-disabled); + cursor: not-allowed; +} +.tiny-checkbox__input.is-checked .tiny-checkbox__inner::after { + -webkit-transform: rotate(45deg) scaleY(1); + transform: rotate(45deg) scaleY(1); +} +.tiny-checkbox__input.is-indeterminate .tiny-checkbox__inner::before { + content: ''; + position: absolute; + display: block; + border-radius: 1px; + background-color: #fff; + height: 6px; + width: 6px; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; +} +.tiny-checkbox__input.is-indeterminate .tiny-checkbox__inner::after { + display: none; +} +.tiny-checkbox__input.is-checked .tiny-checkbox__inner, +.tiny-checkbox__input.is-indeterminate .tiny-checkbox__inner { + background-color: var(--ti-checkbox-bg-color-checked); + border-color: var(--ti-checkbox-border-color-checked); +} +.tiny-checkbox__input.is-checked .tiny-checkbox__inner:hover, +.tiny-checkbox__input.is-indeterminate .tiny-checkbox__inner:hover { + background-color: var(--ti-checkbox-bg-color-checked); + border-color: var(--ti-checkbox-border-color-checked); +} +.tiny-checkbox__inner { + display: inline-block; + position: relative; + border: 1px solid var(--ti-checkbox-border-color); + border-radius: var(--ti-common-border-radius-normal); + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16px; + height: 16px; + background-color: var(--ti-checkbox-bg-color); + outline: 0; + z-index: 1; + -webkit-transition: border-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46), + background-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46); + transition: border-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46), + background-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46); +} +.tiny-checkbox__inner:hover { + border-color: var(--ti-checkbox-border-color-hover); +} +.tiny-checkbox__inner::after { + -webkit-box-sizing: content-box; + box-sizing: content-box; + content: ''; + border: 1px solid #fff; + border-width: 0 2px 2px 0; + border-left: 0; + border-top: 0; + height: var(--ti-checkbox-icon-height); + width: var(--ti-checkbox-icon-width); + position: absolute; + left: var(--ti-checkbox-icon-left); + top: var(--ti-checkbox-icon-top); + -webkit-transform: rotate(45deg) scaleY(0); + transform: rotate(45deg) scaleY(0); + -webkit-transition: -webkit-transform 0.15s ease-in 50ms; + transition: -webkit-transform 0.15s ease-in 50ms; + transition: transform 0.15s ease-in 50ms; + transition: transform 0.15s ease-in 50ms, -webkit-transform 0.15s ease-in 50ms; + -webkit-transform-origin: center; + transform-origin: center; +} +.tiny-checkbox__original { + opacity: 0; + outline: 0; + position: absolute; + margin: 0; + width: 0; + height: 0; + z-index: -1; +} +.tiny-checkbox__label { + padding-left: 8px; + font-size: var(--ti-checkbox-font-size); +} +.tiny-checkbox-button { + --ti-checkbox-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-font-size: var(--ti-common-font-size-base); + --ti-checkbox-background-color: var(--ti-base-color-brand-2); + --ti-checkbox-bg-color: var(--ti-base-color-white); + --ti-checkbox-shadow-color: #dfe1e6; + --ti-checkbox-border-radius: var(--ti-common-border-radius-normal); + --ti-checkbox-hover-color: var(--ti-base-color-common-7); + --ti-checkbox-checked-color: var(--ti-base-color-brand-6); + --ti-checkbox-disabled-color: var(--ti-base-color-placeholder); + --ti-checkbox-disabled-bgcolor: var(--ti-base-color-bg-5); + --ti-checkbox-disabled-border-color: var(--ti-base-color-bg-5); + --ti-checkbox-button-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-button-checked-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-inner-border-color: var(--ti-base-color-light); + --ti-checkbox-bg-color-checked: var(--ti-base-color-brand-6); + --ti-checkbox-border-color-checked: var(--ti-base-color-brand-6); + --ti-checkbox-border-color: var(--ti-common-color-line-normal); + --ti-checkbox-border-color-hover: var(--ti-base-color-brand-6); + --ti-checkbox-icon-height: 8px; + --ti-checkbox-icon-width: 4px; + --ti-checkbox-icon-left: 4.5px; + --ti-checkbox-icon-top: 0; + --ti-checkbox-bg-color-disable: var(--ti-base-color-bg-5); + --ti-checkbox-border-color-unchecked-disabled: var(--ti-base-color-common-1); + --ti-checkbox-label-color-disabled: var(--ti-base-color-common-2); + --ti-checkbox-bg-color-hover: var(--ti-base-color-brand-3); + position: relative; + display: inline-block; +} +.tiny-checkbox-button:first-child .tiny-checkbox-button__inner { + border-radius: var(--ti-common-border-radius-normal) 0 0 var(--ti-common-border-radius-normal); +} +.tiny-checkbox-button:last-child .tiny-checkbox-button__inner { + border-radius: 0 var(--ti-common-border-radius-normal) var(--ti-common-border-radius-normal) 0; +} +.tiny-checkbox-button.is-checked .tiny-checkbox-button__inner { + color: var(--ti-checkbox-button-checked-font-color); + border-color: var(--ti-checkbox-checked-color); + -webkit-box-shadow: -1px 0 0 0 var(--ti-checkbox-shadow-color); + box-shadow: -1px 0 0 0 var(--ti-checkbox-shadow-color); +} +.tiny-checkbox-button.is-checked:first-child .tiny-checkbox-button__inner { + border-left-color: var(--ti-checkbox-checked-color); + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-checkbox-button.is-disabled .tiny-checkbox-button__inner { + color: var(--ti-checkbox-disabled-color); + cursor: not-allowed; + background-image: none; + background-color: var(--ti-checkbox-disabled-border-color); + border-color: var(--ti-checkbox-border-color); + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-checkbox-button.is-disabled:first-child .tiny-checkbox-button__inner { + border-left-color: var(--ti-checkbox-border-color); +} +.tiny-checkbox-button__inner { + position: relative; + display: inline-block; + white-space: nowrap; + vertical-align: middle; + outline: 0; + line-height: 1; + font-weight: 500; + cursor: pointer; + background: var(--ti-checkbox-background-color); + border-left: 0; + border: 1px solid #e9edfa; + color: var(--ti-checkbox-button-font-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0 2px; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + padding: 12px 20px; + font-size: var(--ti-common-font-size-2); + min-width: 80px; + border-radius: 0; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-checkbox-button__inner.is-round { + padding: 12px 20px; +} +.tiny-checkbox-button__inner:hover { + background: var(--ti-checkbox-bg-color-hover); + color: var(--ti-checkbox-hover-color); +} +.tiny-checkbox-button__original { + opacity: 0; + outline: 0; + position: absolute; + margin: 0; + z-index: -1; +} +.tiny-checkbox-button--medium .tiny-checkbox-button__inner { + padding: 10px 20px; + font-size: var(--ti-common-font-size-1); + border-radius: 0; +} +.tiny-checkbox-button--medium .tiny-checkbox-button__inner.is-round { + padding: 10px 20px; +} +.tiny-checkbox-button--small .tiny-checkbox-button__inner { + padding: 8px 15px; + font-size: var(--ti-common-font-size-base); + border-radius: 0; +} +.tiny-checkbox-button--small .tiny-checkbox-button__inner.is-round { + padding: 8px 15px; +} +.tiny-checkbox-button--mini .tiny-checkbox-button__inner { + padding: 5px 15px; + font-size: var(--ti-common-font-size-base); + border-radius: 0; +} +.tiny-checkbox-button--mini .tiny-checkbox-button__inner.is-round { + padding: 5px 15px; +} +.tiny-checkbox-group { + --ti-checkbox-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-font-size: var(--ti-common-font-size-base); + --ti-checkbox-background-color: var(--ti-base-color-brand-2); + --ti-checkbox-bg-color: var(--ti-base-color-white); + --ti-checkbox-shadow-color: #dfe1e6; + --ti-checkbox-border-radius: var(--ti-common-border-radius-normal); + --ti-checkbox-hover-color: var(--ti-base-color-common-7); + --ti-checkbox-checked-color: var(--ti-base-color-brand-6); + --ti-checkbox-disabled-color: var(--ti-base-color-placeholder); + --ti-checkbox-disabled-bgcolor: var(--ti-base-color-bg-5); + --ti-checkbox-disabled-border-color: var(--ti-base-color-bg-5); + --ti-checkbox-button-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-button-checked-font-color: var(--ti-base-color-info-normal); + --ti-checkbox-inner-border-color: var(--ti-base-color-light); + --ti-checkbox-bg-color-checked: var(--ti-base-color-brand-6); + --ti-checkbox-border-color-checked: var(--ti-base-color-brand-6); + --ti-checkbox-border-color: var(--ti-common-color-line-normal); + --ti-checkbox-border-color-hover: var(--ti-base-color-brand-6); + --ti-checkbox-icon-height: 8px; + --ti-checkbox-icon-width: 4px; + --ti-checkbox-icon-left: 4.5px; + --ti-checkbox-icon-top: 0; + --ti-checkbox-bg-color-disable: var(--ti-base-color-bg-5); + --ti-checkbox-border-color-unchecked-disabled: var(--ti-base-color-common-1); + --ti-checkbox-label-color-disabled: var(--ti-base-color-common-2); + --ti-checkbox-bg-color-hover: var(--ti-base-color-brand-3); + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-checkbox-group.is-vertical { + display: inline-block; +} +.tiny-checkbox-group.is-vertical .tiny-checkbox { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-right: 0; +} +.tiny-checkbox-group.is-vertical .tiny-checkbox:not(:last-child) { + margin-bottom: 8px; +} +.tiny-checkbox-group.is-vertical .tiny-checkbox-button { + display: block; +} +.tiny-checkbox-group.is-vertical .tiny-checkbox-button:first-child .tiny-checkbox-button__inner { + border-radius: 2px 2px 0 0; +} +.tiny-checkbox-group.is-vertical .tiny-checkbox-button:last-child .tiny-checkbox-button__inner { + border-radius: 0 0 2px 2px; +} +.tiny-checkbox-group.is-vertical .tiny-checkbox-button.is-checked .tiny-checkbox-button__inner { + -webkit-box-shadow: 0 -1px 0 0 var(--ti-checkbox-shadow-color); + box-shadow: 0 -1px 0 0 var(--ti-checkbox-shadow-color); + border-color: var(--ti-checkbox-checked-color); +} +.tiny-checkbox-group.is-vertical .tiny-checkbox-button.is-checked.is-disabled .tiny-checkbox-button__inner { + -webkit-box-shadow: 0 -1px 0 0 var(--ti-checkbox-border-color); + box-shadow: 0 -1px 0 0 var(--ti-checkbox-border-color); + border-color: var(--ti-checkbox-border-color); + background: var(--ti-checkbox-disabled-bgcolor); +} +.tiny- { + --ti-collapse-border-color: var(--ti-base-color-border); +} +.tiny-fade-in-linear-enter-active, +.tiny-fade-in-linear-leave-active { + -webkit-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.tiny-fade-in-linear-enter, +.tiny-fade-in-linear-enter-from, +.tiny-fade-in-linear-leave, +.tiny-fade-in-linear-leave-active, +.tiny-fade-in-linear-leave-from { + opacity: 0; +} +.tiny-fade-in-enter-active, +.tiny-fade-in-leave-active { + -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.tiny-fade-in-enter, +.tiny-fade-in-enter-from, +.tiny-fade-in-leave-active { + opacity: 0; +} +.tiny-zoom-in-center-enter-active, +.tiny-zoom-in-center-leave-active { + -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.tiny-zoom-in-center-enter, +.tiny-zoom-in-center-enter-from, +.tiny-zoom-in-center-leave-active { + opacity: 0; + -webkit-transform: scaleX(0); + transform: scaleX(0); +} +.tiny-zoom-in-top-enter-active, +.tiny-zoom-in-top-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: center top; + transform-origin: center top; +} +.tiny-zoom-in-top-enter, +.tiny-zoom-in-top-enter-from, +.tiny-zoom-in-top-leave-active { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0); +} +.tiny-zoom-in-bottom-enter-active, +.tiny-zoom-in-bottom-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +.tiny-zoom-in-bottom-enter, +.tiny-zoom-in-bottom-leave-active, +.tiny-zoom-in-left-enter-from { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0); +} +.tiny-zoom-in-left-enter-active, +.tiny-zoom-in-left-leave-active { + opacity: 1; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: top left; + transform-origin: top left; +} +.tiny-zoom-in-left-enter, +.tiny-zoom-in-left-enter-from, +.tiny-zoom-in-left-leave-active { + opacity: 0; + -webkit-transform: scale(0.45, 0.45); + transform: scale(0.45, 0.45); +} +.tiny-list-enter-active, +.tiny-list-leave-active { + -webkit-transition: all 1s; + transition: all 1s; +} +.tiny-list-enter, +.tiny-list-enter-from, +.tiny-list-leave-active { + opacity: 0; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); +} +.tiny-opacity-transition { + -webkit-transition: opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.collapse-transition { + -webkit-transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out; + transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out; +} +.horizontal-collapse-transition { + -webkit-transition: 0.3s width ease-in-out, 0.3s padding-left ease-in-out, 0.3s padding-right ease-in-out; + transition: 0.3s width ease-in-out, 0.3s padding-left ease-in-out, 0.3s padding-right ease-in-out; +} +.fade-in-linear-enter, +.fade-in-linear-enter-from, +.fade-in-linear-leave, +.fade-in-linear-leave-active, +.fade-in-linear-leave-from { + opacity: 0; +} +.fade-in-linear-enter-active, +.fade-in-linear-leave-active { + -webkit-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.tiny-collapse-item { + --ti-collapse-item-color: var(--ti-base-color-info-normal); + --ti-collapse-item-icon-color: var(--ti-common-color-icon-normal); + --ti-collapse-item-bgcolor: var(--ti-base-color-light); + --ti-collapse-item-border-color: var(--ti-base-color-border); + --ti-collapse-item-disabled-color: var(--ti-base-color-placeholder); + --ti-collapse-item-header-font-size: var(--ti-common-font-size-base); + --ti-collapse-item-header-focus-color: var(--ti-base-color-brand-5); + --ti-collapse-item-arrow-font-size: var(--ti-common-font-size-base); + --ti-collapse-item-arrow-hover-color: var(--ti-base-color-info-normal); + --ti-collapse-item-content-font-size: var(--ti-common-font-size-base); + --ti-collapse-item-header-bgcolor: var(--ti-base-color-brand-1); + --ti-collapse-item-space-between: var(--ti-common-space-2x); + --ti-collapse-item-bg-color: var(--ti-common-color-bg-white-normal); + --ti-collapse-item-border: 1px solid var(--ti-common-color-line-dividing); + --ti-collapse-item-border-radius: var(--ti-common-border-radius-normal); + --ti-collapse-item-icon-fs: var(--ti-common-font-size-2); + --ti-collapse-item-header-padding: 0 var(--ti-common-space-4x); + --ti-collapse-item-content-border-top: 1px solid var(--ti-common-color-line-dividing); + margin-top: var(--ti-collapse-item-space-between); + background-color: var(--ti-collapse-item-bg-color); + border: var(--ti-collapse-item-border); + border-radius: var(--ti-collapse-item-border-radius); +} +.tiny-collapse-item:last-child { + margin-bottom: -1px; +} +.tiny-collapse-item.is-disabled .tiny-collapse-item__header { + color: var(--ti-collapse-item-disabled-color); + cursor: not-allowed; +} +.tiny-collapse-item.is-disabled .tiny-collapse-item__arrow { + fill: var(--ti-collapse-item-disabled-color); +} +.tiny-collapse-item__header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 34px; + line-height: 34px; + background-color: var(--ti-collapse-item-header-bgcolor); + color: var(--ti-collapse-item-color); + font-size: var(--ti-collapse-item-header-font-size); + font-family: Helvetica, Arial, 'microsoft yahei'; + outline: 0; + cursor: pointer; + -webkit-transition: border-bottom-color 0.3s; + transition: border-bottom-color 0.3s; + border-radius: var(--ti-common-border-radius-normal); + padding: var(--ti-collapse-item-header-padding); +} +.tiny-collapse-item__header.focusing:focus:not(:hover) { + color: var(--ti-collapse-item-header-focus-color); +} +.tiny-collapse-item__header.is-active { + border-bottom-color: transparent; +} +.tiny-collapse-item__header svg { + font-size: var(--ti-collapse-item-icon-fs); + fill: var(--ti-collapse-item-icon-color); +} +.tiny-collapse-item__arrow { + font-size: var(--ti-collapse-item-arrow-font-size); + margin-right: 12px; + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.tiny-collapse-item__arrow.is-active { + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.tiny-collapse-item__arrow.is-active, +.tiny-collapse-item__arrow:hover { + fill: var(--ti-collapse-item-arrow-hover-color); +} +.tiny-collapse-item__wrap { + will-change: height; + background-color: var(--ti-collapse-item-bgcolor); + overflow: hidden; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-collapse-item__content { + padding: 12px 16px; + font-size: var(--ti-collapse-item-content-font-size); + color: var(--ti-collapse-item-color); + border-top: var(--ti-collapse-item-content-border-top); + line-height: 1.76923077; +} +.tiny-container .tiny-container__aside, +.tiny-container .tiny-container__footer, +.tiny-container .tiny-container__header, +.tiny-container .tiny-container__main { + position: absolute; + -webkit-box-sizing: border-box; + box-sizing: border-box; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin: 0; +} +.tiny-container .tiny-container__main { + overflow-y: auto; +} +.tiny-container .tiny-container__footer { + top: auto; + width: auto; +} +.credit-card-item { + max-width: 430px; + height: 270px; + margin-left: auto; + margin-right: auto; + position: relative; + z-index: 2; + width: 100%; +} +@media screen and (max-width: 480px) { + .credit-card-item { + max-width: 310px; + height: 220px; + width: 90%; + } +} +@media screen and (max-width: 360px) { + .credit-card-item { + height: 180px; + } +} +.credit-card-item.-active .credit-card-item__side.-front { + -webkit-transform: perspective(1000px) rotateY(180deg) rotateX(0) rotateZ(0); + transform: perspective(1000px) rotateY(180deg) rotateX(0) rotateZ(0); +} +.credit-card-item.-active .credit-card-item__side.-back { + -webkit-transform: perspective(1000px) rotateY(0) rotateX(0) rotateZ(0); + transform: perspective(1000px) rotateY(0) rotateX(0) rotateZ(0); +} +.credit-card-item__focus { + position: absolute; + z-index: 3; + border-radius: 5px; + left: 0; + top: 0; + width: 100%; + height: 100%; + -webkit-transition: all 0.35s cubic-bezier(0.71, 0.03, 0.56, 0.85); + transition: all 0.35s cubic-bezier(0.71, 0.03, 0.56, 0.85); + opacity: 0; + pointer-events: none; + overflow: hidden; + border: 2px solid rgba(255, 255, 255, 0.65); +} +.credit-card-item__focus:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: #08142f; + height: 100%; + border-radius: 5px; + -webkit-filter: blur(25px); + filter: blur(25px); + opacity: 0.5; +} +.credit-card-item__focus.-active { + opacity: 1; +} +.credit-card-item__side { + border-radius: 15px; + overflow: hidden; + -webkit-box-shadow: 0 20px 60px 0 rgba(14, 42, 90, 0.55); + box-shadow: 0 20px 60px 0 rgba(14, 42, 90, 0.55); + -webkit-transform: perspective(2000px) rotateY(0) rotateX(0) rotate(0); + transform: perspective(2000px) rotateY(0) rotateX(0) rotate(0); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transition: all 0.8s cubic-bezier(0.71, 0.03, 0.56, 0.85); + transition: all 0.8s cubic-bezier(0.71, 0.03, 0.56, 0.85); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + height: 100%; +} +.credit-card-item__side.-back { + position: absolute; + top: 0; + left: 0; + width: 100%; + -webkit-transform: perspective(2000px) rotateY(-180deg) rotateX(0) rotate(0); + transform: perspective(2000px) rotateY(-180deg) rotateX(0) rotate(0); + z-index: 2; + padding: 0; + height: 100%; +} +.credit-card-item__side.-back .credit-card-item__cover { + -webkit-transform: rotateY(-180deg); + transform: rotateY(-180deg); +} +.credit-card-item__bg { + max-width: 100%; + display: block; + max-height: 100%; + height: 100%; + width: 100%; + -o-object-fit: cover; + object-fit: cover; +} +.credit-card-item__cover { + position: absolute; + height: 100%; + background-color: #1c1d27; + background-image: linear-gradient(147deg, #354fce 0, #0c296b 74%); + left: 0; + top: 0; + width: 100%; + border-radius: 15px; + overflow: hidden; +} +.credit-card-item__cover:after { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: rgba(6, 2, 29, 0.45); +} +.credit-card-item__top { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin-bottom: 40px; + padding: 0 10px; +} +@media screen and (max-width: 480px) { + .credit-card-item__top { + margin-bottom: 25px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__top { + margin-bottom: 15px; + } +} +.credit-card-item__chip { + width: 60px; +} +@media screen and (max-width: 480px) { + .credit-card-item__chip { + width: 50px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__chip { + width: 40px; + } +} +.credit-card-item__type { + height: 45px; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + max-width: 100px; + margin-left: auto; + width: 100%; +} +@media screen and (max-width: 480px) { + .credit-card-item__type { + height: 40px; + max-width: 90px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__type { + height: 30px; + } +} +.credit-card-item__typeImg { + max-width: 100%; + -o-object-fit: contain; + object-fit: contain; + max-height: 100%; + -o-object-position: top right; + object-position: top right; +} +.credit-card-item__info { + color: #fff; + width: 100%; + max-width: calc(100% - 85px); + padding: 10px 15px; + font-weight: 500; + display: block; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-item__info { + padding: 10px; + } +} +.credit-card-item__holder { + opacity: 0.7; + font-size: 13px; + margin-bottom: 6px; +} +@media screen and (max-width: 480px) { + .credit-card-item__holder { + font-size: var(--ti-common-font-size-base); + margin-bottom: 5px; + } +} +.credit-card-item__wrapper { + padding: 25px 15px; + position: relative; + z-index: 4; + height: 100%; + text-shadow: 7px 6px 10px rgba(14, 42, 90, 0.8); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +@media screen and (max-width: 480px) { + .credit-card-item__wrapper { + padding: 20px 10px; + } +} +.credit-card-item__name { + font-size: var(--ti-common-font-size-3); + line-height: 1; + white-space: nowrap; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + text-transform: uppercase; +} +@media screen and (max-width: 480px) { + .credit-card-item__name { + font-size: var(--ti-common-font-size-2); + } +} +.credit-card-item__nameItem { + display: inline-block; + min-width: 8px; + position: relative; +} +.credit-card-item__number { + font-weight: 500; + line-height: 1; + color: #fff; + font-size: 27px; + margin-bottom: 25px; + display: inline-block; + padding: 10px 15px; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-item__number { + font-size: 21px; + margin-bottom: 15px; + padding: 10px 10px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__number { + font-size: 19px; + margin-bottom: 10px; + padding: 10px 10px; + } +} +.credit-card-item__numberItem { + width: 16px; + display: inline-block; +} +.credit-card-item__numberItem.-active { + width: 30px; +} +@media screen and (max-width: 480px) { + .credit-card-item__numberItem { + width: 13px; + } + .credit-card-item__numberItem.-active { + width: 16px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__numberItem { + width: 12px; + } + .credit-card-item__numberItem.-active { + width: 8px; + } +} +.credit-card-item__content { + color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.credit-card-item__date { + -ms-flex-wrap: wrap; + flex-wrap: wrap; + font-size: var(--ti-common-font-size-3); + margin-left: auto; + padding: 10px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + width: 80px; + white-space: nowrap; + -ms-flex-negative: 0; + flex-shrink: 0; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-item__date { + font-size: var(--ti-common-font-size-2); + } +} +.credit-card-item__dateItem { + position: relative; +} +.credit-card-item__dateItem span { + width: 22px; + display: inline-block; +} +.credit-card-item__dateTitle { + opacity: 0.7; + font-size: 13px; + padding-bottom: 6px; + width: 100%; +} +@media screen and (max-width: 480px) { + .credit-card-item__dateTitle { + font-size: var(--ti-common-font-size-base); + padding-bottom: 5px; + } +} +.credit-card-item__band { + background: rgba(0, 0, 19, 0.8); + width: 100%; + height: 50px; + margin-top: 30px; + position: relative; + z-index: 2; +} +@media screen and (max-width: 480px) { + .credit-card-item__band { + margin-top: 20px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__band { + height: 40px; + margin-top: 10px; + } +} +.credit-card-item__cvv { + text-align: right; + position: relative; + z-index: 2; + padding: 15px; +} +.credit-card-item__cvv .credit-card-item__type { + opacity: 0.7; +} +@media screen and (max-width: 360px) { + .credit-card-item__cvv { + padding: 10px 15px; + } +} +.credit-card-item__cvvTitle { + padding-right: 10px; + font-size: 15px; + font-weight: 500; + color: #fff; + margin-bottom: 5px; +} +.credit-card-item__cvvBand { + height: 45px; + background: #fff; + margin-bottom: 30px; + text-align: right; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding-right: 10px; + color: #1a3b5d; + font-size: var(--ti-common-font-size-3); + border-radius: 4px; + -webkit-box-shadow: 0 10px 20px -7px rgba(32, 56, 117, 0.35); + box-shadow: 0 10px 20px -7px rgba(32, 56, 117, 0.35); +} +@media screen and (max-width: 480px) { + .credit-card-item__cvvBand { + height: 40px; + margin-bottom: 20px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__cvvBand { + margin-bottom: 15px; + } +} +.credit-card-form { + max-width: 570px; + margin: auto; + width: 100%; + font-family: arial; +} +@media screen and (max-width: 576px) { + .credit-card-form { + margin: 0 auto; + } +} +.credit-card-form__inner { + background: #fff; + -webkit-box-shadow: 0 30px 60px 0 rgba(90, 116, 148, 0.4); + box-shadow: 0 30px 60px 0 rgba(90, 116, 148, 0.4); + border-radius: 10px; + padding: 35px; + padding-top: 180px; +} +@media screen and (max-width: 480px) { + .credit-card-form__inner { + padding: 25px; + padding-top: 165px; + } +} +@media screen and (max-width: 360px) { + .credit-card-form__inner { + padding: 15px; + padding-top: 165px; + } +} +.credit-card-form__row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +@media screen and (max-width: 480px) { + .credit-card-form__row { + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } +} +.credit-card-form__col { + -webkit-box-flex: 1; + -ms-flex: auto; + flex: auto; + margin-right: 35px; +} +.credit-card-form__col:last-child { + margin-right: 0; +} +@media screen and (max-width: 480px) { + .credit-card-form__col { + margin-right: 0; + -webkit-box-flex: unset; + -ms-flex: unset; + flex: unset; + width: 100%; + margin-bottom: 20px; + } + .credit-card-form__col:last-child { + margin-bottom: 0; + } +} +.credit-card-form__col.-cvv { + max-width: 150px; +} +@media screen and (max-width: 480px) { + .credit-card-form__col.-cvv { + max-width: initial; + } +} +.credit-card-form__group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +.credit-card-form__group .credit-card-input__input { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + margin-right: 15px; + outline: 0; +} +.credit-card-form__group .credit-card-input__input:last-child { + margin-right: 0; +} +.credit-card-form__group select::-ms-expand { + display: none; +} +.credit-card-form__button { + width: 100%; + height: 55px; + background: #2364d2; + border: none; + border-radius: 5px; + font-size: 22px; + font-weight: 500; + -webkit-box-shadow: 3px 10px 20px 0 rgba(35, 100, 210, 0.3); + box-shadow: 3px 10px 20px 0 rgba(35, 100, 210, 0.3); + color: #fff; + margin-top: 20px; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-form__button { + margin-top: 10px; + } +} +.credit-card-item { + max-width: 430px; + height: 270px; + margin-left: auto; + margin-right: auto; + position: relative; + z-index: 2; + width: 100%; +} +@media screen and (max-width: 480px) { + .credit-card-item { + max-width: 310px; + height: 220px; + width: 90%; + } +} +@media screen and (max-width: 360px) { + .credit-card-item { + height: 180px; + } +} +.credit-card-item.-active .card-item__side.-front { + -webkit-transform: perspective(1000px) rotateY(180deg) rotateX(0) rotateZ(0); + transform: perspective(1000px) rotateY(180deg) rotateX(0) rotateZ(0); +} +.credit-card-item.-active .card-item__side.-back { + -webkit-transform: perspective(1000px) rotateY(0) rotateX(0) rotateZ(0); + transform: perspective(1000px) rotateY(0) rotateX(0) rotateZ(0); +} +.credit-card-item__focus { + position: absolute; + z-index: 3; + border-radius: 5px; + left: 0; + top: 0; + width: 100%; + height: 100%; + -webkit-transition: all 0.35s cubic-bezier(0.71, 0.03, 0.56, 0.85); + transition: all 0.35s cubic-bezier(0.71, 0.03, 0.56, 0.85); + opacity: 0; + pointer-events: none; + overflow: hidden; + border: 2px solid rgba(255, 255, 255, 0.65); +} +.credit-card-item__focus:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: #08142f; + height: 100%; + border-radius: 5px; + -webkit-filter: blur(25px); + filter: blur(25px); + opacity: 0.5; +} +.credit-card-item__focus.-active { + opacity: 1; +} +.credit-card-item__side { + border-radius: 15px; + overflow: hidden; + -webkit-box-shadow: 0 20px 60px 0 rgba(14, 42, 90, 0.55); + box-shadow: 0 20px 60px 0 rgba(14, 42, 90, 0.55); + -webkit-transform: perspective(2000px) rotateY(0) rotateX(0) rotate(0); + transform: perspective(2000px) rotateY(0) rotateX(0) rotate(0); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transition: all 0.8s cubic-bezier(0.71, 0.03, 0.56, 0.85); + transition: all 0.8s cubic-bezier(0.71, 0.03, 0.56, 0.85); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + height: 100%; +} +.credit-card-item__side.-back { + position: absolute; + top: 0; + left: 0; + width: 100%; + -webkit-transform: perspective(2000px) rotateY(-180deg) rotateX(0) rotate(0); + transform: perspective(2000px) rotateY(-180deg) rotateX(0) rotate(0); + z-index: 2; + padding: 0; + height: 100%; +} +.credit-card-item__side.-back .card-item__cover { + -webkit-transform: rotateY(-180deg); + transform: rotateY(-180deg); +} +.credit-card-item__bg { + max-width: 100%; + display: block; + max-height: 100%; + height: 100%; + width: 100%; + -o-object-fit: cover; + object-fit: cover; +} +.credit-card-item__cover { + position: absolute; + height: 100%; + background-color: #1c1d27; + background-image: linear-gradient(147deg, #354fce 0, #0c296b 74%); + left: 0; + top: 0; + width: 100%; + border-radius: 15px; + overflow: hidden; +} +.credit-card-item__cover:after { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: rgba(6, 2, 29, 0.45); +} +.credit-card-item__top { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin-bottom: 40px; + padding: 0 10px; +} +@media screen and (max-width: 480px) { + .credit-card-item__top { + margin-bottom: 25px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__top { + margin-bottom: 15px; + } +} +.credit-card-item__chip { + width: 60px; +} +@media screen and (max-width: 480px) { + .credit-card-item__chip { + width: 50px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__chip { + width: 40px; + } +} +.credit-card-item__type { + height: 45px; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + max-width: 100px; + margin-left: auto; + width: 100%; +} +@media screen and (max-width: 480px) { + .credit-card-item__type { + height: 40px; + max-width: 90px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__type { + height: 30px; + } +} +.credit-card-item__typeImg { + max-width: 100%; + -o-object-fit: contain; + object-fit: contain; + max-height: 100%; + -o-object-position: top right; + object-position: top right; +} +.credit-card-item__info { + color: #fff; + width: 100%; + max-width: calc(100% - 85px); + padding: 10px 15px; + font-weight: 500; + display: block; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-item__info { + padding: 10px; + } +} +.credit-card-item__holder { + opacity: 0.7; + font-size: 13px; + margin-bottom: 6px; +} +@media screen and (max-width: 480px) { + .credit-card-item__holder { + font-size: var(--ti-common-font-size-base); + margin-bottom: 5px; + } +} +.credit-card-item__wrapper { + padding: 25px 15px; + position: relative; + z-index: 4; + height: 100%; + text-shadow: 7px 6px 10px rgba(14, 42, 90, 0.8); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +@media screen and (max-width: 480px) { + .credit-card-item__wrapper { + padding: 20px 10px; + } +} +.credit-card-item__name { + font-size: var(--ti-common-font-size-3); + line-height: 1; + white-space: nowrap; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + text-transform: uppercase; +} +@media screen and (max-width: 480px) { + .credit-card-item__name { + font-size: var(--ti-common-font-size-2); + } +} +.credit-card-item__nameItem { + display: inline-block; + min-width: 8px; + position: relative; +} +.credit-card-item__number { + font-weight: 500; + line-height: 1; + color: #fff; + font-size: 27px; + margin-bottom: 25px; + display: inline-block; + padding: 10px 15px; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-item__number { + font-size: 21px; + margin-bottom: 15px; + padding: 10px 10px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__number { + font-size: 19px; + margin-bottom: 10px; + padding: 10px 10px; + } +} +.credit-card-item__numberItem { + width: 16px; + display: inline-block; +} +.credit-card-item__numberItem.-active { + width: 30px; +} +@media screen and (max-width: 480px) { + .credit-card-item__numberItem { + width: 13px; + } + .credit-card-item__numberItem.-active { + width: 16px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__numberItem { + width: 12px; + } + .credit-card-item__numberItem.-active { + width: 8px; + } +} +.credit-card-item__content { + color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.credit-card-item__date { + -ms-flex-wrap: wrap; + flex-wrap: wrap; + font-size: var(--ti-common-font-size-3); + margin-left: auto; + padding: 10px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + width: 80px; + white-space: nowrap; + -ms-flex-negative: 0; + flex-shrink: 0; + cursor: pointer; +} +@media screen and (max-width: 480px) { + .credit-card-item__date { + font-size: var(--ti-common-font-size-2); + } +} +.credit-card-item__dateItem { + position: relative; +} +.credit-card-item__dateItem span { + width: 22px; + display: inline-block; +} +.credit-card-item__dateTitle { + opacity: 0.7; + font-size: 13px; + padding-bottom: 6px; + width: 100%; +} +@media screen and (max-width: 480px) { + .credit-card-item__dateTitle { + font-size: var(--ti-common-font-size-base); + padding-bottom: 5px; + } +} +.credit-card-item__band { + background: rgba(0, 0, 19, 0.8); + width: 100%; + height: 50px; + margin-top: 30px; + position: relative; + z-index: 2; +} +@media screen and (max-width: 480px) { + .credit-card-item__band { + margin-top: 20px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__band { + height: 40px; + margin-top: 10px; + } +} +.credit-card-item__cvv { + text-align: right; + position: relative; + z-index: 2; + padding: 15px; +} +.credit-card-item__cvv .card-item__type { + opacity: 0.7; +} +@media screen and (max-width: 360px) { + .credit-card-item__cvv { + padding: 10px 15px; + } +} +.credit-card-item__cvvTitle { + padding-right: 10px; + font-size: 15px; + font-weight: 500; + color: #fff; + margin-bottom: 5px; +} +.credit-card-item__cvvBand { + height: 45px; + background: #fff; + margin-bottom: 30px; + text-align: right; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding-right: 10px; + color: #1a3b5d; + font-size: var(--ti-common-font-size-3); + border-radius: 4px; + -webkit-box-shadow: 0 10px 20px -7px rgba(32, 56, 117, 0.35); + box-shadow: 0 10px 20px -7px rgba(32, 56, 117, 0.35); +} +@media screen and (max-width: 480px) { + .credit-card-item__cvvBand { + height: 40px; + margin-bottom: 20px; + } +} +@media screen and (max-width: 360px) { + .credit-card-item__cvvBand { + margin-bottom: 15px; + } +} +.credit-card-list { + margin-bottom: -130px; +} +@media screen and (max-width: 480px) { + .credit-card-list { + margin-bottom: -120px; + } +} +.credit-card-input { + margin-bottom: 20px; + position: relative; +} +.credit-card-input__label { + font-size: var(--ti-common-font-size-1); + margin-bottom: 5px; + font-weight: 500; + color: #1a3b5d; + width: 100%; + display: block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.credit-card-input__input { + width: 100%; + height: 50px; + border-radius: 5px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid #ced6e0; + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + font-size: var(--ti-common-font-size-3); + padding: 5px 15px; + background: 0 0; + color: #1a3b5d; + outline: 0; +} +.credit-card-input__input:focus, +.credit-card-input__input:hover { + border-color: #3d9cff; +} +.credit-card-input__input:focus { + -webkit-box-shadow: 0 10px 20px -13px rgba(32, 56, 117, 0.35); + box-shadow: 0 10px 20px -13px rgba(32, 56, 117, 0.35); +} +.credit-card-input__input.-select { + -webkit-appearance: none; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAeCAYAAABuUU38AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNrM1sEJwkAQBdCsngXPHsQO9O5FS7AAMVYgdqAd2IGCDWgFnryLFQiCZ8EGnJUNimiyM/tnk4HNEAg/8y6ZmMRVqz9eUJvRaSbvutCZ347bXVJy/ZnvTmdJ862Me+hAbZCTs6GHpyUi1tTSvPnqTpoWZPUa7W7ncT3vK4h4zVejy8QzM3WhVUO8ykI6jOxoGA4ig3BLHcNFSCGqGAkig2yqgpEiMsjSfY9LxYQg7L6r0X6wS29YJiYQYecemY+wHrXD1+bklGhpAhBDeu/JfIVGxaAQ9sb8CI+CQSJ+QmJg0Ii/EE2MBiIXooHRQhRCkBhNhBcEhLkwf05ZCG8ICCOpk0MULmvDSY2M8UawIRExLIQIEgHDRoghihgRIgiigBEjgiFATBACAgFgghEwSAAGgoBCBBgYAg5hYKAIFYgHBo6w9RRgAFfy160QuV8NAAAAAElFTkSuQmCC); + background-size: 12px; + background-position: 90% center; + background-repeat: no-repeat; + padding-right: 30px; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + cursor: pointer; +} +.credit-card-input__eye { + position: absolute; + width: 1em; + height: 1em; + font-size: var(--ti-common-font-size-5); + border-radius: 50%; + top: 42px; + right: 10px; + opacity: 0.75; + color: #8c9cae; + cursor: pointer; + padding: 0; + background: 0 0; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + border: 2px solid currentColor; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + outline: 0; +} +.credit-card-input__eye:before { + content: ''; + position: absolute; + background: #fff; + width: 0.35em; + height: 0.35em; + top: 6px; + left: 6px; + z-index: 2; + border-radius: 50%; + -webkit-transform: scale(0.1); + transform: scale(0.1); + opacity: 0; + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + -webkit-transition-delay: 0.1s; + transition-delay: 0.1s; +} +.credit-card-input__eye:after { + content: ''; + position: absolute; + top: 3px; + left: 3px; + background: currentColor; + width: 0.6em; + height: 0.6em; + border-radius: 50%; + -webkit-transform: scale(0.1); + transform: scale(0.1); + opacity: 0; + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.credit-card-input__eye.-active:not(:disabled), +.credit-card-input__eye:hover:not(:disabled) { + color: #2364d2; + opacity: 1; +} +.credit-card-input__eye.-active::after, +.credit-card-input__eye.-active::before { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; +} +.credit-card-input__eye:disabled { + cursor: not-allowed; + opacity: 0.4; +} +.slide-fade-up-enter-active { + -webkit-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + -webkit-transition-delay: 0.1s; + transition-delay: 0.1s; + position: relative; +} +.slide-fade-up-leave-active { + -webkit-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + position: absolute; +} +.slide-fade-up-enter { + opacity: 0; + -webkit-transform: translateY(15px); + transform: translateY(15px); + pointer-events: none; +} +.slide-fade-up-leave-to { + opacity: 0; + -webkit-transform: translateY(-15px); + transform: translateY(-15px); + pointer-events: none; +} +.slide-fade-right-enter-active { + -webkit-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + -webkit-transition-delay: 0.1s; + transition-delay: 0.1s; + position: relative; +} +.slide-fade-right-leave-active { + -webkit-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + position: absolute; +} +.slide-fade-right-enter { + opacity: 0; + -webkit-transform: translateX(10px) rotate(45deg); + transform: translateX(10px) rotate(45deg); + pointer-events: none; +} +.slide-fade-right-leave-to { + opacity: 0; + -webkit-transform: translateX(-10px) rotate(45deg); + transform: translateX(-10px) rotate(45deg); + pointer-events: none; +} +.github-btn { + position: absolute; + right: 40px; + bottom: 50px; + text-decoration: none; + padding: 15px 25px; + border-radius: 4px; + -webkit-box-shadow: 0 4px 30px -6px rgba(36, 52, 70, 0.65); + box-shadow: 0 4px 30px -6px rgba(36, 52, 70, 0.65); + background: #24292e; + color: #fff; + font-weight: 700; + letter-spacing: 1px; + font-size: var(--ti-common-font-size-2); + text-align: center; + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +@media screen and (min-width: 500px) { + .github-btn:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); + -webkit-box-shadow: 0 17px 20px -6px rgba(36, 52, 70, 0.36); + box-shadow: 0 17px 20px -6px rgba(36, 52, 70, 0.36); + } +} +@media screen and (max-width: 700px) { + .github-btn { + position: relative; + bottom: auto; + right: auto; + margin-top: 20px; + } + .github-btn:active { + -webkit-transform: scale(1.1); + transform: scale(1.1); + -webkit-box-shadow: 0 17px 20px -6px rgba(36, 52, 70, 0.36); + box-shadow: 0 17px 20px -6px rgba(36, 52, 70, 0.36); + } +} +.tiny-crop { + --ti-crop-drag-box-background: var(--ti-base-color-light); + --ti-crop-modal-background: var(--ti-base-color-dark); + --ti-crop-view-box-outline-color: var(--ti-base-color-brand-6); + --ti-crop-center-background: #eeeeee; + --ti-crop-face-background: var(--ti-base-color-light); + --ti-crop-line-background: var(--ti-base-color-brand-6); + --ti-crop-point-background: var(--ti-base-color-brand-6); + --ti-crop-opration-height: var(--ti-base-size-height-minor); + --ti-crop-opration-background: rgba(55, 55, 55, 0.3); + --ti-crop-opration-span-background: rgba(0, 0, 0, 0.5); + --ti-crop-opration-span-color: var(--ti-base-color-light); + --ti-crop-opration-span-hover-background: rgba(0, 0, 0, 0.8); + --ti-crop-modal-mask-background: rgba(55, 55, 55, 0.5); + --ti-crop-moda-close-background: rgba(0, 0, 0, 0.5); + --ti-crop-moda-close-icon-color: var(--ti-base-color-light); + --ti-crop-nopic-background: rgba(0, 0, 0, 0.3); + --ti-crop-nopic-center-color: rgba(255, 255, 255, 0.6); +} +.tiny-crop .cropper-container { + direction: ltr; + font-size: 0; + line-height: 0; + position: relative; + -ms-touch-action: none; + touch-action: none; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-crop .cropper-container img { + display: block; + height: 100%; + image-orientation: 0deg; + max-height: none !important; + max-width: none !important; + min-height: 0 !important; + min-width: 0 !important; + width: 100%; +} +.tiny-crop .cropper-canvas, +.tiny-crop .cropper-crop-box, +.tiny-crop .cropper-drag-box, +.tiny-crop .cropper-modal, +.tiny-crop .cropper-wrap-box { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tiny-crop .cropper-canvas, +.tiny-crop .cropper-wrap-box { + overflow: hidden; +} +.tiny-crop .cropper-drag-box { + background-color: var(--ti-crop-drag-box-background); + opacity: 0; +} +.tiny-crop .cropper-modal { + background-color: var(--ti-crop-modal-background); + opacity: 0.5; +} +.tiny-crop .cropper-view-box { + display: block; + height: 100%; + outline-color: rgba(51, 153, 255, 0.75); + outline: 1px solid var(--ti-crop-view-box-outline-color); + overflow: hidden; + width: 100%; +} +.tiny-crop .cropper-dashed { + border: 0 dashed #eee; + display: block; + opacity: 0.5; + position: absolute; +} +.tiny-crop .cropper-dashed.dashed-h { + border-bottom-width: 1px; + border-top-width: 1px; + height: 33.33333%; + left: 0; + top: 33.33333%; + width: 100%; +} +.tiny-crop .cropper-dashed.dashed-v { + border-left-width: 1px; + border-right-width: 1px; + height: 100%; + left: 33.33333%; + top: 0; + width: 33.33333%; +} +.tiny-crop .cropper-center { + display: block; + height: 0; + left: 50%; + opacity: 0.75; + position: absolute; + top: 50%; + width: 0; +} +.tiny-crop .cropper-center:after, +.tiny-crop .cropper-center:before { + background-color: var(--ti-crop-center-background); + content: ' '; + display: block; + position: absolute; +} +.tiny-crop .cropper-center:before { + height: 1px; + left: -3px; + top: 0; + width: 7px; +} +.tiny-crop .cropper-center:after { + height: 7px; + left: 0; + top: -3px; + width: 1px; +} +.tiny-crop .cropper-face, +.tiny-crop .cropper-line, +.tiny-crop .cropper-point { + display: block; + height: 100%; + opacity: 0.1; + position: absolute; + width: 100%; +} +.tiny-crop .cropper-face { + background-color: var(--ti-crop-face-background); + left: 0; + top: 0; +} +.tiny-crop .cropper-line { + background-color: var(--ti-crop-line-background); +} +.tiny-crop .cropper-line.line-e { + cursor: ew-resize; + right: -3px; + top: 0; + width: 5px; +} +.tiny-crop .cropper-line.line-n { + cursor: ns-resize; + height: 5px; + left: 0; + top: -3px; +} +.tiny-crop .cropper-line.line-w { + cursor: ew-resize; + left: -3px; + top: 0; + width: 5px; +} +.tiny-crop .cropper-line.line-s { + bottom: -3px; + cursor: ns-resize; + height: 5px; + left: 0; +} +.tiny-crop .cropper-point { + background-color: var(--ti-crop-point-background); + height: 5px; + opacity: 0.75; + width: 5px; +} +.tiny-crop .cropper-point.point-e { + cursor: ew-resize; + margin-top: -3px; + right: -3px; + top: 50%; +} +.tiny-crop .cropper-point.point-n { + cursor: ns-resize; + left: 50%; + margin-left: -3px; + top: -3px; +} +.tiny-crop .cropper-point.point-w { + cursor: ew-resize; + left: -3px; + margin-top: -3px; + top: 50%; +} +.tiny-crop .cropper-point.point-s { + bottom: -3px; + cursor: s-resize; + left: 50%; + margin-left: -3px; +} +.tiny-crop .cropper-point.point-ne { + cursor: nesw-resize; + right: -3px; + top: -3px; +} +.tiny-crop .cropper-point.point-nw { + cursor: nwse-resize; + left: -3px; + top: -3px; +} +.tiny-crop .cropper-point.point-sw { + bottom: -3px; + cursor: nesw-resize; + left: -3px; +} +.tiny-crop .cropper-point.point-se { + bottom: -3px; + cursor: nwse-resize; + height: 20px; + opacity: 1; + right: -3px; + width: 20px; +} +@media (min-width: 768px) { + .tiny-crop .cropper-point.point-se { + height: 15px; + width: 15px; + } +} +@media (min-width: 992px) { + .tiny-crop .cropper-point.point-se { + height: 10px; + width: 10px; + } +} +@media (min-width: 1200px) { + .tiny-crop .cropper-point.point-se { + height: 5px; + opacity: 0.75; + width: 5px; + } +} +.tiny-crop .cropper-point.point-se:before { + background-color: var(--ti-crop-point-background); + bottom: -50%; + content: ' '; + display: block; + height: 200%; + opacity: 0; + position: absolute; + right: -50%; + width: 200%; +} +.tiny-crop .cropper-invisible { + opacity: 0; +} +.tiny-crop .cropper-bg { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC); +} +.tiny-crop .cropper-hide { + display: block; + height: 0; + position: absolute; + width: 0; +} +.tiny-crop .cropper-hidden { + display: none !important; +} +.tiny-crop .cropper-move { + cursor: move; +} +.tiny-crop .cropper-crop { + cursor: crosshair; +} +.tiny-crop .cropper-disabled .cropper-drag-box, +.tiny-crop .cropper-disabled .cropper-face, +.tiny-crop .cropper-disabled .cropper-line, +.tiny-crop .cropper-disabled .cropper-point { + cursor: not-allowed; +} +.tiny-crop .img-container { + margin: auto; + overflow: hidden; +} +.tiny-crop .img-container > img { + max-width: 100%; +} +.tiny-crop .opration { + height: var(--ti-crop-opration-height); + line-height: var(--ti-crop-opration-height); + text-align: center; + background-color: var(--ti-crop-opration-background); + position: relative; +} +.tiny-crop .opration span { + width: 26px; + height: 26px; + margin: 0 2px; + display: inline-block; + color: var(--ti-crop-opration-span-color); + cursor: pointer; + border-radius: 50%; + background-color: var(--ti-crop-opration-span-background); +} +.tiny-crop .opration span:hover { + background-color: var(--ti-crop-opration-span-hover-background); + width: 28px; + height: 28px; +} +.tiny-crop .opration span.tiny-icon::before { + position: relative; +} +.tiny-crop .crop-modal-mask { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: var(--ti-crop-modal-mask-background); + height: 100%; + z-index: 1000; +} +.tiny-crop .crop-modal-warp { + position: fixed; + overflow: auto; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.tiny-crop .crop-modal { + position: relative; + top: 100px; + margin: 0 auto 50px; + background: #fff; + border-radius: 2px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; +} +.tiny-crop .moda-close { + position: absolute; + top: -40px; + right: -40px; + width: 80px; + height: 80px; + cursor: pointer; + border-radius: 50%; + background-color: var(--ti-crop-moda-close-background); +} +.tiny-crop .moda-close .tiny-icon { + top: 45px; + left: 16px; + color: var(--ti-crop-moda-close-icon-color); + z-index: 9999999; +} +.tiny-crop .img-preview-box { + position: fixed; + top: 100px; +} +.tiny-crop .img-preview { + height: 9rem; + width: 16rem; + overflow: hidden; +} +@media (max-width: 768px) { + .tiny-crop .preview-lg { + display: none; + } +} +@media (max-width: 600px) { + .tiny-crop .preview-md { + display: none; + } +} +.tiny-crop .preview-lg { + height: 9rem; + width: 16rem; + margin-top: 4px; +} +.tiny-crop .preview-md { + height: 4.5rem; + width: 8rem; + margin-top: 4px; +} +.tiny-crop .preview-sm { + height: 2.25rem; + width: 4rem; + margin-top: 4px; +} +.tiny-crop .img-preview > img { + max-width: 100%; +} +.tiny-crop .nopic { + height: 200px; + text-align: center; + background: var(--ti-crop-nopic-background); +} +.tiny-crop .nopic-center { + position: relative; + font-size: 50px; + color: var(--ti-crop-nopic-center-color); + cursor: pointer; + top: 50px; +} +.tiny-crop input[type='file'] { + display: none; +} +.tiny-crop { + position: fixed; + height: 100%; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + top: 0; + left: 0; + z-index: 1000; + background: rgba(97, 97, 97, 0.5); +} +.tiny-crop__dialog-content__handle { + width: 652px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + height: 26px; + margin: 10px 0 20px; +} +.tiny-crop__dialog-content__handle__button { + width: 268px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} +.tiny-crop__dialog { + width: 652px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background: #fff; + z-index: 1001; +} +.tiny-crop__dialog-cropper { + width: 652px; + height: 300px; + overflow: hidden; +} +.tiny-crop__dialog-content { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 10px; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-crop__dialog-content__crop { + width: 314px; + height: 200px; + border: 1px solid #393939; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background: gray; + overflow: hidden; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-crop__dialog-content__crop img { + height: 100%; + width: 100%; +} +.tiny-croppreview { + position: fixed; + top: calc(100% - 50% - 150px); + left: calc(100% - 50% + 336px); + height: 300px; + width: 300px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + z-index: 1002; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} +.iconButton { + border-radius: 50%; + background: #616161; + height: 26px; + width: 26px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; +} +.iconButton .iconButtonset { + fill: #fff; + height: 12px; + width: 12px; +} +.iconButton:hover { + background: #272727; +} +.croppreview { + height: 100%; + width: 100%; +} +.croppreviewb { + width: 214px; + height: 140px; + overflow: hidden; + background: #fff; +} +.croppreviewm { + width: 114px; + height: 80px; + overflow: hidden; + background: #fff; +} +.croppreviews { + width: 84px; + height: 60px; + overflow: hidden; + background: #fff; +} +.tiny-dept { + --ti-dept-label-font-size: var(--ti-common-font-size-base); + --ti-dept-label-color: var(--ti-base-color-info-normal); + --ti-dept-label-font-weight: var(--ti-common-font-weight-7); + --ti-dept-selected-info-color: var(--ti-base-color-brand-6); + --ti-dept-selected-info-background: #f1f1f1; + --ti-dept-selected-info-border-radius: var(--ti-base-radius-large); +} +.tiny-dept__search { + margin-bottom: 12px; +} +.tiny-dept__label, +.tiny-dept__text { + font-size: var(--ti-dept-label-font-size); + color: var(--ti-dept-label-color); + font-weight: var(--ti-dept-label-font-weight); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-dept__label { + text-align: right; +} +.tiny-dept__label.is-selected { + text-align: left; + margin-bottom: 4px; +} +.tiny-dept__selected-info { + color: var(--ti-dept-selected-info-color); + font-size: var(--ti-dept-label-font-size); + background: var(--ti-dept-selected-info-background); + padding: 5px; + border-radius: var(--ti-dept-selected-info-border-radius); +} +.tiny-dept__item { + margin-bottom: 12px; +} +.tiny-dept__item .tiny-dept__label.tiny-col, +.tiny-dept__search .tiny-dept__label.tiny-col { + line-height: 30px; + padding-left: 0; + padding-right: 8px; +} +.tiny-dept__item .tiny-dept__label.tiny-col + .tiny-col, +.tiny-dept__search .tiny-dept__label.tiny-col + .tiny-col { + padding: 0; +} +.tiny-dept .tiny-input__inner { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-dept .tiny-input__icon { + vertical-align: middle; + fill: var(--ti-dept-selected-info-color); +} +.tiny-grid-modal__box { + --ti-detail-page-color: var(--ti-base-color-info-normal); + --ti-detail-page-font-size: var(--ti-common-font-size-base); + --ti-detail-page-header-font-size: var(--ti-common-font-size-1); + --ti-detail-page-header-border-color: var(--ti-base-color-border); + --ti-detail-page-header-seticon-color: var(--ti-base-color-brand-6); + --ti-detail-page-header-seticon-hover-color: var(--ti-base-color-brand-5); + --ti-detail-page-header-seticon-font-size: var(--ti-common-font-size-2); + --ti-detail-page-content-item-color: var(--ti-base-color-placeholder); + --ti-detail-dialog-header-background: #f1f1f1; + --ti-detail-dialog-content-item-hover-background: var(--ti-base-color-hover-background); + --ti-detail-dialog-active-background: #e9f4fd; +} +.tiny-detail-page { + width: 100%; + height: 700px; + font-size: var(--ti-detail-page-font-size); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-detail-page .tiny-detail-page__header { + width: 100%; + height: 40px; + color: var(--ti-detail-page-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + border-bottom: 1px solid var(--ti-detail-page-header-border-color); + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-detail-page .tiny-detail-page__header span { + font-size: var(--ti-detail-page-header-font-size); + font-weight: 700; +} +.tiny-detail-page .tiny-detail-page__header-icon { + line-height: 1; + cursor: pointer; +} +.tiny-detail-page .tiny-detail-page__header-icon .setIconStyle { + font-size: var(--ti-detail-page-header-seticon-font-size); + fill: var(--ti-detail-page-header-seticon-color); +} +.tiny-detail-page .tiny-detail-page__header-icon .setIconStyle:hover { + fill: var(--ti-detail-page-header-seticon-hover-color); +} +.tiny-detail-page .tiny-detail-page__content { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-detail-page .tiny-detail-page__content-item { + width: 100%; + height: 40px; + line-height: 40px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-detail-page .tiny-detail-page__content-item .tiny-detail-page__content-item-span { + color: var(--ti-detail-page-content-item-color); + margin-right: 2px; +} +.tiny-detail-dialog { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + font-size: 12px; +} +.tiny-detail-dialog .tiny-detail-dialog__header { + width: 100%; + height: 40px; + border-bottom: 1px solid var(--ti-detail-page-header-border-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + background: var(--ti-detail-dialog-header-background); + padding-left: 8px; +} +.tiny-detail-dialog .tiny-detail-dialog__header > span { + width: 50%; + font-weight: 700; + border-right: 1px solid var(--ti-detail-page-header-border-color); +} +.tiny-detail-dialog .tiny-detail-dialog__header-check { + width: 130px; +} +.tiny-detail-dialog .tiny-detail-dialog__header-check span { + font-weight: 700; +} +.tiny-detail-dialog .tiny-detail-dialog__content { + width: 100%; + min-height: 225px; + max-height: 400px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + overflow-y: auto; + border-bottom: 1px solid var(--ti-detail-page-header-border-color); +} +.tiny-detail-dialog .tiny-detail-dialog__content-item { + width: 100%; + height: 40px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding-left: 8px; +} +.tiny-detail-dialog .tiny-detail-dialog__content-item:hover { + background: var(--ti-detail-dialog-content-item-hover-background); +} +.tiny-detail-dialog .tiny-detail-dialog__footer { + margin-top: 24px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-detail-dialog .active { + background: var(--ti-detail-dialog-active-background); +} +.tiny-dialog-box { + --ti-dialogbox-background: var(--ti-base-color-light); + --ti-dialogbox-border-radius: var(--ti-common-border-radius-normal); + --ti-dialogbox-head-border-color: var(--ti-base-color-border); + --ti-dialogbox-head-font-color: var(--ti-base-color-placeholder); + --ti-dialogbox-head-padding: 32px 32px 28px; + --ti-dialogbox-head-title-font-size: var(--ti-common-font-size-3); + --ti-dialogbox-head-title-font-weight: var(--ti-common-font-weight-7); + --ti-dialogbox-head-title-color: var(--ti-base-color-info-normal); + --ti-dialogbox-head-font-icon-color: #c4c4c4; + --ti-dialogbox-head-font-icon-size: 14px; + --ti-dialogbox-head-font-icon-hover: var(--ti-base-color-brand-6); + --ti-dialogbox-head-body-color: #5a5e66; + --ti-dialogbox-head-body-font-size: var(--ti-common-font-size-1); + --ti-dialogbox-close-icon-color: var(--ti-base-color-common-5); + --ti-dialogbox-close-icon-color-hover: var(--ti-base-color-brand-6); + --ti-dialogbox-box-body-font-size: var(--ti-common-font-size-base); + --ti-dialogbox-box-body-color: var(--ti-base-color-common-5); + --ti-dialogbox-box-body-padding: 0 32px; + --ti-dialogbox-box-body-margin-bottom: 12px; + --ti-dialogbox-btn-background-color-hover: none; + --ti-dialogbox-box-shadow: var(--ti-common-shadow-4-down); + --ti-dialogbox-btn-position-top: 18px; + position: absolute; + background: var(--ti-dialogbox-background); + border: 1px solid transparent; + border-radius: var(--ti-dialogbox-border-radius); + -webkit-box-shadow: var(--ti-dialogbox-box-shadow); + box-shadow: var(--ti-dialogbox-box-shadow); + overflow: hidden; +} +.tiny-dialog-box__wrapper { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: auto; + margin: 0; +} +.tiny-dialog-box.is-fullscreen { + left: 0; + top: 0; + width: 100vw; + height: 100vh; +} +.tiny-dialog-box.is-center .tiny-dialog-box__footer, +.tiny-dialog-box.is-center .tiny-dialog-box__header { + text-align: center; +} +.tiny-dialog-box .tiny-dialog-box__header { + padding: var(--ti-dialogbox-head-padding); + background: var(--ti-dialogbox-background); + font-weight: var(--ti-dialogbox-head-title-font-weight); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + position: relative; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__title { + font-size: var(--ti-dialogbox-head-title-font-size); + color: var(--ti-dialogbox-head-title-color); + font-weight: var(--ti-dialogbox-head-title-font-weight); + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__headerbtn { + border: none; + background: 0 0; + padding: 0; + line-height: 1; + position: absolute; + top: var(--ti-dialogbox-btn-position-top); + right: 20px; + cursor: pointer; + height: 32px; + width: 32px; +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__headerbtn:hover { + background-color: var(--ti-dialogbox-btn-background-color-hover); + border-radius: 4px; +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__headerbtn + .tiny-dialog-box__headerbtn { + margin-left: 8px; +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__headerbtn:focus { + outline: 0; +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__headerbtn .tiny-dialog-box__close { + fill: var(--ti-dialogbox-close-icon-color); + font-size: var(--ti-dialogbox-head-font-icon-size); +} +.tiny-dialog-box .tiny-dialog-box__header .tiny-dialog-box__headerbtn .tiny-dialog-box__close:hover { + fill: var(--ti-dialogbox-close-icon-color-hover); +} +.tiny-dialog-box .tiny-dialog-box__body { + text-align: left; + padding: var(--ti-dialogbox-box-body-padding); + margin-bottom: var(--ti-dialogbox-box-body-margin-bottom); + color: var(--ti-dialogbox-box-body-color); + font-size: var(--ti-dialogbox-box-body-font-size); + overflow: auto; + max-height: 65vh; +} +.tiny-dialog-box .tiny-dialog-box__body .tiny-upload { + overflow: hidden; +} +.tiny-dialog-box .tiny-dialog-box__body > span { + max-height: 120px; + overflow-y: auto; +} +.tiny-dialog-box .tiny-dialog-box__body .tiny-dept__search { + line-height: 30px; +} +.tiny-dialog-box.is-fullscreen .tiny-dialog-box__body { + max-height: calc(100vh - 94px); +} +.tiny-dialog-box .tiny-dialog-box__footer { + text-align: inherit; + padding: 28px 32px 32px; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-dialog-box .tiny-dialog-box__footer .tiny-toolbar .tiny-button { + margin: 0 4px; +} +.tiny-dialog-box__scroll-lock { + overflow: hidden; +} +.v-modal { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background: #000; +} +.v-modal-enter { + -webkit-animation: v-modal-in 0.2s ease; + animation: v-modal-in 0.2s ease; +} +.v-modal-leave { + -webkit-animation: v-modal-out 0.2s ease forwards; + animation: v-modal-out 0.2s ease forwards; +} +@-webkit-keyframes v-modal-in { + 0% { + opacity: 0; + } +} +@keyframes v-modal-in { + 0% { + opacity: 0; + } +} +@-webkit-keyframes v-modal-out { + 100% { + opacity: 0; + } +} +@keyframes v-modal-out { + 100% { + opacity: 0; + } +} +.dialog-slideRight-enter-active { + -webkit-animation: slideRight 0.5s ease-in forwards; + animation: slideRight 0.5s ease-in forwards; +} +.dialog-slideRight-leave-active { + -webkit-animation: slideRightout 0.5s ease-in forwards; + animation: slideRightout 0.5s ease-in forwards; +} +@-webkit-keyframes slideRight { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + 50% { + opacity: 0.6; + -webkit-transform: translateX(50%); + transform: translateX(50%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideRight { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + 50% { + opacity: 0.6; + -webkit-transform: translateX(50%); + transform: translateX(50%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes slideRightout { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 50% { + opacity: 0.6; + -webkit-transform: translateX(50%); + transform: translateX(50%); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} +@keyframes slideRightout { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 50% { + opacity: 0.6; + -webkit-transform: translateX(50%); + transform: translateX(50%); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} +.dialog-fade-enter-active { + -webkit-animation: dialog-fade-in 0.3s; + animation: dialog-fade-in 0.3s; +} +.dialog-fade-leave-active { + -webkit-animation: dialog-fade-out 0.3s; + animation: dialog-fade-out 0.3s; +} +@-webkit-keyframes dialog-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes dialog-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@-webkit-keyframes dialog-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +@keyframes dialog-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +@media (max-width: 480px) { + .tiny-dialog-box { + width: 100% !important; + top: 0 !important; + left: 0 !important; + } +} +.tiny-drop-roles .user-icon { + float: right; + position: relative; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + margin-left: 10px; +} +.tiny-dropdown { + display: inline-block; + position: relative; + font-size: var(--ti-common-font-size-base); +} +.tiny-dropdown .tiny-button-group { + display: block; +} +.tiny-dropdown .tiny-button-group .tiny-button { + float: none; +} +.tiny-dropdown .tiny-dropdown__caret-button { + padding-left: 5px; + padding-right: 5px; + position: relative; + border-left: none; + min-width: 24px; +} +.tiny-dropdown .tiny-dropdown__caret-button:before { + content: ''; + position: absolute; + display: block; + width: 1px; + top: 5px; + bottom: 5px; + left: 0; + background: #fff; +} +.tiny-dropdown .tiny-dropdown__caret-button.tiny-button--default:before { + background: #d9d9d9; +} +.tiny-dropdown .tiny-dropdown__caret-button.tiny-button--default:hover:before { + background-color: #1890ff; +} +.tiny-dropdown .tiny-dropdown__caret-button:hover:not(.is-disabled):before { + top: 0; + bottom: 0; +} +.tiny-dropdown .tiny-dropdown__caret-button svg { + padding-left: 0; + margin: 0 3px; +} +.tiny-dropdown .tiny-dropdown-selfdefine:focus:active, +.tiny-dropdown .tiny-dropdown-selfdefine:focus:not(.focusing) { + outline-width: 0; +} +.tiny-dropdown [disabled] { + cursor: not-allowed; + color: #bbb; +} +.tiny-dropdown-menu__item { + --ti-dropdown-menu-item-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-dropdown-menu-item-hover-color: var(--ti-base-color-brand-6); + --ti-dropdown-menu-item-active-bgcolor: var(--ti-base-color-brand-6); + --ti-dropdown-menu-item-active-color: var(--ti-base-color-white); + --ti-dropdown-menu-item-disabled-color: var(--ti-common-color-text-disabled); + --ti-dropdown-menu-item-color: #333; + --ti-dropdown-menu-item-height: 30px; + --ti-dropdown-menu-item-padding: 0 20px; + --ti-dropdown-menu-item-border-radius: 0; + list-style: none; + line-height: var(--ti-dropdown-menu-item-height); + padding: var(--ti-dropdown-menu-item-padding) !important; + margin: 0; + font-size: var(--ti-common-font-size-base); + color: var(--ti-dropdown-menu-item-color); + cursor: pointer; + outline: 0; +} +.tiny-dropdown-menu__item:focus, +.tiny-dropdown-menu__item:not(.is-disabled):hover { + background-color: var(--ti-dropdown-menu-item-hover-bgcolor); + color: var(--ti-dropdown-menu-item-hover-color); + border-radius: var(--ti-dropdown-menu-item-border-radius); +} +.tiny-dropdown-menu__item:focus svg, +.tiny-dropdown-menu__item:not(.is-disabled):hover svg { + fill: var(--ti-dropdown-menu-item-hover-color); +} +.tiny-dropdown-menu__item:not(.is-disabled):active { + background-color: var(--ti-dropdown-menu-item-active-bgcolor); + color: var(--ti-dropdown-menu-item-active-color); + border-radius: var(--ti-dropdown-menu-item-border-radius); +} +.tiny-dropdown-menu__item:not(.is-disabled):active svg { + fill: var(--ti-dropdown-menu-item-active-color); +} +.tiny-dropdown-menu__item svg { + margin-right: 5px; + margin-top: -2px; +} +.tiny-dropdown-menu__item.is-disabled { + cursor: default; + color: var(--ti-dropdown-menu-item-disabled-color); + pointer-events: none; +} +.tiny-dropdown-menu__item--divided { + position: relative; + margin-top: 6px; + border-top: 1px solid #e4e7ed; +} +.tiny-dropdown-menu__item--divided:before { + content: ''; + height: 6px; + display: block; + margin: 0 -20px; + background-color: #fff; +} +.tiny-dropdown-menu { + --ti-dropdown-menu-box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.2); + --ti-dropdown-menu-gap: 0; + --ti-dropdown-menu-padding: 4px 0; + position: absolute; + top: 0; + left: 0; + z-index: 10; + padding: var(--ti-dropdown-menu-padding); + background-color: var(--ti-common-color-bg-white-normal); + border-radius: var(--ti-common-border-radius-normal); + -webkit-box-shadow: var(--ti-dropdown-menu-box-shadow); + box-shadow: var(--ti-dropdown-menu-box-shadow); +} +.tiny-dropdown-menu.tiny-popper .popper__arrow, +.tiny-dropdown-menu.tiny-popper .popper__arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tiny-dropdown-menu.tiny-popper .popper__arrow { + border-width: 6px; + -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); +} +.tiny-dropdown-menu.tiny-popper .popper__arrow::after { + content: ' '; + border-width: 6px; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='top'] { + margin-bottom: var(--ti-dropdown-menu-gap); +} +.tiny-dropdown-menu.tiny-popper[x-placement^='top'] .popper__arrow { + bottom: -6px; + left: 50%; + margin-right: 3px; + border-top-color: #d9d9d9; + border-bottom-width: 0; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='top'] .popper__arrow:after { + bottom: 1px; + margin-left: -6px; + border-top-color: #fff; + border-bottom-width: 0; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='bottom'] { + margin-top: var(--ti-dropdown-menu-gap); +} +.tiny-dropdown-menu.tiny-popper[x-placement^='bottom'] .popper__arrow { + top: -6px; + left: 50%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #d9d9d9; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='bottom'] .popper__arrow:after { + top: 1px; + margin-left: -6px; + border-top-width: 0; + border-bottom-color: #fff; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='right'] { + margin-left: 12px; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='right'] .popper__arrow { + top: 50%; + left: -6px; + margin-bottom: 3px; + border-right-color: #d9d9d9; + border-left-width: 0; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='right'] .popper__arrow:after { + bottom: -6px; + left: 1px; + border-right-color: #fff; + border-left-width: 0; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='left'] { + margin-right: 12px; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='left'] .popper__arrow { + top: 50%; + right: -6px; + margin-bottom: 3px; + border-right-width: 0; + border-left-color: #d9d9d9; +} +.tiny-dropdown-menu.tiny-popper[x-placement^='left'] .popper__arrow:after { + right: 1px; + bottom: -6px; + margin-left: -6px; + border-right-width: 0; + border-left-color: #fff; +} +.tiny-dropdown-menu--medium { + padding: 6px 0; +} +.tiny-dropdown-menu--medium .tiny-dropdown-menu__item { + line-height: 30px; + padding: 0 17px; + font-size: var(--ti-common-font-size-1); +} +.tiny-dropdown-menu--medium .tiny-dropdown-menu__item.tiny-dropdown-menu__item--divided { + margin-top: 6px; +} +.tiny-dropdown-menu--medium .tiny-dropdown-menu__item.tiny-dropdown-menu__item--divided:before { + height: 6px; + margin: 0 -17px; +} +.tiny-dropdown-menu--small { + padding: 6px 0; +} +.tiny-dropdown-menu--small .tiny-dropdown-menu__item { + line-height: 27px; + padding: 0 15px; + font-size: 13px; +} +.tiny-dropdown-menu--small .tiny-dropdown-menu__item.tiny-dropdown-menu__item--divided { + margin-top: 4px; +} +.tiny-dropdown-menu--small .tiny-dropdown-menu__item.tiny-dropdown-menu__item--divided:before { + height: 4px; + margin: 0 -15px; +} +.tiny-dropdown-menu--mini { + padding: 3px 0; +} +.tiny-dropdown-menu--mini .tiny-dropdown-menu__item { + line-height: 24px; + padding: 0 10px; + font-size: var(--ti-common-font-size-base); +} +.tiny-dropdown-menu--mini .tiny-dropdown-menu__item.tiny-dropdown-menu__item--divided { + margin-top: 3px; +} +.tiny-dropdown-menu--mini .tiny-dropdown-menu__item.tiny-dropdown-menu__item--divided:before { + height: 3px; + margin: 0 -10px; +} +.tiny-espace { + --ti-espace-font-size: 26px; + --ti-espace-color: var(--ti-base-color-brand-6); + --ti-espace-hover-color: var(--ti-base-color-brand-5); +} +.tiny-espace .item-call, +.tiny-espace .item-email, +.tiny-espace .item-talk { + margin: 0 8px 0 0; + line-height: 1; +} +.tiny-espace .item-call .tiny-svg, +.tiny-espace .item-email .tiny-svg, +.tiny-espace .item-talk .tiny-svg { + fill: var(--ti-espace-color); + font-size: var(--ti-espace-font-size); +} +.tiny-espace .item-call:hover .tiny-svg, +.tiny-espace .item-email:hover .tiny-svg, +.tiny-espace .item-talk:hover .tiny-svg { + fill: var(--ti-espace-hover-color); +} +.tiny-fall-menu { + --ti-fallmenu-menu-height: var(--ti-base-size-height-large); + --ti-fallmenu-background-normal: var(--ti-base-color-brand-6); + --ti-fallmenu-background-hover: var(--ti-base-color-brand-5); + --ti-fallmenu-icon-font-size: var(--ti-common-font-size-base); + --ti-fallmenu-slot-color: var(--ti-base-color-light); + --ti-fallmenu-title-font-size: var(--ti-common-font-size-2); + --ti-fallmenu-box-title-color: var(--ti-base-color-placeholder); + --ti-fallmenu-box-font-color: var(--ti-base-color-brand-6); + --ti-fallmenu-box-font-size: var(--ti-common-font-size-1); + --ti-fallmenu-box-title-height: var(--ti-base-size-height-small); + --ti-fallmenu-box-content-height: 26px; + --ti-fallmenu-box-hover-color: var(--ti-base-color-primary-active); +} +.tiny-fall-menu .tiny-fall-menu__wrap { + background: var(--ti-fallmenu-background-normal); + padding: 0 24px; +} +.tiny-fall-menu .tiny-fall-menu__nav { + height: var(--ti-fallmenu-menu-height); + margin: 0 auto; + position: relative; +} +.tiny-fall-menu .tiny-fall-menu__subnav { + overflow: hidden; +} +.tiny-fall-menu .tiny-fall-menu__subnav .icon-slot-left, +.tiny-fall-menu .tiny-fall-menu__subnav .icon-slot-right { + color: var(--ti-fallmenu-slot-color); + cursor: pointer; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + font-size: var(--ti-fallmenu-icon-font-size); + line-height: 1; +} +.tiny-fall-menu .tiny-fall-menu__subnav .icon-slot-left svg, +.tiny-fall-menu .tiny-fall-menu__subnav .icon-slot-right svg { + fill: #fff; +} +.tiny-fall-menu .tiny-fall-menu__subnav .icon-slot-left { + left: -12px; +} +.tiny-fall-menu .tiny-fall-menu__subnav .icon-slot-right { + right: -12px; +} +.tiny-fall-menu .tiny-fall-menu__list { + position: relative; + min-width: 4000px; + left: 0; + -webkit-transition: left 0.4s; + transition: left 0.4s; +} +.tiny-fall-menu .tiny-fall-menu__list .fall-hide { + opacity: 0; +} +.tiny-fall-menu .tiny-fall-menu__list ul:after, +.tiny-fall-menu .tiny-fall-menu__list ul:before { + content: ''; + display: table; +} +.tiny-fall-menu .tiny-fall-menu__list ul:after { + clear: both; +} +.tiny-fall-menu .tiny-fall-menu__list li { + float: left; + position: relative; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-fall-menu .tiny-fall-menu__list a { + float: left; + display: block; + width: auto; + padding: 0 12px; + height: var(--ti-fallmenu-menu-height); + text-align: center; + text-decoration: none; + font-weight: 400; + line-height: var(--ti-fallmenu-menu-height); + font-size: var(--ti-fallmenu-title-font-size); + color: var(--ti-fallmenu-slot-color); +} +.tiny-fall-menu .tiny-fall-menu__list a.now, +.tiny-fall-menu .tiny-fall-menu__list a:hover { + color: var(--ti-fallmenu-slot-color); + background: var(--ti-fallmenu-background-hover); + text-decoration: none; +} +.tiny-fall-menu .tiny-fall-menu__list a.now:before { + position: absolute; + content: ''; + width: 0; + height: 0; + border-style: solid; + border-width: 0; + border-color: #fff transparent; + top: 34px; + left: 42%; +} +.tiny-fall-menu .tiny-fall-menu__box { + position: absolute; + left: 0; + top: var(--ti-fallmenu-menu-height); + width: 100%; + background: var(--ti-fallmenu-slot-color); + overflow: hidden; + -webkit-transition: opacity 0.4s; + transition: opacity 0.4s; + opacity: 0; +} +.tiny-fall-menu .tiny-fall-menu__box .contbox { + overflow: hidden; +} +.tiny-fall-menu .tiny-fall-menu__box .cont { + min-width: 120px; + padding: 18px 20px; +} +.tiny-fall-menu .tiny-fall-menu__box .sublist li { + float: left; + width: 100%; +} +.tiny-fall-menu .tiny-fall-menu__box .sublist li h3.mcate-item-hd { + font-size: var(--ti-fallmenu-box-font-size); + border-bottom: 0 solid #ccc; + color: var(--ti-fallmenu-box-title-color); + font-weight: 400; + margin: 0; +} +.tiny-fall-menu .tiny-fall-menu__box .sublist li p.mcate-item-bd { + margin-top: 18px; +} +.tiny-fall-menu .tiny-fall-menu__box .sublist li p.mcate-item-bd a { + margin: 8px 0 0 0; + font-size: var(--ti-common-font-size-base); + color: var(--ti-fallmenu-box-font-color); + text-decoration: none; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.tiny-fall-menu .tiny-fall-menu__box .sublist li p.mcate-item-bd a:hover { + color: var(--ti-fallmenu-box-hover-color); +} +.tiny-fall-menu .tiny-fall-menu__box.active, +.tiny-fall-menu .tiny-fall-menu__box:hover { + border-left: 1px solid #d9d9d9; + border-right: 1px solid #d9d9d9; + border-bottom: 1px solid #d9d9d9; + -webkit-box-shadow: 1px 1px 5px 1px #d9d9d9; + box-shadow: 1px 1px 5px 1px #d9d9d9; + opacity: 1; +} +@-webkit-keyframes leftArrow { + 0% { + left: -17px; + } + 50% { + left: -13px; + } + 100% { + left: -17px; + } +} +@keyframes leftArrow { + 0% { + left: -17px; + } + 50% { + left: -13px; + } + 100% { + left: -17px; + } +} +@-webkit-keyframes rightArrow { + 0% { + right: -17px; + } + 50% { + right: -13px; + } + 100% { + right: -17px; + } +} +@keyframes rightArrow { + 0% { + right: -17px; + } + 50% { + right: -13px; + } + 100% { + right: -17px; + } +} +.tiny-upload--thumb__head { + cursor: pointer; + color: #343434; + font-size: var(--ti-common-font-size-1); +} +.tiny-upload--thumb__head .thumb-icon { + margin-right: 8px; + fill: #999; +} +.tiny-upload--thumb__head span { + vertical-align: middle; +} +.tiny-upload--thumb__body .thumb-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-upload--thumb__body .thumb-item:not(:last-child) { + padding-bottom: 8px; +} +.tiny-upload--thumb__body .thumb-item-name { + padding: 4px 8px; + color: #333; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-upload--thumb__body .thumb-success-icon { + fill: #52c41a; +} +.tiny-upload--thumb__body .close-icon, +.tiny-upload--thumb__body .download-icon, +.tiny-upload--thumb__body .refres-icon { + fill: #7c7c7c; + cursor: pointer; +} +.tiny-upload--thumb__body .thumb-icon + .thumb-icon { + margin-left: 8px; +} +.tiny-float-bar { + --ti-floatbar-border-color: var(--ti-base-color-border); + --ti-floatbar-radius: var(--ti-base-radius-small); + --ti-floatbar-font-size: var(--ti-common-font-size-1); + --ti-floatbar-list-background: var(--ti-base-color-light); + --ti-floatbar-list-color: var(--ti-base-color-info-normal); + --ti-floatbar-list-hover-background: rgba(24, 144, 255, 0.06); + --ti-floatbar-list-hover-color: var(--ti-base-color-brand-6); + position: fixed; + top: 50%; + right: 10px; + z-index: 99999; + border: 1px solid var(--ti-floatbar-border-color); + -webkit-box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + border-radius: var(--ti-floatbar-radius); + overflow: hidden; + background: var(--ti-floatbar-list-background); +} +.tiny-float-bar ul li { + display: block; + background: var(--ti-floatbar-list-background); + color: var(--ti-floatbar-list-color); + font-size: var(--ti-floatbar-font-size); + min-width: 80px; + min-height: 40px; + line-height: 40px; + text-align: center; +} +.tiny-float-bar ul li:hover { + background: var(--ti-floatbar-list-hover-background); +} +.tiny-float-bar ul li a { + width: 100%; + height: 100%; + color: var(--ti-floatbar-list-color); + cursor: pointer; + outline: 0; +} +.tiny-float-bar ul li a:focus, +.tiny-float-bar ul li a:hover { + color: var(--ti-floatbar-list-hover-color); + text-decoration: none; +} +.tiny-form { + --ti-form-item-margin-right: 10px; + width: 100%; + overflow: hidden; +} +.tiny-form div { + outline: 0; +} +.tiny-form--inline .tiny-form-item, +.tiny-form--inline .tiny-form-item__content { + display: inline-block; + vertical-align: top; +} +.tiny-form--inline .tiny-form-item { + margin-right: var(--ti-form-item-margin-right); +} +.tiny-form--inline .tiny-form-item__label { + float: none; + display: inline-block; +} +.tiny-form--inline .tiny-form--label-top .tiny-form-item__content { + display: block; +} +.tiny-form--label-left .tiny-form-item__label { + text-align: left; +} +.tiny-form--label-top .tiny-form-item__label { + float: none; + display: inline-block; + text-align: left; + line-height: 1; + padding: 0 0 8px; +} +.tiny-form--label-top .tiny-form-item { + margin-bottom: 16px; +} +.tiny-form--label-top .tiny-form { + margin-bottom: 16px; +} +.tiny-form--inline.tiny-form--label-top .tiny-form-item { + margin-bottom: 16px; + margin-right: 64px; +} +.tiny-form--inline.tiny-form--label-top .tiny-form-item__label { + display: block; + text-align: left; +} +.tiny-form__valid.tiny-tooltip.tiny-tooltip__popper { + padding: 7px 4px; +} +.tiny-form__valid.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='top'] .popper__arrow { + bottom: -4px; +} +.tiny-form__valid.tiny-tooltip.tiny-tooltip__popper[x-placement^='top'] { + margin-bottom: 6px; +} +.tiny-form__valid.tiny-tooltip.tiny-tooltip__popper[x-placement^='bottom'] { + margin-top: 6px; +} +.tiny-form-item { + --ti-form-item-small-line-height: 36px; + --ti-form-item-medium-line-height: 42px; + --ti-form-item-mini-line-height: 24px; + --ti-form-item-label-line-height: var(--ti-base-size-height-minor); + --ti-form-item-label-font-size: var(--ti-common-font-size-1); + --ti-form-item-label-color: var(--ti-base-color-info-normal); + --ti-form-item-error-font-size: var(--ti-common-font-size-base); + --ti-form-item-error-color: var(--ti-base-color-error-3); + --ti-form-item-error-bgcolor: var(--ti-base-color-error-1); + margin-bottom: 12px; +} +.tiny-form-item:after, +.tiny-form-item:before { + content: ''; + display: table; +} +.tiny-form-item:after { + clear: both; +} +.tiny-form-item .tiny-form-item { + margin-bottom: 0; +} +.tiny-form-item.tiny-form-item--mini, +.tiny-form-item.tiny-form-item--small { + margin-bottom: 8px; +} +.tiny-form-item--medium .tiny-form-item__label { + height: var(--ti-form-item-medium-line-height); + line-height: var(--ti-form-item-medium-line-height); +} +.tiny-form-item--small .tiny-form-item__label { + height: var(--ti-form-item-small-line-height); + line-height: var(--ti-form-item-small-line-height); +} +.tiny-form-item--small .tiny-form-item__error { + padding-top: 2px; +} +.tiny-form-item--mini .tiny-form-item__label { + height: var(--ti-form-item-mini-line-height); + line-height: var(--ti-form-item-mini-line-height); +} +.tiny-form-item--medium .tiny-form-item__content .tiny-checkbox, +.tiny-form-item--medium .tiny-form-item__content .tiny-radio { + line-height: 42px; +} +.tiny-form-item--medium .tiny-form-item__content .tiny-input .tiny-input__inner { + height: 42px; + line-height: 42px; +} +.tiny-form-item--small .tiny-form-item__content .tiny-checkbox, +.tiny-form-item--small .tiny-form-item__content .tiny-radio { + line-height: 36px; +} +.tiny-form-item--small .tiny-form-item__content .tiny-input .tiny-input__inner { + height: 36px; + line-height: 36px; +} +.tiny-form-item--mini .tiny-form-item__content .tiny-checkbox, +.tiny-form-item--mini .tiny-form-item__content .tiny-radio { + line-height: 24px; +} +.tiny-form-item--mini .tiny-form-item__content .tiny-input .tiny-input__inner { + height: 24px; + line-height: 24px; +} +.tiny-form-item--mini .tiny-form-item__error { + padding-top: 1px; +} +.tiny-form-item__label-wrap { + float: left; +} +.tiny-form-item__label-wrap .tiny-form-item__label { + display: inline-block; + float: none; +} +.tiny-form-item__label { + text-align: right; + vertical-align: middle; + float: left; + font-size: var(--ti-form-item-label-font-size); + color: var(--ti-form-item-label-color); + height: var(--ti-form-item-label-line-height); + line-height: var(--ti-form-item-label-line-height); + padding-right: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.tiny-form-item__content { + position: relative; + font-size: var(--ti-form-item-label-font-size); +} +.tiny-form-item__content:after, +.tiny-form-item__content:before { + content: ''; + display: table; +} +.tiny-form-item__content:after { + clear: both; +} +.tiny-form-item__content .tiny-input { + display: inline-block; +} +.tiny-form-item__content .tiny-input.tiny-range-editor.tiny-input__inner { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} +.tiny-form-item__content .tiny-input.tiny-input-group { + display: inline-table; +} +.tiny-form-item__content .tiny-input-group { + vertical-align: top; +} +.tiny-form-item__content .tiny-button + .tiny-button { + margin-left: 8px; +} +.tiny-form-item__content .tiny-checkbox, +.tiny-form-item__content .tiny-radio { + line-height: 30px; +} +.tiny-form-item__content .tiny-date-editor--daterange.tiny-input, +.tiny-form-item__content .tiny-date-editor--daterange.tiny-input__inner, +.tiny-form-item__content .tiny-date-editor--timerange.tiny-input, +.tiny-form-item__content .tiny-date-editor--timerange.tiny-input__inner, +.tiny-form-item__content .tiny-numeric { + width: 100%; +} +.tiny-form-item__error { + color: var(--ti-form-item-error-color); + font-size: var(--ti-form-item-error-font-size); + line-height: 1; + padding-top: 4px; + position: absolute; + top: 100%; + left: 0; +} +.tiny-form-item__error--inline { + position: relative; + top: auto; + left: auto; + display: inline-block; + margin-left: 10px; +} +.tiny-form-item.is-required:not(.is-no-asterisk) .tiny-form-item__label-wrap > .tiny-form-item__label:before, +.tiny-form-item.is-required:not(.is-no-asterisk) > .tiny-form-item__label:before { + content: '*'; + color: var(--ti-form-item-error-color); + margin-right: 4px; +} +.tiny-form-item.is-error .tiny-input__inner, +.tiny-form-item.is-error .tiny-input__inner:focus, +.tiny-form-item.is-error .tiny-textarea__inner, +.tiny-form-item.is-error .tiny-textarea__inner:focus { + border-color: var(--ti-form-item-error-color); + background-color: var(--ti-form-item-error-bgcolor); +} +.tiny-form-item.is-error .tiny-input-group__append .tiny-input__inner, +.tiny-form-item.is-error .tiny-input-group__prepend .tiny-input__inner { + border-color: transparent; +} +.tiny-form-item.is-error .tiny-input__validateIcon { + color: var(--ti-form-item-error-color); +} +.tiny-form-item.is-error .tiny-numeric__input-inner, +.tiny-form-item.is-error .tiny-numeric__input-inner:focus { + border-color: #f5222d; +} +.tiny-form-item--feedback .tiny-input__validateIcon { + display: inline-block; +} +.tiny-form-item .tiny-input__validateIcon { + display: none; +} +.tiny-zoom-in-top-enter-active, +.tiny-zoom-in-top-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: center top; + transform-origin: center top; +} +.tiny-zoom-in-top-enter, +.tiny-zoom-in-top-enter-from, +.tiny-zoom-in-top-leave-active { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0); +} +.tiny-gantt { + width: 100%; + height: 500px; +} +.container { + padding-right: 10px; + margin-right: auto; + padding-left: 10px; + margin-left: auto; +} +.container:after, +.container:before { + content: ''; + display: table; +} +.container:after { + clear: both; +} +@media (min-width: 768px) { + .container { + width: 788px; + } +} +@media (min-width: 992px) { + .container { + width: 1012px; + } +} +@media (min-width: 1200px) { + .container { + width: 1220px; + } +} +@media (min-width: 1920px) { + .container { + width: 1940px; + } +} +.row { + margin-left: -10px; + margin-right: -10px; +} +.row:after, +.row:before { + content: ''; + display: table; +} +.row:after { + clear: both; +} +.row h3 { + margin-left: 10px; +} +.tiny-filter .row { + overflow: hidden; +} +.tiny-filter .row .title { + margin-left: 10px; +} +.col-lg-1, +.col-lg-10, +.col-lg-11, +.col-lg-12, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-md-1, +.col-md-10, +.col-md-11, +.col-md-12, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-sm-1, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-xl-1, +.col-xl-10, +.col-xl-11, +.col-xl-12, +.col-xl-2, +.col-xl-3, +.col-xl-4, +.col-xl-5, +.col-xl-6, +.col-xl-7, +.col-xl-8, +.col-xl-9, +.col-xs-1, +.col-xs-10, +.col-xs-11, +.col-xs-12, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9 { + position: relative; + min-height: 1px; + padding-left: 10px; + padding-right: 10px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.col-xs-1, +.col-xs-10, +.col-xs-11, +.col-xs-12, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: 0; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: 0; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, + .col-sm-10, + .col-sm-11, + .col-sm-12, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: 0; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: 0; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, + .col-md-10, + .col-md-11, + .col-md-12, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: 0; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: 0; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-10, + .col-lg-11, + .col-lg-12, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: 0; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: 0; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1920px) { + .col-xl-1, + .col-xl-10, + .col-xl-11, + .col-xl-12, + .col-xl-2, + .col-xl-3, + .col-xl-4, + .col-xl-5, + .col-xl-6, + .col-xl-7, + .col-xl-8, + .col-xl-9 { + float: left; + } + .col-xl-12 { + width: 100%; + } + .col-xl-11 { + width: 91.66666667%; + } + .col-xl-10 { + width: 83.33333333%; + } + .col-xl-9 { + width: 75%; + } + .col-xl-8 { + width: 66.66666667%; + } + .col-xl-7 { + width: 58.33333333%; + } + .col-xl-6 { + width: 50%; + } + .col-xl-5 { + width: 41.66666667%; + } + .col-xl-4 { + width: 33.33333333%; + } + .col-xl-3 { + width: 25%; + } + .col-xl-2 { + width: 16.66666667%; + } + .col-xl-1 { + width: 8.33333333%; + } + .col-xl-push-12 { + left: 100%; + } + .col-xl-push-11 { + left: 91.66666667%; + } + .col-xl-push-10 { + left: 83.33333333%; + } + .col-xl-push-9 { + left: 75%; + } + .col-xl-push-8 { + left: 66.66666667%; + } + .col-xl-push-7 { + left: 58.33333333%; + } + .col-xl-push-6 { + left: 50%; + } + .col-xl-push-5 { + left: 41.66666667%; + } + .col-xl-push-4 { + left: 33.33333333%; + } + .col-xl-push-3 { + left: 25%; + } + .col-xl-push-2 { + left: 16.66666667%; + } + .col-xl-push-1 { + left: 8.33333333%; + } + .col-xl-push-0 { + left: 0; + } + .col-xl-pull-12 { + right: 100%; + } + .col-xl-pull-11 { + right: 91.66666667%; + } + .col-xl-pull-10 { + right: 83.33333333%; + } + .col-xl-pull-9 { + right: 75%; + } + .col-xl-pull-8 { + right: 66.66666667%; + } + .col-xl-pull-7 { + right: 58.33333333%; + } + .col-xl-pull-6 { + right: 50%; + } + .col-xl-pull-5 { + right: 41.66666667%; + } + .col-xl-pull-4 { + right: 33.33333333%; + } + .col-xl-pull-3 { + right: 25%; + } + .col-xl-pull-2 { + right: 16.66666667%; + } + .col-xl-pull-1 { + right: 8.33333333%; + } + .col-xl-pull-0 { + right: 0; + } + .col-xl-offset-12 { + margin-left: 100%; + } + .col-xl-offset-11 { + margin-left: 91.66666667%; + } + .col-xl-offset-10 { + margin-left: 83.33333333%; + } + .col-xl-offset-9 { + margin-left: 75%; + } + .col-xl-offset-8 { + margin-left: 66.66666667%; + } + .col-xl-offset-7 { + margin-left: 58.33333333%; + } + .col-xl-offset-6 { + margin-left: 50%; + } + .col-xl-offset-5 { + margin-left: 41.66666667%; + } + .col-xl-offset-4 { + margin-left: 33.33333333%; + } + .col-xl-offset-3 { + margin-left: 25%; + } + .col-xl-offset-2 { + margin-left: 16.66666667%; + } + .col-xl-offset-1 { + margin-left: 8.33333333%; + } + .col-xl-offset-0 { + margin-left: 0; + } +} +[class*='tiny-grid-icon__'] { + display: inline-block; + vertical-align: middle; + position: relative; + direction: ltr; + font-family: var(--ti-grid-font-family); +} +.tiny-grid-icon__zoomin { + width: 0.8em; + height: 0.8em; + margin: 0.1em; + border-width: 0.1em; + border-style: solid; + border-color: inherit; +} +.tiny-grid-icon__zoomout { + width: 1em; + height: 1em; + line-height: 1em; + position: relative; +} +.tiny-grid-icon__zoomout:before { + content: ''; + position: absolute; + right: 0; + width: 0.7em; + border-style: solid; + top: 0; + border-width: 0.1em; + height: 0.7em; + border-color: inherit; +} +.tiny-grid-icon__zoomout:after { + content: ''; + position: absolute; + bottom: 0.1em; + background-color: #fff; + left: 0.1em; + border-style: solid; + width: 0.7em; + border-width: 0.1em; + height: 0.7em; + border-color: inherit; +} +.tiny-grid-icon__menu { + width: 0.22em; + height: 0.22em; + -webkit-box-shadow: 0 -0.4em 0, -0.4em -0.4em 0, 0.4em -0.4em 0, 0 0 0 1em inset, -0.4em 0 0, 0.4em 0 0, 0 0.4em 0, + -0.4em 0.4em 0, 0.4em 0.4em 0; + box-shadow: 0 -0.4em 0, -0.4em -0.4em 0, 0.4em -0.4em 0, 0 0 0 1em inset, -0.4em 0 0, 0.4em 0 0, 0 0.4em 0, + -0.4em 0.4em 0, 0.4em 0.4em 0; + margin: 0.58em; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.tiny-grid-icon__caret-bottom, +.tiny-grid-icon__caret-left, +.tiny-grid-icon__caret-right, +.tiny-grid-icon__caret-top { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__caret-bottom:before, +.tiny-grid-icon__caret-left:before, +.tiny-grid-icon__caret-right:before, +.tiny-grid-icon__caret-top:before { + content: ''; + left: 0; + bottom: 0.25em; + border-right-color: transparent; + position: absolute; + border-width: 0.5em; + border-style: solid; + border-top-color: transparent; + border-bottom-color: inherit; + border-left-color: transparent; + -webkit-transition: border 0.1s ease-in-out; + transition: border 0.1s ease-in-out; +} +.tiny-grid-icon__caret-bottom { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +.tiny-grid-icon__caret-left { + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.tiny-grid-icon__caret-right { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.tiny-grid-icon__arrow-top { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.tiny-grid-icon__arrow-top:before { + content: ''; + position: absolute; + top: 0.38em; + left: 0.12em; + width: 0.5em; + height: 0.5em; + border-width: 0.1em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__arrow-bottom { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(135deg); + transform: rotate(135deg); +} +.tiny-grid-icon__arrow-bottom:before { + content: ''; + position: absolute; + top: 0.38em; + left: 0.12em; + width: 0.5em; + height: 0.5em; + border-width: 0.1em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__arrow-left { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(-135deg); + transform: rotate(-135deg); +} +.tiny-grid-icon__arrow-left:before { + content: ''; + position: absolute; + top: 0.38em; + left: 0.12em; + width: 0.5em; + height: 0.5em; + border-width: 0.1em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__arrow-right { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.tiny-grid-icon__arrow-right:before { + content: ''; + position: absolute; + top: 0.38em; + left: 0.12em; + width: 0.5em; + height: 0.5em; + border-width: 0.1em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__d-arrow-top { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.tiny-grid-icon__d-arrow-top:before { + content: ''; + position: absolute; + top: 0.24em; + left: 0.26em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-right-color: inherit; + border-top-color: inherit; + border-left-color: transparent; + border-bottom-color: transparent; +} +.tiny-grid-icon__d-arrow-top:after { + content: ''; + position: absolute; + top: 0.42em; + left: 0.1em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__d-arrow-bottom { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(135deg); + transform: rotate(135deg); +} +.tiny-grid-icon__d-arrow-bottom:before { + content: ''; + position: absolute; + top: 0.24em; + left: 0.26em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-right-color: inherit; + border-top-color: inherit; + border-left-color: transparent; + border-bottom-color: transparent; +} +.tiny-grid-icon__d-arrow-bottom:after { + content: ''; + position: absolute; + top: 0.42em; + left: 0.1em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__d-arrow-left { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(-135deg); + transform: rotate(-135deg); +} +.tiny-grid-icon__d-arrow-left:before { + content: ''; + position: absolute; + top: 0.24em; + left: 0.26em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-right-color: inherit; + border-top-color: inherit; + border-left-color: transparent; + border-bottom-color: transparent; +} +.tiny-grid-icon__d-arrow-left:after { + content: ''; + position: absolute; + top: 0.42em; + left: 0.1em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__d-arrow-right { + width: 1em; + height: 1em; + line-height: 1em; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.tiny-grid-icon__d-arrow-right:before { + content: ''; + position: absolute; + top: 0.24em; + left: 0.26em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-right-color: inherit; + border-top-color: inherit; + border-left-color: transparent; + border-bottom-color: transparent; +} +.tiny-grid-icon__d-arrow-right:after { + content: ''; + position: absolute; + top: 0.42em; + left: 0.1em; + width: 0.5em; + height: 0.5em; + border-width: 0.08em; + border-style: solid; + border-top-color: inherit; + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: inherit; +} +.tiny-grid-icon__funnel { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__funnel:before { + content: ''; + border-top-color: inherit; + position: absolute; + border-bottom-color: transparent; + top: 0.1em; + border-right-color: transparent; + left: 0; + border-left-color: transparent; + border-width: 0.5em; + border-style: solid; +} +.tiny-grid-icon__funnel:after { + content: ''; + position: absolute; + left: 0.4em; + top: 0.5em; + width: 0; + height: 0.4em; + border-width: 0 0.2em 0 0; + border-style: solid; + border-right-color: inherit; +} +.tiny-grid-icon__edit-outline { + width: 1em; + height: 1em; + line-height: 1em; + border-radius: 0.2em; + border-width: 0.1em; + border-style: solid; + border-color: inherit; +} +.tiny-grid-icon__edit-outline:before { + content: ''; + position: absolute; + top: -0.1em; + right: -0.1em; + width: 0.4em; + height: 0.4em; + background-color: #fff; +} +.tiny-grid-icon__edit-outline:after { + content: ''; + position: absolute; + left: 0.15em; + top: 0.12em; + width: 0.9em; + height: 0; + border-radius: 0.2em; + border-width: 0 0 0.15em 0; + border-style: solid; + border-color: inherit; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.tiny-grid-icon__more { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__more:before { + content: '...'; + position: absolute; + top: 0; + left: 0.1em; + line-height: 0.5em; + font-weight: 700; +} +.tiny-grid-icon__close { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__close:after, +.tiny-grid-icon__close:before { + content: ''; + position: absolute; + left: 0; + top: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + border-style: solid; + border-width: 0; +} +.tiny-grid-icon__close:before { + width: 1em; + border-bottom-width: 0.1em; + top: 0.45em; +} +.tiny-grid-icon__close:after { + height: 1em; + border-right-width: 0.1em; + left: 0.45em; +} +.tiny-grid-icon__refresh { + width: 1em; + height: 1em; + line-height: 1em; + border-style: solid; + border-width: 0.1em; + border-right-color: transparent !important; + border-radius: 50%; + border-left-color: transparent !important; +} +.tiny-grid-icon__refresh:after { + right: 50%; + bottom: 0; + -webkit-transform: translateX(-50%) rotate(135deg); + transform: translateX(-50%) rotate(135deg); +} +.tiny-grid-icon__refresh:before { + left: 50%; + top: 0; + -webkit-transform: translateX(50%) rotate(-45deg); + transform: translateX(50%) rotate(-45deg); +} +.tiny-grid-icon__refresh:after, +.tiny-grid-icon__refresh:before { + content: ''; + position: absolute; + border-left-color: transparent; + width: 0; + border-right-color: transparent; + height: 0; + border-bottom-color: transparent; + border-width: 0.25em; + border-style: solid; +} +.tiny-grid-icon__refresh.roll { + -webkit-animation: rollCircle 1s infinite linear; + animation: rollCircle 1s infinite linear; +} +.tiny-grid-icon__question { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__question:before { + content: ''; + border-radius: 50%; + border-width: 0.5em; + border-style: solid; + border-color: inherit; + position: absolute; + top: 0; + left: 0; +} +.tiny-grid-icon__question:after { + position: absolute; + color: #fff; + color: var(--ti-grid-light-color, #fff); + font-size: 0.7em; + display: inline-block; + top: 0; + left: 0; + width: inherit; + height: inherit; + text-align: center; + font-weight: 700; + content: '?'; +} +.tiny-grid-icon__info { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__info:before { + content: ''; + border-radius: 50%; + border-width: 0.5em; + border-style: solid; + border-color: inherit; + position: absolute; + top: 0; + left: 0; +} +.tiny-grid-icon__info:after { + position: absolute; + color: #fff; + color: var(--ti-grid-light-color, #fff); + font-size: 0.7em; + display: inline-block; + top: 0; + left: 0; + width: inherit; + height: inherit; + text-align: center; + font-weight: 700; + content: '!'; + -webkit-transform: rotate(180deg) translateY(1px); + transform: rotate(180deg) translateY(1px); +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-grid-icon__info:after { + font-size: var(--ti-common-font-size-1); + } +} +@media screen and (-ms-ime-align: auto) { + .tiny-grid-icon__info:after { + font-size: var(--ti-common-font-size-1); + } +} +.tiny-grid-icon__warning { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__warning:before { + content: ''; + border-radius: 50%; + border-width: 0.5em; + border-style: solid; + border-color: inherit; + position: absolute; + top: 0; + left: 0; +} +.tiny-grid-icon__warning:after { + position: absolute; + color: #fff; + color: var(--ti-grid-light-color, #fff); + font-size: 0.7em; + display: inline-block; + top: 0; + left: 0; + width: inherit; + height: inherit; + text-align: center; + font-weight: 700; + content: '!'; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-grid-icon__warning:after { + font-size: var(--ti-common-font-size-1); + } +} +@media screen and (-ms-ime-align: auto) { + .tiny-grid-icon__warning:after { + font-size: var(--ti-common-font-size-1); + } +} +.tiny-grid-icon__success { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__success:before { + content: ''; + border-radius: 50%; + border-width: 0.5em; + border-style: solid; + border-color: inherit; + position: absolute; + top: 0; + left: 0; +} +.tiny-grid-icon__success:after { + content: ''; + position: absolute; + height: 0.55em; + width: 0.3em; + left: 0.35em; + top: 0.15em; + border-width: 0.1em; + border-style: solid; + border-color: #fff; + border-left: 0; + border-top: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.tiny-grid-icon__error { + width: 1em; + height: 1em; + line-height: 1em; +} +.tiny-grid-icon__error:before { + content: ''; + border-radius: 50%; + border-width: 0.5em; + border-style: solid; + border-color: inherit; + position: absolute; + top: 0; + left: 0; +} +.tiny-grid-icon__error:after { + position: absolute; + color: #fff; + color: var(--ti-grid-light-color, #fff); + font-size: 0.7em; + display: inline-block; + top: 0; + left: 0; + width: inherit; + height: inherit; + text-align: center; + font-weight: 700; + content: '\2716'; +} +@-webkit-keyframes rollCircle { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes rollCircle { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +.tiny-grid__animat .tiny-grid-filter__btn:after, +.tiny-grid__animat .tiny-grid-filter__btn:before, +.tiny-grid__animat .tiny-grid-sort__asc-btn:after, +.tiny-grid__animat .tiny-grid-sort__asc-btn:before, +.tiny-grid__animat .tiny-grid-sort__desc-btn:after, +.tiny-grid__animat .tiny-grid-sort__desc-btn:before { + -webkit-transition: border 0.1s ease-in-out; + transition: border 0.1s ease-in-out; +} +.tiny-grid__animat .tiny-grid__expand-icon { + -webkit-transition: all 0.1s ease-in-out; + transition: all 0.1s ease-in-out; +} +.tiny-grid__animat .tiny-grid-input__wrapper .tiny-grid-input { + -webkit-transition: border 0.1s ease-in-out; + transition: border 0.1s ease-in-out; +} +.tiny-grid__animat .tiny-grid-tree__node-btn { + -webkit-transition: -webkit-transform 0.1s ease-in-out; + transition: -webkit-transform 0.1s ease-in-out; + transition: transform 0.1s ease-in-out; + transition: transform 0.1s ease-in-out, -webkit-transform 0.1s ease-in-out; +} +.tiny-grid__animat .tiny-grid-checkbox > input:checked + span, +.tiny-grid__animat .tiny-grid-radio > input:checked + span { + -webkit-transition: background-color 0.1s ease-in-out; + transition: background-color 0.1s ease-in-out; +} +.tiny-grid { + position: relative; + overflow: hidden; + font-size: var(--ti-grid-font-size); + color: var(--ti-grid-font-color); + font-family: var(--ti-grid-font-family); + background-color: var(--ti-grid-light-color); +} +.tiny-grid.show__head .tiny-grid__fixed-left-wrapper .tiny-grid__body-wrapper:before, +.tiny-grid.show__head .tiny-grid__fixed-right-wrapper .tiny-grid__body-wrapper:before { + display: none; +} +.tiny-grid.show__foot.scroll__x .tiny-grid__body-wrapper { + overflow-x: auto; +} +.tiny-grid.show__foot.scroll__y .tiny-grid__body-wrapper.fixed-left__wrapper, +.tiny-grid.show__foot.scroll__y .tiny-grid__body-wrapper.fixed-right__wrapper { + padding-bottom: 12px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-grid.show__foot.scroll__y .tiny-grid__body-wrapper.fixed-left__wrapper .tiny-grid__body, + .tiny-grid.show__foot.scroll__y .tiny-grid__body-wrapper.fixed-right__wrapper .tiny-grid__body { + padding-bottom: 17px; + } +} +.tiny-grid.column__highlight .tiny-grid-header__column:not(.col__index):hover { + background-color: var(--ti-grid-column-hover-background-color); +} +.tiny-grid.size__medium .tiny-grid-body__column:not(.col__ellipsis), +.tiny-grid.size__medium .tiny-grid-footer__column:not(.col__ellipsis), +.tiny-grid.size__medium .tiny-grid-header__column:not(.col__ellipsis) { + padding: var(--ti-table-td-padding, 2px 8px); +} +.tiny-grid.size__medium .tiny-grid-body__column, +.tiny-grid.size__medium .tiny-grid-footer__column { + height: var(--ti-grid-medium-column-height, 46px); +} +.tiny-grid.size__medium .tiny-grid-loading .tiny-grid__spinner { + width: 50px; + height: 50px; +} +.tiny-grid.size__medium .tiny-grid-default-input, +.tiny-grid.size__medium .tiny-grid-default-select, +.tiny-grid.size__medium .tiny-grid-default-textarea, +.tiny-grid.size__medium .tiny-grid-input__wrapper { + height: var(--ti-grid-medium-column-height, 46px); +} +.tiny-grid.size__medium .tiny-grid-header__column .tiny-grid-resizable { + height: var(--ti-grid-medium-column-height, 46px); +} +.tiny-grid.size__small { + font-size: var(--ti-grid-font-size); +} +.tiny-grid.size__small .tiny-grid-body__column:not(.col__ellipsis), +.tiny-grid.size__small .tiny-grid-footer__column:not(.col__ellipsis), +.tiny-grid.size__small .tiny-grid-header__column:not(.col__ellipsis) { + padding: var(--ti-table-td-padding, 2px 8px); +} +.tiny-grid.size__small .tiny-grid-body__column, +.tiny-grid.size__small .tiny-grid-footer__column { + height: var(--ti-grid-small-column-height, 30px); +} +.tiny-grid.size__small .tiny-grid-loading .tiny-grid__spinner { + width: 44px; + height: 44px; +} +.tiny-grid.size__small .tiny-grid-default-input, +.tiny-grid.size__small .tiny-grid-default-select, +.tiny-grid.size__small .tiny-grid-default-textarea, +.tiny-grid.size__small .tiny-grid-input__wrapper { + height: var(--ti-grid-small-column-height, 30px); +} +.tiny-grid.size__small .tiny-grid-header__column .tiny-grid-resizable { + height: var(--ti-grid-small-column-height, 30px); +} +.tiny-grid.size__mini { + font-size: var(--ti-grid-font-size); +} +.tiny-grid.size__mini .tiny-grid-body__column:not(.col__ellipsis), +.tiny-grid.size__mini .tiny-grid-footer__column:not(.col__ellipsis), +.tiny-grid.size__mini .tiny-grid-header__column:not(.col__ellipsis) { + padding: var(--ti-table-td-padding, 2px 8px); +} +.tiny-grid.size__mini .tiny-grid-body__column, +.tiny-grid.size__mini .tiny-grid-footer__column { + height: var(--ti-grid-mini-column-height, 26px); +} +.tiny-grid.size__mini .tiny-grid-loading .tiny-grid__spinner { + width: 38px; + height: 38px; +} +.tiny-grid.size__mini .tiny-grid-default-input, +.tiny-grid.size__mini .tiny-grid-default-select, +.tiny-grid.size__mini .tiny-grid-default-textarea, +.tiny-grid.size__mini .tiny-grid-input__wrapper { + height: var(--ti-grid-mini-column-height, 26px); +} +.tiny-grid.size__mini .tiny-grid-header__column .tiny-grid-resizable { + height: var(--ti-grid-mini-column-height, 26px); +} +.tiny-grid .fixed__hidden { + visibility: hidden; +} +.tiny-grid table { + border-spacing: 0; + border-collapse: separate; + table-layout: fixed; +} +.tiny-grid.tiny-grid__stripe .tiny-grid-body__row:not(.row__hover):nth-child(2n) { + background-color: var(--ti-grid-row-striped-background-color); +} +.tiny-grid.tiny-grid__stripe .tiny-grid-body__row.row__selected:not(.row__hover):nth-child(2n) { + background-color: rgba(47, 143, 232, 0.1); +} +.tiny-grid.tiny-grid__stripe .tiny-grid-body__row.row__selected:not(.row__hover):nth-child(2n + 1) { + background-color: rgba(47, 143, 232, 0.15); +} +.tiny-grid.tiny-grid__stripe.mark-insert .tiny-grid-body__row.row__new { + background-color: #f2f5fc; +} +.tiny-grid.tiny-grid__border:after, +.tiny-grid.tiny-grid__border:before { + content: ''; + position: absolute; + left: 0; + width: 100%; + height: 0; + z-index: 1; +} +.tiny-grid.tiny-grid__border:before { + top: 0; + border-top: 1px solid var(--ti-grid-border-color); +} +.tiny-grid.tiny-grid__border:after { + bottom: 0; + border-bottom: 1px solid var(--ti-grid-border-color); +} +.tiny-grid.tiny-grid__border .tiny-grid__header { + border: 0; + border-spacing: 0; + border-collapse: separate; +} +.tiny-grid.tiny-grid__border .tiny-grid-body__column, +.tiny-grid.tiny-grid__border .tiny-grid-footer__column, +.tiny-grid.tiny-grid__border .tiny-grid-header__column { + background-image: -webkit-gradient( + linear, + right top, + left top, + from(var(--ti-grid-border-color)), + to(var(--ti-grid-border-color)) + ), + -webkit-gradient(linear, left top, left bottom, from(var(--ti-grid-border-color)), to(var(--ti-grid-border-color))); + background-image: linear-gradient(-90deg, var(--ti-grid-border-color), var(--ti-grid-border-color)), + linear-gradient(-180deg, var(--ti-grid-border-color), var(--ti-grid-border-color)); + background-repeat: no-repeat; + background-size: 1px 100%, 100% 1px; + background-position: 100% 0, 100% 100%; + border: none; +} +.tiny-grid.tiny-grid__border .tiny-grid__fixed-left-wrapper .tiny-grid-body__column { + border-right-color: var(--ti-grid-border-color); +} +.tiny-grid.tiny-grid__border .tiny-grid__body-wrapper, +.tiny-grid.tiny-grid__border .tiny-grid__fixed-left-body-wrapper, +.tiny-grid.tiny-grid__border .tiny-grid__fixed-right-body-wrapper { + border-bottom: none; +} +.tiny-grid.tiny-grid__border .tiny-grid__fixed-left-wrapper::before, +.tiny-grid.tiny-grid__border .tiny-grid__fixed-right-wrapper::before { + border-top-width: 1px; +} +.tiny-grid.tiny-grid__border .tiny-grid__border-line:after, +.tiny-grid.tiny-grid__border .tiny-grid__border-line:before { + content: ''; + position: absolute; + top: 0; + width: 0; + height: 100%; + z-index: 1; +} +.tiny-grid.tiny-grid__border .tiny-grid__border-line:before { + left: 0; + border-left: 1px solid var(--ti-grid-border-color); +} +.tiny-grid.tiny-grid__border .tiny-grid__border-line:after { + right: 0; + border-right: 1px solid var(--ti-grid-border-color); +} +.tiny-grid.tiny-grid__checked { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tiny-grid.tiny-grid__checked .tiny-grid-body__column.col__index, +.tiny-grid.tiny-grid__checked .tiny-grid-header__column.col__index { + text-align: center; + cursor: default; +} +.tiny-grid.tiny-grid__checked .tiny-grid-header__column.col__index .tiny-grid-cell { + visibility: hidden; +} +.tiny-grid.tiny-grid__checked .tiny-grid-body__column.col__index { + background-color: var(--ti-grid-header-background-color); +} +.tiny-grid.tiny-grid__checked .tiny-grid-body__column.col__index.col__index-checked { + background-color: #dcdcdc; +} +.tiny-grid .tiny-grid__footer-wrapper, +.tiny-grid .tiny-grid__header-wrapper { + overflow-x: hidden; + overflow-y: hidden; +} +.tiny-grid .tiny-grid__footer-wrapper { + border: 1px solid var(--ti-grid-border-color); + border-bottom: none; + overflow: hidden !important; +} +.tiny-grid .tiny-grid__footer-wrapper .tiny-grid-footer__row .tiny-grid-cell.cell__summary { + font-weight: 700; + text-align: right; +} +.tiny-grid .tiny-grid__fixed-left-wrapper, +.tiny-grid .tiny-grid__fixed-right-wrapper { + width: 100%; + position: absolute; + top: 0; + z-index: 1; + overflow: hidden; + background-color: var(--ti-grid-light-color); +} +.tiny-grid .tiny-grid__fixed-left-wrapper:before, +.tiny-grid .tiny-grid__fixed-right-wrapper:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 0; + border-top: 0 solid var(--ti-grid-border-color); + z-index: 1; +} +.tiny-grid .tiny-grid__fixed-left-wrapper .tiny-grid__body-wrapper, +.tiny-grid .tiny-grid__fixed-right-wrapper .tiny-grid__body-wrapper { + overflow-x: hidden; + border-bottom: none; +} +.tiny-grid .tiny-grid__fixed-left-wrapper { + left: 0; + width: 200px; + border-right: 0 solid var(--ti-grid-border-color); +} +.tiny-grid .tiny-grid__fixed-left-wrapper.scrolling__middle { + -webkit-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.12); + box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.12); +} +.tiny-grid .tiny-grid__fixed-right-wrapper { + right: 0; +} +.tiny-grid .tiny-grid__fixed-right-wrapper.scrolling__middle { + -webkit-box-shadow: -2px 2px 6px rgba(0, 0, 0, 0.12); + box-shadow: -2px 2px 6px rgba(0, 0, 0, 0.12); +} +.tiny-grid .tiny-grid__body-wrapper, +.tiny-grid .tiny-grid__footer-wrapper, +.tiny-grid .tiny-grid__header-wrapper { + position: relative; +} +.tiny-grid .tiny-grid__body-wrapper.fixed-left__wrapper, +.tiny-grid .tiny-grid__body-wrapper.fixed-right__wrapper, +.tiny-grid .tiny-grid__footer-wrapper.fixed-left__wrapper, +.tiny-grid .tiny-grid__footer-wrapper.fixed-right__wrapper, +.tiny-grid .tiny-grid__header-wrapper.fixed-left__wrapper, +.tiny-grid .tiny-grid__header-wrapper.fixed-right__wrapper { + position: absolute; + top: 0; +} +.tiny-grid .tiny-grid__body-wrapper.fixed-left__wrapper, +.tiny-grid .tiny-grid__footer-wrapper.fixed-left__wrapper, +.tiny-grid .tiny-grid__header-wrapper.fixed-left__wrapper { + left: 0; +} +.tiny-grid .tiny-grid__body-wrapper.fixed-right__wrapper, +.tiny-grid .tiny-grid__footer-wrapper.fixed-right__wrapper, +.tiny-grid .tiny-grid__header-wrapper.fixed-right__wrapper { + right: 0; + overflow-y: auto; +} +.tiny-grid .tiny-grid__header-wrapper.fixed-right__wrapper { + -ms-overflow-style: none; +} +.tiny-grid.tiny-grid-cell__resize * { + cursor: col-resize; +} +.tiny-grid .tiny-grid-body__row { + background-color: var(--ti-grid-row-odd-background-color); +} +.tiny-grid .tiny-grid-body__row.row__hover { + background-color: var(--ti-grid-row-hover-background-color); +} +.tiny-grid .tiny-grid-body__row.row__current { + background-color: var(--ti-grid-row-hover-background-color); +} +.tiny-grid .tiny-grid-body__column, +.tiny-grid .tiny-grid-footer__column, +.tiny-grid .tiny-grid-header__column { + text-align: left; +} +.tiny-grid .tiny-grid-body__column:not(.col__ellipsis), +.tiny-grid .tiny-grid-footer__column:not(.col__ellipsis), +.tiny-grid .tiny-grid-header__column:not(.col__ellipsis) { + padding: var(--ti-table-td-padding, 2px 8px); +} +.tiny-grid .tiny-grid-body__column.col__current, +.tiny-grid .tiny-grid-footer__column.col__current, +.tiny-grid .tiny-grid-header__column.col__current { + background-color: var(--ti-grid-column-current-background-color); +} +.tiny-grid .tiny-grid-body__column.col__center, +.tiny-grid .tiny-grid-footer__column.col__center, +.tiny-grid .tiny-grid-header__column.col__center { + text-align: center; +} +.tiny-grid .tiny-grid-body__column.col__right, +.tiny-grid .tiny-grid-footer__column.col__right, +.tiny-grid .tiny-grid-header__column.col__right { + text-align: right; +} +.tiny-grid .tiny-grid-body__column.col__ellipsis:not(.col__actived) .tiny-grid-cell, +.tiny-grid .tiny-grid-footer__column.col__ellipsis:not(.col__actived) .tiny-grid-cell, +.tiny-grid .tiny-grid-header__column.col__ellipsis:not(.col__actived) .tiny-grid-cell { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding-left: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-grid .tiny-grid-body__column.col__ellipsis:not(.col__actived) .tiny-grid-cell > .tiny-grid-checkbox, +.tiny-grid .tiny-grid-footer__column.col__ellipsis:not(.col__actived) .tiny-grid-cell > .tiny-grid-checkbox, +.tiny-grid .tiny-grid-header__column.col__ellipsis:not(.col__actived) .tiny-grid-cell > .tiny-grid-checkbox { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding-left: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: 0; +} +.tiny-grid .tiny-grid-header__column { + height: var(--ti-grid-header-column-height); +} +.tiny-grid .tiny-grid-body__column, +.tiny-grid .tiny-grid-footer__column { + height: var(--ti-grid-default-column-height, 42px); + border-bottom: 1px solid var(--ti-grid-border-color); +} +.tiny-grid .tiny-grid-body__row .tiny-grid-body__column.hideTypeClass .tiny-grid-cell, +.tiny-grid .tiny-grid-header__row .tiny-grid-header__column.hideTypeClass .tiny-grid-cell { + padding: 0; +} +.tiny-grid .tiny-grid-cell { + line-height: 120%; + white-space: normal; + -ms-word-break: break-all; + word-break: break-word; +} +.tiny-grid .tiny-grid-cell .tiny-grid-checkbox { + vertical-align: bottom; +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-boole, +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate { + width: 100%; + position: relative; +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-boole .icon-yes { + fill: var(--ti-grid-success-color); +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-boole .icon-close { + fill: var(--ti-grid-error-color); +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate .tiny-grid__rate-chart { + opacity: 0.6; + background-color: var(--ti-grid-success-color); + height: 30px; + line-height: 30px; +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate .tiny-grid__rate-chart.tiny-grid__chart-completed { + background-color: var(--ti-grid-success-color); +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate .tiny-grid__rate-chart.tiny-grid__chart-danger { + background-color: var(--ti-grid-error-color); +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate .tiny-grid__rate-chart.tiny-grid__chart-warning { + background-color: var(--ti-grid-warning-color); +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate .tiny-grid__rate-chart.tiny-grid__chart-normal { + background-color: var(--ti-grid-primary-color); +} +.tiny-grid .tiny-grid-cell .tiny-grid__data-rate .tiny-grid__rate-text { + position: absolute; + left: 8px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.tiny-grid .tiny-grid-body__x-space { + width: 100%; + height: 1px; + margin-bottom: -1px; +} +.tiny-grid .tiny-grid-body__y-space { + width: 0; + float: left; +} +.tiny-grid .tiny-grid-sort-wrapper { + position: absolute; + right: 4px; + top: 0; + bottom: 0; + margin: auto; + text-align: center; + width: 20px; + height: 28px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-grid .tiny-grid-sort-wrapper { + top: 4px; + margin: 0; + } +} +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-icon__caret-top:before { + bottom: 0.1em; +} +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__asc-btn, +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__desc-btn { + height: 16px; + line-height: 16px; + display: block; + font-size: var(--ti-grid-header-icon-font-size); + fill: var(--ti-grid-column-icon-border-color); + cursor: pointer; +} +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__asc-btn:hover, +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__desc-btn:hover { + fill: var(--ti-grid-font-color); +} +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__asc-btn.sort__active, +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__desc-btn.sort__active { + fill: var(--ti-grid-primary-color); +} +.tiny-grid .tiny-grid-sort-wrapper .tiny-grid-sort__desc-btn { + margin-top: -2px; +} +.tiny-grid .tiny-grid__resizable-bar { + display: none; + position: absolute; + top: 0; + left: 0; + width: 1px; + height: 100%; + z-index: 4; +} +.tiny-grid .tiny-grid__resizable-bar:before { + content: ''; + display: block; + height: 100%; + background-color: #d9dddf; +} +.tiny-grid .tiny-grid-tree__indent { + display: inline-block; +} +.tiny-grid .tiny-grid-tree-wrapper { + display: inline-block; + vertical-align: bottom; + width: 18px; + cursor: pointer; +} +.tiny-grid .tiny-grid-tree-wrapper.is__active .tiny-grid-tree__node-btn { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +.tiny-grid .tiny-grid-tree-wrapper .tiny-grid-tree__node-btn { + font-size: var(--ti-grid-font-size); + color: #939599; +} +.tiny-grid .tiny-grid-tree-wrapper .tiny-grid-tree__node-btn:hover { + color: var(--ti-grid-font-color); +} +.tiny-grid .tiny-grid__expanded { + display: inline-block; + text-align: center; + cursor: pointer; +} +.tiny-grid .tiny-grid__expanded .tiny-grid__expand-icon { + display: inline-block; + width: 8px; + height: 8px; + border: 1px solid #666; + vertical-align: middle; + border-width: 1px 1px 0 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + background-color: transparent; +} +.tiny-grid .tiny-grid__expanded.expand__active .tiny-grid__expand-icon { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); +} +.tiny-grid .tiny-grid-body__expanded-column { + border-bottom: 1px solid var(--ti-grid-border-color); +} +.tiny-grid .tiny-grid-body__expanded-cell { + padding: 20px; +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column { + height: 43px; + line-height: inherit; +} +.tiny-grid.tiny-grid-editable.size__medium .tiny-grid-body__column { + height: var(--ti-grid-medium-column-height, 46px); +} +.tiny-grid.tiny-grid-editable.size__small .tiny-grid-body__column { + height: var(--ti-grid-small-column-height, 30px); +} +.tiny-grid.tiny-grid-editable.size__mini .tiny-grid-body__column { + height: var(--ti-grid-mini-column-height, 26px); +} +.tiny-grid .tiny-grid-body__column.col__ellipsis, +.tiny-grid .tiny-grid-footer__column.col__ellipsis, +.tiny-grid .tiny-grid-header__column.col__ellipsis { + line-height: inherit; +} +.tiny-grid .tiny-grid-body__column.col__ellipsis .tiny-grid-cell__ellipsis, +.tiny-grid .tiny-grid-body__column.col__ellipsis .tiny-grid-cell__title, +.tiny-grid .tiny-grid-body__column.col__ellipsis .tiny-grid-cell__tooltip, +.tiny-grid .tiny-grid-footer__column.col__ellipsis .tiny-grid-cell__ellipsis, +.tiny-grid .tiny-grid-footer__column.col__ellipsis .tiny-grid-cell__title, +.tiny-grid .tiny-grid-footer__column.col__ellipsis .tiny-grid-cell__tooltip, +.tiny-grid .tiny-grid-header__column.col__ellipsis .tiny-grid-cell__ellipsis, +.tiny-grid .tiny-grid-header__column.col__ellipsis .tiny-grid-cell__title, +.tiny-grid .tiny-grid-header__column.col__ellipsis .tiny-grid-cell__tooltip { + padding: 0 8px; +} +.tiny-grid.size__medium .tiny-grid-body__column.col__ellipsis, +.tiny-grid.size__medium .tiny-grid-footer__column.col__ellipsis, +.tiny-grid.size__medium .tiny-grid-header__column.col__ellipsis { + height: var(--ti-grid-medium-column-height, 46px); +} +.tiny-grid.size__small .tiny-grid-body__column.col__ellipsis, +.tiny-grid.size__small .tiny-grid-footer__column.col__ellipsis, +.tiny-grid.size__small .tiny-grid-header__column.col__ellipsis { + height: var(--ti-grid-small-column-height, 30px); +} +.tiny-grid.size__mini .tiny-grid-body__column.col__ellipsis, +.tiny-grid.size__mini .tiny-grid-footer__column.col__ellipsis, +.tiny-grid.size__mini .tiny-grid-header__column.col__ellipsis { + height: var(--ti-grid-mini-column-height, 26px); +} +.tiny-grid.is__loading .tiny-grid__empty-block { + visibility: hidden; +} +.tiny-grid .tiny-grid__empty-block { + display: none; + opacity: 0; + height: 100%; + min-height: 60px; + padding: 60px 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + text-align: center; +} +.tiny-grid .tiny-grid__empty-block.is__visible { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + opacity: 1; +} +.tiny-grid .tiny-grid__empty-block.is__visible.is__center { + opacity: 0; +} +.tiny-grid .empty-center-block { + z-index: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; + position: absolute; + width: 100%; + height: calc(100% - 60px); +} +.tiny-grid .empty-center-block .tiny-grid__empty-text { + width: 100%; +} +.tiny-grid .tiny-grid__empty-img { + width: 100%; + height: 100px; + margin: 0; + background: var(--ti-table-nodata-td-bg-img-url) 50% no-repeat; +} +.tiny-grid .tiny-grid__empty-text { + display: block; + margin-top: 8px; + width: 50%; +} +.tiny-grid .tiny-grid-body__column.col__selected:not(.col__checked) { + -webkit-box-shadow: inset 0 0 0 2px var(--ti-grid-primary-color); + box-shadow: inset 0 0 0 2px var(--ti-grid-primary-color); +} +.tiny-grid .tiny-grid-body__column.col__actived, +.tiny-grid .tiny-grid-body__column.col__dirty, +.tiny-grid .tiny-grid-body__column.col__selected { + position: relative; +} +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-grid-cell__valid { + width: 320px; + position: absolute; + bottom: calc(100% + 4px); + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + text-align: center; + pointer-events: none; + z-index: 9; +} +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-grid-cell__valid .tiny-grid-cell__valid-msg { + display: inline-block; + border-radius: 4px; + padding: 8px 12px; + color: var(--ti-grid-light-color); + background-color: var(--ti-grid-error-color); + pointer-events: auto; +} +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-grid-default-input, +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-grid-default-select, +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-grid-default-textarea { + border-color: var(--ti-grid-error-color); +} +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-grid-input__wrapper > .tiny-grid-input { + border-color: var(--ti-grid-error-color); +} +.tiny-grid .tiny-grid-body__column.col__valid-error .tiny-input__inner { + border-color: var(--ti-grid-error-color); +} +.tiny-grid .tiny-grid-body__row:first-child .tiny-grid-cell__valid { + bottom: auto; + top: calc(100% + 4px); +} +.tiny-grid .tiny-grid__body-wrapper.body__wrapper.is__scrollload { + overflow-y: hidden; + position: static; +} +.tiny-grid .is__scrollload .tiny-grid-body__y-space { + position: absolute; + right: 0; + width: 12px; + overflow-y: scroll; +} +.tiny-grid.tiny-grid-editable.tiny-grid-cell__highlight .tiny-grid-body__column.col__actived { + -webkit-box-shadow: inset 0 0 0 2px var(--ti-grid-primary-color); + box-shadow: inset 0 0 0 2px var(--ti-grid-primary-color); +} +.tiny-grid.tiny-grid-editable.tiny-grid-cell__highlight .tiny-grid-body__column.col__actived.col__valid-error { + -webkit-box-shadow: inset 0 0 0 2px var(--ti-grid-error-color); + box-shadow: inset 0 0 0 2px var(--ti-grid-error-color); +} +.tiny-grid.tiny-grid-editable.tiny-grid-cell__highlight + .tiny-grid-body__column.col__actived + .tiny-grid-cell + .tiny-grid-default-input, +.tiny-grid.tiny-grid-editable.tiny-grid-cell__highlight + .tiny-grid-body__column.col__actived + .tiny-grid-cell + .tiny-grid-default-textarea { + border: 0; + padding: 0; +} +.tiny-grid.tiny-grid-editable.tiny-grid-cell__highlight + .tiny-grid-body__column.col__actived + .tiny-grid-cell + .tiny-grid-input__wrapper + .tiny-grid-input, +.tiny-grid.tiny-grid-editable.tiny-grid-cell__highlight + .tiny-grid-body__column.col__actived + .tiny-grid-cell + .tiny-grid-input__wrapper + .tiny-grid-textarea { + border: 0; + padding: 0; +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column { + padding: var(--ti-table-td-padding, 2px 8px); +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column.col__actived { + padding: var(--ti-table-td-padding, 2px 8px); +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column.col__ellipsis { + padding: 0; +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column.col__ellipsis.col__actived { + padding: 0; +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column.col__dirty:before { + content: ''; + top: -5px; + left: -5px; + position: absolute; + border-width: 5px; + border-style: solid; + border-color: transparent var(--ti-grid-error-color) transparent transparent; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.tiny-grid.tiny-grid-editable .tiny-grid-body__column.col__dirty.col__valid-success:before { + border-color: transparent var(--ti-grid-success-color) transparent transparent; +} +.tiny-grid.tiny-grid-editable .tiny-grid__body-wrapper .tiny-grid-editor .tiny-select-dropdown { + left: 0 !important; +} +.tiny-grid.tiny-fullscreen-full { + z-index: 1000; + position: fixed; + overflow: auto; + background: var(--ti-grid-light-color); + width: 100%; + height: 100%; + top: 0; + left: 0; + margin: 0; + padding: 8px; +} +.tiny-grid .tiny-grid-default-input, +.tiny-grid .tiny-grid-default-select, +.tiny-grid .tiny-grid-default-textarea, +.tiny-grid__filter-wrapper .tiny-grid-default-input, +.tiny-grid__filter-wrapper .tiny-grid-default-select, +.tiny-grid__filter-wrapper .tiny-grid-default-textarea { + outline: 0; + padding: 0 8px; + height: 30px; + width: 100%; + color: var(--ti-grid-font-color); + border-radius: 2px; + border: 1px solid var(--ti-grid-border-color); +} +.tiny-grid .tiny-grid-default-input:focus, +.tiny-grid .tiny-grid-default-select:focus, +.tiny-grid .tiny-grid-default-textarea:focus, +.tiny-grid__filter-wrapper .tiny-grid-default-input:focus, +.tiny-grid__filter-wrapper .tiny-grid-default-select:focus, +.tiny-grid__filter-wrapper .tiny-grid-default-textarea:focus { + border: 1px solid var(--ti-grid-primary-color); +} +.tiny-grid .tiny-grid-editor, +.tiny-grid__filter-wrapper .tiny-grid-editor { + width: 100%; + height: 30px; + line-height: 30px; + color: var(--ti-grid-font-color); +} +.tiny-grid .tiny-grid-editor .tiny-input, +.tiny-grid__filter-wrapper .tiny-grid-editor .tiny-input { + width: 100%; +} +.tiny-grid .tiny-grid-editor .tiny-select, +.tiny-grid__filter-wrapper .tiny-grid-editor .tiny-select { + z-index: 1; +} +.tiny-grid .tiny-grid-default-textarea, +.tiny-grid__filter-wrapper .tiny-grid-default-textarea { + resize: none; + vertical-align: middle; +} +.tiny-grid .tiny-grid-input__wrapper, +.tiny-grid__filter-wrapper .tiny-grid-input__wrapper { + width: 100%; + display: block; +} +.tiny-grid .tiny-grid-input__wrapper .tiny-grid-input, +.tiny-grid .tiny-grid-input__wrapper .tiny-grid-textarea, +.tiny-grid__filter-wrapper .tiny-grid-input__wrapper .tiny-grid-input, +.tiny-grid__filter-wrapper .tiny-grid-input__wrapper .tiny-grid-textarea { + padding: 0 2px; +} +.tiny-grid .tiny-grid-input__wrapper .tiny-grid-textarea, +.tiny-grid__filter-wrapper .tiny-grid-input__wrapper .tiny-grid-textarea { + resize: none; +} +.tiny-grid__filter-wrapper .tiny-grid-default-input, +.tiny-grid__filter-wrapper .tiny-grid-default-textarea { + padding: 0 10px; +} +.tiny-grid-hidden-column { + display: none; +} +.tiny-grid .tiny-pager, +.tiny-grid + .tiny-pager { + padding-top: 24px; +} +.tiny-grid .tiny-grid__header th.col__gutter { + width: 0; +} +.tiny-grid .tiny-grid__header .tiny-grid-header__column.col__ellipsis.is__sortable .tiny-grid-cell { + padding-right: 28px; +} +.tiny-grid__header-wrapper { + background-color: var(--ti-grid-header-background-color); +} +.tiny-grid__header-wrapper .tiny-grid__repair { + position: absolute; + left: 0; + bottom: 0; + height: 0; + border-bottom: 1px solid var(--ti-grid-border-color); +} +.tiny-grid-header__column { + position: relative; + font-size: var(--ti-grid-font-size); + color: var(--ti-grid-font-color); +} +.tiny-grid-header__column.is__sortable .tiny-grid-cell { + padding-right: 20px; +} +.tiny-grid-header__column.is__editable .tiny-grid-cell { + padding-left: 20px; +} +.tiny-grid-header__column.col__title-checked { + background-color: #dcdcdc; +} +.tiny-grid-header__column.col__title-checked .tiny-grid-edit-icon.tiny-grid-icon__edit-outline:before { + background-color: #dcdcdc; +} +.tiny-grid-header__column.col__ellipsis .tiny-grid-edit-icon { + position: static; + -webkit-transform: translateY(0); + transform: translateY(0); +} +.tiny-grid-header__column.col__ellipsis.is__editable .tiny-grid-required-icon { + margin-left: 20px; +} +.tiny-grid-header__column.col__ellipsis.is__editable .tiny-grid-required-icon + .tiny-grid-edit-icon { + position: absolute; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.tiny-grid-header__column .tiny-grid-required-icon { + display: inline-block; + color: var(--ti-grid-error-color); + line-height: 14px; + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-header__column .tiny-grid-required-icon:before { + content: '*'; + width: 10px; + height: 10px; + display: block; +} +.tiny-grid-header__column .tiny-grid-edit-icon { + position: absolute; + left: 8px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + text-align: center; + font-size: var(--ti-common-font-size-2); + margin-right: 4px; + fill: var(--ti-grid-column-icon-border-color); +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-grid-header__column .tiny-grid-edit-icon { + top: 18px; + } +} +.tiny-grid-header__column .tiny-grid-resizable, +.tiny-grid-header__column .tiny-grid-thead-partition { + position: absolute; + right: 0; + -webkit-transform: translateX(50%); + transform: translateX(50%); + bottom: 0; + top: 0; + margin: auto; + width: 14px; + height: 28px; + text-align: center; + z-index: 1; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-grid-header__column .tiny-grid-resizable, + .tiny-grid-header__column .tiny-grid-thead-partition { + margin: 0; + } +} +.tiny-grid-header__column .tiny-grid-resizable.is__line:after, +.tiny-grid-header__column .tiny-grid-resizable.is__line:before, +.tiny-grid-header__column .tiny-grid-thead-partition.is__line:after, +.tiny-grid-header__column .tiny-grid-thead-partition.is__line:before { + content: ''; + display: inline-block; + vertical-align: middle; +} +.tiny-grid-header__column .tiny-grid-resizable.is__line:before, +.tiny-grid-header__column .tiny-grid-thead-partition.is__line:before { + width: 1px; + height: 100%; + background-color: #fff; +} +.tiny-grid-header__column .tiny-grid-resizable.is__line:after, +.tiny-grid-header__column .tiny-grid-thead-partition.is__line:after { + width: 0; + height: 100%; +} +.tiny-grid-header__column .tiny-grid-resizable.is__line:hover:before, +.tiny-grid-header__column .tiny-grid-thead-partition.is__line:hover:before { + background-color: var(--ti-grid-icon-fill-active-hover); +} +.tiny-grid-header__column .tiny-grid-resizable { + cursor: col-resize; +} +.tiny-grid-header__column .tiny-grid-checkbox > input:not(:checked) + .tiny-grid-checkbox__icon:hover { + border-color: var(--ti-grid-border-color); +} +.tiny-grid-header__column .tiny-grid-checkbox.is__indeterminate > input + .tiny-grid-checkbox__icon:hover { + border-color: var(--ti-grid-primary-color); +} +.tiny-grid__fixed-left-wrapper .tiny-grid-header__column .tiny-grid-resizable { + right: 1px; +} +.tiny-grid__fixed-right-wrapper .tiny-grid-header__column .tiny-grid-resizable { + right: auto; + left: 0; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} +.tiny-grid__header .tiny-grid-cell__header-suffix { + position: relative; + min-height: 16px; +} +.tiny-grid__header .tiny-grid-cell__header-suffix .suffix-icon-1 { + position: absolute; + right: 12px; +} +.tiny-grid__header .tiny-grid-cell__header-suffix .suffix-icon-0 { + position: absolute; + right: 0; +} +.tiny-grid__header + .col__ellipsis.is__editable.is__sortable.is__filter + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip { + padding-right: 28px; +} +.tiny-grid__header + .col__ellipsis.is__editable.is__filter:not(.is__sortable) + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip, +.tiny-grid__header + .col__ellipsis.is__editable.is__sortable:not(.is__filter) + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip { + padding-right: 14px; +} +.tiny-grid__header + .col__ellipsis:not(.is__sortable):not(.is__filter) + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip { + padding-right: 8px; +} +.tiny-grid__header + .col__ellipsis.is__sortable.is__filter:not(.is__editable) + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip { + padding-right: 26px; +} +.tiny-grid__header + .col__ellipsis.is__filter:not(.is__sortable):not(.is__editable) + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip, +.tiny-grid__header + .col__ellipsis.is__sortable:not(.is__filter):not(.is__editable) + .tiny-grid-cell__header-suffix.tiny-grid-cell__tooltip { + padding-right: 12px; +} +.tiny-grid__body-wrapper, +.tiny-grid__fixed-left-body-wrapper, +.tiny-grid__fixed-right-body-wrapper { + overflow-y: auto; + overflow-x: auto; +} +.tiny-grid__borders .tiny-grid-border-bottom, +.tiny-grid__borders .tiny-grid-border-left, +.tiny-grid__borders .tiny-grid-border-right, +.tiny-grid__borders .tiny-grid-border-top { + position: absolute; + background-color: var(--ti-grid-primary-color); +} +.tiny-grid__borders .tiny-grid-checked-borders .tiny-grid-border-bottom, +.tiny-grid__borders .tiny-grid-checked-borders .tiny-grid-border-top { + height: var(--ti-grid-column-checked-border-width); +} +.tiny-grid__borders .tiny-grid-checked-borders .tiny-grid-border-left, +.tiny-grid__borders .tiny-grid-checked-borders .tiny-grid-border-right { + width: var(--ti-grid-column-checked-border-width); +} +.tiny-grid__borders .tiny-grid-copyed-borders .tiny-grid-border-bottom, +.tiny-grid__borders .tiny-grid-copyed-borders .tiny-grid-border-top { + height: calc(var(--ti-grid-column-checked-border-width) + 1px); +} +.tiny-grid__borders .tiny-grid-copyed-borders .tiny-grid-border-left, +.tiny-grid__borders .tiny-grid-copyed-borders .tiny-grid-border-right { + width: calc(var(--ti-grid-column-checked-border-width) + 1px); +} +.tiny-grid__borders .tiny-grid-copyed-borders > span { + background: repeating-linear-gradient( + 135deg, + transparent, + transparent 3px, + var(--ti-grid-primary-color) 3px, + var(--ti-grid-primary-color) 9px + ); + -webkit-animation: shine 1s infinite linear; + animation: shine 1s infinite linear; +} +.tiny-grid-body__row .tiny-grid-body__column.col__checked { + position: relative; + background-color: var(--ti-grid-column-current-background-color); + border-right-color: var(--ti-grid-column-checked-border-color); + border-bottom-color: var(--ti-grid-column-checked-border-color); +} +.tiny-grid-body__row .tiny-grid-body__column.col__selected { + background-color: var(--ti-grid-light-color); +} +.tiny-grid-body__row .tiny-grid-body__column .tiny-numeric { + width: 100%; +} +@-webkit-keyframes shine { + 0% { + background-position: -1px -1px; + } + 100% { + background-position: -12px -12px; + } +} +@keyframes shine { + 0% { + background-position: -1px -1px; + } + 100% { + background-position: -12px -12px; + } +} +.tiny-grid__footer-wrapper { + margin-top: -1px; + background-color: var(--ti-grid-light-color); +} +.tiny-grid__footer-wrapper.body__wrapper { + overflow-x: auto; +} +.tiny-grid-filter-wrapper { + padding: 0 4px; + vertical-align: middle; + display: inline-block; + line-height: 15px; +} +.tiny-grid-filter-wrapper.is__active .tiny-grid-filter__btn { + fill: var(--ti-grid-primary-hover-color); +} +.tiny-grid-filter-wrapper .tiny-grid-filter__btn { + font-size: var(--ti-common-font-size-base); + fill: #999; + cursor: pointer; + vertical-align: middle; +} +.tiny-grid-filter-wrapper .tiny-grid-filter__btn:hover { + fill: var(--ti-grid-primary-hover-color); +} +.filter__active .tiny-grid-filter-wrapper .tiny-grid-filter__btn { + fill: var(--ti-grid-primary-color); +} +.tiny-grid__filter-wrapper { + display: none; + position: absolute; + min-width: 270px; + border-radius: var(--ti-grid-border-radius); + border: 1px solid var(--ti-grid-popup-border-color); + -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2); + font-size: var(--ti-common-font-size-base); + z-index: 4000; +} +.tiny-grid__filter-wrapper.filter__active { + display: block; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body { + padding: 0; + list-style-type: none; + background-color: var(--ti-grid-light-color); + overflow-x: hidden; + overflow-y: auto; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel { + margin: 0; + width: 100%; + padding: 12px 8px 8px; + border-bottom: solid 1px var(--ti-grid-border-color); +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel.filter-panel__default { + padding: 8px 20px 4px; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel.filter-panel__clear, +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel.filter-panel__default { + padding-left: 0; + padding-right: 0; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__clear + .tiny-grid__filter-option, +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__default + .tiny-grid__filter-option { + cursor: pointer; + padding-left: 16px; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__clear + .tiny-grid__filter-option:hover, +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__default + .tiny-grid__filter-option:hover { + background-color: var(--ti-grid-primary-hover-color); +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__clear + .tiny-grid__filter-option:hover + a, +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__default + .tiny-grid__filter-option:hover + a { + color: var(--ti-grid-light-color); +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel.filter-panel__enum { + padding-top: 4px; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options { + max-height: 170px; + overflow: auto; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options + .tiny-grid__filter-empty { + text-align: center; + line-height: 30px; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options + .tiny-grid__filter-option { + height: 28px; + line-height: 28px; + padding: 0 8px; + max-width: 240px; + width: auto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options + .tiny-grid__filter-option.selected { + background-color: var(--ti-grid-header-background-color); +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options + .tiny-grid__filter-option + svg { + font-size: var(--ti-common-font-size-2); + fill: var(--ti-grid-normal-color); + margin-right: 8px; + outline: 0; + vertical-align: middle; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options + .tiny-grid__filter-option + svg:hover { + fill: var(--ti-grid-primary-hover-color); +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel.filter-panel__enum + .tiny-grid__filter-options + .tiny-grid__filter-option + svg.is-checked { + fill: var(--ti-grid-primary-color); +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel .tiny-grid__filter-option { + margin: 0; + height: 24px; + line-height: 24px; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .tiny-grid__filter-panel .tiny-grid__filter-option a { + color: var(--ti-grid-font-color); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__radios { + margin-bottom: 12px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: distribute; + justify-content: space-around; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__radios + label.tiny-grid-radio { + width: auto; + display: inline-block; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__radios + label.tiny-grid-radio + .tiny-grid-radio__label { + color: var(--ti-grid-font-color); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + width: auto; + max-width: 80%; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__radios + label.tiny-grid-radio + + .tiny-grid-radio { + margin-left: 0; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__radios + label.tiny-grid-radio:nth-child(2) { + text-align: center; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__radios + label.tiny-grid-radio:nth-child(3) { + text-align: right; +} +.tiny-grid__filter-wrapper + .tiny-grid__filter-body + .tiny-grid__filter-panel + .tiny-grid__filter-option.filter-option__btns { + margin: 8px 0 16px; + text-align: center; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .filter-option__input > input { + width: 100%; + border: solid 1px #bdbdbd; + border-radius: var(--ti-grid-border-radius); + outline: 0; + padding: 0 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: inherit; + height: 30px; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-body .filter-option__input > input:focus { + border: 1px solid var(--ti-grid-primary-color); +} +.tiny-grid__filter-wrapper .tiny-grid__filter-footer { + border-top: 1px solid var(--ti-grid-popup-border-color); + padding: 8px; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-footer button { + background-color: transparent; + padding: 0 3px; + border: 0; + font-size: 13px; + color: var(--ti-grid-font-color); + cursor: pointer; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-footer button:focus { + outline: 0; +} +.tiny-grid__filter-wrapper .tiny-grid__filter-footer button:hover { + color: var(--ti-grid-primary-color); +} +.tiny-grid__filter-wrapper .tiny-grid__filter-footer button.is__disabled { + color: var(--ti-grid-column-icon-border-color); + cursor: not-allowed; +} +.tiny-grid-loading { + display: none; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 99; + background-color: var(--ti-grid-loading-background-color); +} +.tiny-grid-loading .tiny-grid-loading__wrap { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.tiny-grid-loading .tiny-grid-loading__wrap.tiny-loading__spinner { + margin-top: 0; +} +.tiny-grid-loading .tiny-grid-loading__round { + width: 46px; + height: 46px; + position: relative; + margin: 0 auto; + background: -webkit-gradient(linear, left bottom, left top, from(transparent), to(transparent)); + background: linear-gradient(to top, transparent, transparent); +} +.tiny-grid-loading .tiny-grid-loading__round span { + display: inline-block; + width: 10px; + height: 10px; + border-radius: 50%; + background: -webkit-gradient(linear, left top, left bottom, from(#000), to(#000)); + background: linear-gradient(#000, #000); + position: absolute; + -webkit-animation: load 1.04s ease infinite; + animation: load 1.04s ease infinite; +} +@-webkit-keyframes load { + 0% { + opacity: 10; + } + 100% { + opacity: 0.1; + } +} +@keyframes load { + 0% { + opacity: 10; + } + 100% { + opacity: 0.1; + } +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(1) { + top: 68%; + left: 68%; + animation-delay: 0s; + -webkit-animation-delay: 0s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(2) { + top: 50%; + right: 0; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + animation-delay: 0.1s; + -webkit-animation-delay: 0.1s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(3) { + top: 10%; + left: 68%; + animation-delay: 0.2s; + -webkit-animation-delay: 0.2s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(5) { + top: 10%; + left: 12%; + animation-delay: 0.4s; + -webkit-animation-delay: 0.4s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(4) { + top: 0; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + animation-delay: 0.3s; + -webkit-animation-delay: 0.3s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(8) { + bottom: 0; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + animation-delay: 0.7s; + -webkit-animation-delay: 0.7s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(6) { + top: 50%; + left: 0; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + animation-delay: 0.5s; + -webkit-animation-delay: 0.5s; +} +.tiny-grid-loading .tiny-grid-loading__round span:nth-child(7) { + top: 68%; + left: 12%; + animation-delay: 0.6s; + -webkit-animation-delay: 0.6s; +} +.tiny-grid .tiny-grid-body__row.row__pending { + color: var(--ti-grid-error-color); + text-decoration: line-through; + cursor: no-drop; +} +.tiny-grid .tiny-grid-body__row.row__pending .tiny-grid-body__column { + position: relative; +} +.tiny-grid .tiny-grid-body__row.row__pending .tiny-grid-body__column:after { + content: ''; + position: absolute; + top: 50%; + left: 0; + width: 100%; + height: 0; + border-bottom: 1px solid var(--ti-grid-error-color); + z-index: 1; +} +.tiny-grid.mark-insert .tiny-grid-body__row.row__new { + background-color: #f2f5fc; +} +.tiny-grid-menu__clild-wrapper, +.tiny-grid-menu__wrapper { + display: none; + position: absolute; + top: 0; + left: 0; + z-index: 5000; + font-size: var(--ti-grid-font-size); + background-color: var(--ti-grid-light-color); + border: 1px solid var(--ti-grid-popup-border-color); + -webkit-box-shadow: 2px 2px 4px -2px rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 4px -2px rgba(0, 0, 0, 0.2); + padding: 0 1px; + color: var(--ti-grid-font-color); + font-family: var(--ti-grid-font-family); + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-grid-menu__clild-wrapper.show, +.tiny-grid-menu__wrapper.show { + display: block; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper { + margin: 0; + padding: 0; + list-style-type: none; + border-bottom: 1px solid var(--ti-grid-border-color); +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper li, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper li, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper li, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper li { + position: relative; + margin: 1px 0; + border: 1px solid transparent; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper li:last-child, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper li:last-child, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper li:last-child, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper li:last-child { + border: 0; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper li.link__active, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper li.link__active, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper li.link__active, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper li.link__active { + color: #2b2b2b; + background-color: #c5c5c5; + border-color: #c5c5c5; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper li.link__disabled .tiny-grid-menu__link, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper li.link__disabled .tiny-grid-menu__link, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper li.link__disabled .tiny-grid-menu__link, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper li.link__disabled .tiny-grid-menu__link { + color: var(--ti-grid-font-color); + cursor: initial; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper li.link__disabled.link__active, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper li.link__disabled.link__active, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper li.link__disabled.link__active, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper li.link__disabled.link__active { + border-color: #c0c1c2; + background-color: #eee; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper li.link__disabled.link__active:hover, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper li.link__disabled.link__active:hover, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper li.link__disabled.link__active:hover, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper li.link__disabled.link__active:hover { + background-color: inherit; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link { + display: block; + padding: 0 30px; + min-width: 120px; + max-width: 180px; + line-height: 26px; + color: var(--ti-grid-font-color); +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix { + position: absolute; + top: 5px; + margin-right: 5px; + font-size: var(--ti-common-font-size-2); +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-prefix { + left: 5px; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-suffix { + right: 5px; +} +.tiny-grid-menu__clild-wrapper + .tiny-grid-menu__clild-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild, +.tiny-grid-menu__clild-wrapper + .tiny-grid-menu__option-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild, +.tiny-grid-menu__wrapper + .tiny-grid-menu__clild-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild, +.tiny-grid-menu__wrapper + .tiny-grid-menu__option-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild { + top: 8px; +} +.tiny-grid-menu__clild-wrapper + .tiny-grid-menu__clild-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild:before, +.tiny-grid-menu__clild-wrapper + .tiny-grid-menu__option-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild:before, +.tiny-grid-menu__wrapper + .tiny-grid-menu__clild-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild:before, +.tiny-grid-menu__wrapper + .tiny-grid-menu__option-wrapper + .tiny-grid-menu__link + .tiny-grid-menu__link-suffix.suffix__haschild:before { + position: absolute; + content: ''; + border: 4px solid transparent; + border-left-color: #727272; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-content, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-content, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-content, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__link .tiny-grid-menu__link-content { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link, +.tiny-grid-menu__clild-wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link, +.tiny-grid-menu__wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link, +.tiny-grid-menu__wrapper .tiny-grid-menu__option-wrapper .tiny-grid-menu__clild-wrapper .tiny-grid-menu__link { + max-width: 180px; + padding: 0 20px 0 30px; +} +.tiny-grid-menu__clild-wrapper { + display: none; + z-index: 5100; + top: 0; + left: 100%; +} +.tiny-grid-custom { + width: 100%; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-head { + white-space: nowrap; + margin: 0; + overflow: hidden; + height: var(--ti-grid-custom-head-height); + width: 100%; + position: relative; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-head ul { + height: var(--ti-grid-custom-head-height); + border-bottom: 1px solid var(--ti-grid-border-color); + list-style: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-head ul li { + float: left; + margin-right: -1px; + cursor: pointer; + line-height: 28px; + padding: 0 20px; + color: var(--ti-grid-font-color); + min-width: 90px; + height: var(--ti-grid-custom-head-height); + line-height: var(--ti-grid-custom-head-height); +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-head ul li.tiny-grid-custom__tabs-selected { + color: var(--ti-grid-primary-color); + border-bottom: 3px solid var(--ti-grid-primary-color); + font-weight: 700; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-body { + overflow-y: auto; + border: 0; + padding: 12px 0; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-body .tabs-body-item .tiny-grid-custom__alert { + position: relative; + border: 1px solid; + border-radius: var(--ti-grid-border-radius); + height: var(--ti-grid-custom-body-list-height); + line-height: var(--ti-grid-custom-body-list-height); + padding-left: 8px; + overflow: hidden; + background: var(--ti-grid-row-hover-background-color); + border-color: #91d5ff; + color: var(--ti-grid-font-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__alert + .tiny-svg { + font-size: var(--ti-common-font-size-3); + fill: var(--ti-grid-primary-color); +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-body .tabs-body-item .tiny-grid-custom__alert p { + display: inline-block; + line-height: 16px; + padding-left: 8px; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid-custom__tabs-body .tabs-body-item .tiny-grid-custom__setting { + border-bottom: 1px solid var(--ti-grid-border-color); + padding: 12px 0 24px; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item { + font-size: var(--ti-grid-font-size); + padding: 10px 8px; + overflow: hidden; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon { + font-size: 0; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .icon { + display: inline-block; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .icon:not(:last-child) { + margin-right: 12px; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg { + font-size: var(--ti-common-font-size-1); + fill: var(--ti-grid-normal-color); + cursor: pointer; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg:hover { + fill: var(--ti-grid-primary-disabled-color); +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.lock, +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.open, +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.sort { + fill: var(--ti-grid-primary-color); +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.lock:hover, +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.open:hover, +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.sort:hover { + fill: var(--ti-grid-primary-hover-color); +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting + .setting-item + .setting-icon + .tiny-svg.is-visible { + visibility: hidden; + pointer-events: none; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting.other-setting { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting.other-setting + .setting-item + span.label { + width: 26%; + display: inline-block; + text-align: right; + padding-right: 24px; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting.other-setting + .setting-item + span.selection { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + display: inline-block; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting.other-setting + .setting-item + span.selection + .tiny-grid-radio { + margin-right: 10px; + margin-left: 0 !important; +} +.tiny-grid-custom + .tiny-grid-custom__tabs + .tiny-grid-custom__tabs-body + .tabs-body-item + .tiny-grid-custom__setting.other-setting + .setting-item + span.selection + .tiny-grid-radio__label { + height: 16px; + line-height: 18px; +} +.tiny-grid-custom .tiny-grid-custom__tabs .tiny-grid__body-wrapper { + max-height: 45vh; + border-bottom: 0; +} +.tiny-grid-custom .tiny-grid-custom__footer { + margin: 12px; + text-align: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-grid-custom-switch { + margin-top: 8px; + padding-bottom: 12px; + border-bottom: 1px solid #d9d9d9; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__title { + margin-bottom: 12px; + font-weight: 400; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__title .tiny-svg { + font-size: var(--ti-common-font-size-3); +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__title .tiny-alert__description { + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__label { + text-align: right; + position: relative; + top: 2px; + padding-right: 3px; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__content { + position: relative; + top: -4px; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__icon-btn { + fill: #1890ff; + font-size: var(--ti-common-font-size-1); + cursor: pointer; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__icon-btn:hover { + fill: #096dd9; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__icon-btn--disabled, +.tiny-grid-custom-switch .tiny-grid-custom-switch__icon-btn--disabled:hover { + fill: #bfbfbf; + cursor: not-allowed; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__icon-btn + .tiny-grid-custom-switch__icon-btn { + margin-left: 12px; +} +.tiny-grid-custom-switch .tiny-grid-custom-switch__icon-btn:first-child { + margin-left: 20px; +} +.tiny-grid-custom-switch__dialog-box .tiny-grid-custom-switch__confirm-btns { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + width: 85%; +} +.tiny-grid-custom-switch__dialog-box .tiny-grid-custom-switch__del-tip { + text-align: center; +} +.tiny-grid-modal__wrapper { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + font-size: var(--ti-grid-font-size); + color: var(--ti-grid-font-color); + font-family: var(--ti-grid-font-family); + -webkit-transition: top 0.4s; + transition: top 0.4s; +} +.tiny-grid-modal__wrapper.active { + display: block; +} +.tiny-grid-modal__wrapper.is__visible.is__mask:before { + background-color: rgba(0, 0, 0, 0.5); +} +.tiny-grid-modal__wrapper.is__visible.type__message .tiny-grid-modal__box { + -webkit-transform: translateY(0); + transform: translateY(0); +} +.tiny-grid-modal__wrapper.is__visible:not(.type__message) .tiny-grid-modal__box:not(.is__drag) { + top: 15vh; + -webkit-transition: top 0.3s ease-in, opacity 0.4s ease-in; + transition: top 0.3s ease-in, opacity 0.4s ease-in; +} +.tiny-grid-modal__wrapper.is__visible .tiny-grid-modal__box { + opacity: 1; + visibility: visible; +} +.tiny-grid-modal__wrapper:not(.lock__view) { + pointer-events: none; +} +.tiny-grid-modal__wrapper.lock__scroll { + overflow: hidden; +} +.tiny-grid-modal__wrapper:not(.lock__scroll) { + overflow: auto; +} +.tiny-grid-modal__wrapper.is__mask:before, +.tiny-grid-modal__wrapper.lock__view:before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; + pointer-events: auto; +} +.tiny-grid-modal__wrapper.is__mask:before { + background-color: rgba(0, 0, 0, 0); +} +.tiny-grid-modal__wrapper.is__animat.is__mask:before { + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; +} +.tiny-grid-modal__wrapper.is__animat.type__message .tiny-grid-modal__box:not(.is__drag) { + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.tiny-grid-modal__wrapper.size__mini, +.tiny-grid-modal__wrapper.size__small { + font-size: var(--ti-grid-font-size); +} +.tiny-grid-modal__wrapper.size__mini .tiny-grid-modal__box, +.tiny-grid-modal__wrapper.size__small .tiny-grid-modal__box { + padding: 6px 0; +} +.tiny-grid-modal__wrapper.size__mini .tiny-grid-modal__body, +.tiny-grid-modal__wrapper.size__small .tiny-grid-modal__body { + padding: 4px 14px 10px 14px; +} +.tiny-grid-modal__wrapper.size__mini .tiny-grid-modal__footer, +.tiny-grid-modal__wrapper.size__small .tiny-grid-modal__footer { + padding: 4px 14px 8px 14px; +} +.tiny-grid-modal__wrapper.size__mini .tiny-grid-modal__header, +.tiny-grid-modal__wrapper.size__small .tiny-grid-modal__header { + font-size: var(--ti-grid-modal-header-font-size); + padding: 6px 30px 8px 14px; +} +.tiny-grid-modal__wrapper.size__mini .tiny-grid-modal__close-btn, +.tiny-grid-modal__wrapper.size__mini .tiny-grid-modal__zoom-btn, +.tiny-grid-modal__wrapper.size__small .tiny-grid-modal__close-btn, +.tiny-grid-modal__wrapper.size__small .tiny-grid-modal__zoom-btn { + font-size: var(--ti-grid-modal-small-btn-font-size); + top: 10px; +} +.tiny-grid-modal__wrapper.type__alert .tiny-grid-modal__body, +.tiny-grid-modal__wrapper.type__confirm .tiny-grid-modal__body, +.tiny-grid-modal__wrapper.type__message .tiny-grid-modal__body { + white-space: normal; + word-wrap: break-word; + word-break: break-all; +} +.tiny-grid-modal__wrapper.type__message { + text-align: center; +} +.tiny-grid-modal__wrapper.type__message .tiny-grid-modal__box { + display: inline-block; + padding: 2px 0; + margin-top: 0; + width: auto; + -webkit-box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1); + -webkit-transform: translateY(-10%); + transform: translateY(-10%); +} +.tiny-grid-modal__wrapper.type__message .tiny-grid-modal__box .tiny-grid-modal__body:after { + content: ''; + display: block; + clear: both; + height: 0; + overflow: hidden; + visibility: hidden; +} +.tiny-grid-modal__wrapper.type__message .tiny-grid-modal__box .tiny-grid-modal__content { + max-width: 800px; + float: left; +} +.tiny-grid-modal__wrapper.type__message .tiny-grid-modal__status-wrapper { + font-size: var(--ti-grid-modal-small-btn-font-size); + padding-right: 10px; +} +.tiny-grid-modal__wrapper.type__alert .tiny-grid-modal__box, +.tiny-grid-modal__wrapper.type__confirm .tiny-grid-modal__box, +.tiny-grid-modal__wrapper.type__modal .tiny-grid-modal__box { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + position: absolute; + left: 50%; + top: 0; + -webkit-box-shadow: var(--ti-grid-modal-box-shadow); + box-shadow: var(--ti-grid-modal-box-shadow); + border: 1px solid var(--ti-grid-modal-border-color); +} +.tiny-grid-modal__wrapper.type__alert .tiny-grid-modal__box .tiny-grid-modal__header, +.tiny-grid-modal__wrapper.type__confirm .tiny-grid-modal__box .tiny-grid-modal__header, +.tiny-grid-modal__wrapper.type__modal .tiny-grid-modal__box .tiny-grid-modal__header { + cursor: move; +} +.tiny-grid-modal__wrapper.type__modal .tiny-grid-modal__body { + overflow: auto; +} +.tiny-grid-modal__wrapper.type__modal .tiny-grid-modal__body .tiny-grid-modal__content { + overflow: auto; +} +.tiny-grid-modal__wrapper.type__alert .tiny-grid-modal__status-wrapper, +.tiny-grid-modal__wrapper.type__confirm .tiny-grid-modal__status-wrapper { + font-size: var(--ti-grid-modal-alert-font-size); + padding: 0 10px 0 2px; +} +.tiny-grid-modal__wrapper.status__info .tiny-grid-modal__status-wrapper { + color: var(--ti-grid-primary-color); +} +.tiny-grid-modal__wrapper.status__question .tiny-grid-modal__status-wrapper, +.tiny-grid-modal__wrapper.status__warning .tiny-grid-modal__status-wrapper { + color: var(--ti-grid-warning-color); +} +.tiny-grid-modal__wrapper.status__success .tiny-grid-modal__status-wrapper { + color: var(--ti-grid-success-color); +} +.tiny-grid-modal__wrapper.status__error .tiny-grid-modal__status-wrapper { + color: var(--ti-grid-error-color); +} +.tiny-grid-modal__wrapper.status__loading .tiny-grid-modal__status-wrapper { + color: var(--ti-grid-modal-loading-color); +} +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__box .tiny-grid-modal__header { + cursor: default; +} +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .sb-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .selb-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .sest-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .st-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .swlb-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .swst-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .wl-resize, +.tiny-grid-modal__wrapper.is__maximize .tiny-grid-modal__resize .wr-resize { + display: none; +} +.tiny-grid-modal__box { + width: 420px; + background-color: var(--ti-grid-modal-box-background-color); + border: 1px solid var(--ti-grid-modal-box-border-color); + font-size: var(--ti-grid-modal-header-font-size); + text-align: left; + pointer-events: auto; + visibility: hidden; + opacity: 0; +} +.tiny-grid-modal__box.is__drag { + cursor: move; +} +.tiny-grid-modal__box.is__drag .tiny-grid-modal__body:after, +.tiny-grid-modal__box.is__drag .tiny-grid-modal__footer:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.tiny-grid-modal__box.is__drag .tiny-grid-modal__body { + overflow: hidden; +} +.tiny-grid-modal__box.is__drag .tiny-grid-modal__body .tiny-grid-modal__content { + overflow: hidden; +} +.tiny-grid-modal__status-wrapper { + -ms-flex-negative: 0; + flex-shrink: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-grid-modal__status-icon { + font-style: normal; +} +.tiny-grid-modal__content { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.tiny-grid-modal__body, +.tiny-grid-modal__footer, +.tiny-grid-modal__header { + position: relative; +} +.tiny-grid-modal__body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + padding: 24px; +} +.tiny-grid-modal__header { + -ms-flex-negative: 0; + flex-shrink: 0; + font-size: var(--ti-grid-modal-header-font-size); + font-weight: 700; + padding: 9px 40px 10px 24px; + border-bottom: 1px solid var(--ti-grid-border-color); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tiny-grid-modal__close-btn, +.tiny-grid-modal__zoom-btn { + font-size: var(--ti-grid-modal-header-font-size); + position: absolute; + right: 24px; + top: 13px; + z-index: 1; + color: var(--ti-grid-modal-btn-color); + fill: var(--ti-grid-modal-btn-color); + cursor: pointer; +} +.tiny-grid-modal__close-btn:hover, +.tiny-grid-modal__zoom-btn:hover { + color: var(--ti-grid-primary-color); + fill: var(--ti-grid-primary-color); +} +.tiny-grid-modal__zoom-btn { + right: 44px; + border-color: #c0c4cc; +} +.tiny-grid-modal__zoom-btn:hover { + border-color: #606266; +} +.tiny-grid-modal__footer { + -ms-flex-negative: 0; + flex-shrink: 0; + text-align: center; + padding: 0 24px 24px; +} +.tiny-grid-modal__resize .sb-resize, +.tiny-grid-modal__resize .selb-resize, +.tiny-grid-modal__resize .sest-resize, +.tiny-grid-modal__resize .st-resize, +.tiny-grid-modal__resize .swlb-resize, +.tiny-grid-modal__resize .swst-resize, +.tiny-grid-modal__resize .wl-resize, +.tiny-grid-modal__resize .wr-resize { + position: absolute; + z-index: 100; +} +.tiny-grid-modal__resize .wl-resize, +.tiny-grid-modal__resize .wr-resize { + width: 8px; + height: 100%; + top: 0; + cursor: w-resize; +} +.tiny-grid-modal__resize .wl-resize { + left: -3px; +} +.tiny-grid-modal__resize .wr-resize { + right: -3px; +} +.tiny-grid-modal__resize .selb-resize, +.tiny-grid-modal__resize .sest-resize, +.tiny-grid-modal__resize .swlb-resize, +.tiny-grid-modal__resize .swst-resize { + width: 10px; + height: 10px; + z-index: 101; +} +.tiny-grid-modal__resize .sest-resize, +.tiny-grid-modal__resize .swst-resize { + top: -8px; +} +.tiny-grid-modal__resize .selb-resize, +.tiny-grid-modal__resize .swlb-resize { + bottom: -8px; +} +.tiny-grid-modal__resize .sest-resize, +.tiny-grid-modal__resize .swlb-resize { + cursor: sw-resize; +} +.tiny-grid-modal__resize .selb-resize, +.tiny-grid-modal__resize .swst-resize { + cursor: se-resize; +} +.tiny-grid-modal__resize .swlb-resize, +.tiny-grid-modal__resize .swst-resize { + left: -8px; +} +.tiny-grid-modal__resize .selb-resize, +.tiny-grid-modal__resize .sest-resize { + right: -8px; +} +.tiny-grid-modal__resize .sb-resize, +.tiny-grid-modal__resize .st-resize { + width: 100%; + height: 8px; + left: 0; + cursor: s-resize; +} +.tiny-grid-modal__resize .st-resize { + top: -3px; +} +.tiny-grid-modal__resize .sb-resize { + bottom: -3px; +} +.tiny-grid-toolbar { + padding: 12px 0; +} +.tiny-grid-toolbar:after { + content: ''; + display: block; + clear: both; + height: 0; + overflow: hidden; + visibility: hidden; +} +.tiny-grid-toolbar svg { + fill: var(--ti-grid-primary-color); + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-toolbar.is__loading { + position: relative; +} +.tiny-grid-toolbar.is__loading:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + background-color: var(--ti-grid-loading-background-color); +} +.tiny-grid-toolbar.size__mini, +.tiny-grid-toolbar.size__small { + padding: 8px 0; +} +.tiny-grid-toolbar.size__medium .tiny-grid-custom__setting-btn, +.tiny-grid-toolbar.size__medium .tiny-grid-refresh__btn { + font-size: 17px; +} +.tiny-grid-toolbar.size__small .tiny-grid-custom__setting-btn, +.tiny-grid-toolbar.size__small .tiny-grid-refresh__btn { + font-size: 15px; +} +.tiny-grid-toolbar.size__mini .tiny-grid-custom__setting-btn, +.tiny-grid-toolbar.size__mini .tiny-grid-refresh__btn { + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-toolbar .tiny-grid-custom__wrapper, +.tiny-grid-toolbar .tiny-grid-fullscreen__wrapper, +.tiny-grid-toolbar .tiny-grid-refresh__wrapper, +.tiny-grid-toolbar .tiny-grid-tools__wrapper { + float: right; + width: 30px; + height: 30px; + line-height: 30px; + border: solid 1px var(--ti-grid-border-color); + border-radius: 3px; + text-align: center; + margin: 0 4px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-grid-toolbar .tiny-grid-custom__wrapper { + position: relative; +} +.tiny-grid-toolbar .tiny-grid-custom__wrapper.is__active .tiny-grid-custom__setting-btn { + border-color: var(--ti-grid-primary-color); +} +.tiny-grid-toolbar .tiny-grid-custom__wrapper.is__active .tiny-grid-custom__option-wrapper { + display: block; +} +.tiny-grid-toolbar .tiny-grid-custom__setting-btn, +.tiny-grid-toolbar .tiny-grid-fullscreen__btn, +.tiny-grid-toolbar .tiny-grid-refresh__btn { + font-size: var(--ti-common-font-size-2); + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tiny-grid-toolbar .tiny-grid-custom__setting-btn:hover, +.tiny-grid-toolbar .tiny-grid-fullscreen__btn:hover, +.tiny-grid-toolbar .tiny-grid-refresh__btn:hover { + border-color: var(--ti-grid-primary-color); +} +.tiny-grid-toolbar .tiny-grid-custom__setting-btn > i, +.tiny-grid-toolbar .tiny-grid-fullscreen__btn > i, +.tiny-grid-toolbar .tiny-grid-refresh__btn > i { + display: block; + color: var(--ti-grid-primary-color); + line-height: 28px; +} +.tiny-grid-toolbar .tiny-grid-custom__option-wrapper { + display: none; + position: absolute; + right: 0; + text-align: left; + background-color: var(--ti-grid-light-color); + z-index: 19; + max-height: 210px; + overflow: auto; + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.tiny-grid-toolbar .tiny-grid-custom__option-wrapper .tiny-grid-custom__option { + padding: 5px 5px; + border: 1px solid var(--ti-grid-border-color); + border-radius: 2px; + font-weight: 700; + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-toolbar .tiny-grid-custom__option-wrapper .tiny-grid-custom__option > .tiny-grid-checkbox { + display: block; + padding: 5px; + margin: 0; + max-width: 180px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-grid__select-toolbar { + position: absolute; + background-color: var(--ti-base-color-light); +} +.tiny-grid__select-toolbar .tiny-grid-toolbar { + padding: 2px 0 2px 6px; +} +.tiny-grid-checkbox { + display: inline-block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; +} +.tiny-grid-checkbox.size__mini, +.tiny-grid-checkbox.size__small { + font-size: var(--ti-grid-font-size); +} +.tiny-grid-checkbox.size__mini > input + .tiny-grid-checkbox__icon, +.tiny-grid-checkbox.size__small > input + .tiny-grid-checkbox__icon { + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-checkbox + .tiny-grid-checkbox { + margin-left: 10px; +} +.tiny-grid-checkbox > input { + display: none; +} +.tiny-grid-checkbox > input + .tiny-grid-checkbox__icon { + position: relative; + display: inline-block; + width: 1em; + height: 1em; + border: 1px solid var(--ti-grid-border-color); + background-color: #fff; + vertical-align: middle; + border-radius: var(--ti-grid-border-radius); + font-size: var(--ti-common-font-size-2); +} +.tiny-grid-checkbox > input + .tiny-grid-checkbox__icon:before { + content: ''; + position: absolute; +} +.tiny-grid-checkbox > input + .tiny-grid-checkbox__icon:hover { + border-color: var(--ti-grid-primary-hover-color); +} +.tiny-grid-checkbox > input + .tiny-grid-checkbox__icon + .tiny-grid-checkbox__label { + display: none; +} +.tiny-grid-checkbox > input + .tiny-grid-checkbox__icon > svg.icon-checked-sur { + display: none; +} +.tiny-grid-checkbox > input:checked + .tiny-grid-checkbox__icon { + border: none; +} +.tiny-grid-checkbox > input:checked + .tiny-grid-checkbox__icon + .tiny-grid-checkbox__label { + color: var(--ti-grid-primary-color); +} +.tiny-grid-checkbox > input:checked + .tiny-grid-checkbox__icon > svg { + display: block; + fill: var(--ti-grid-primary-color); +} +.tiny-grid-checkbox.is__indeterminate > input:not(:checked) + .tiny-grid-checkbox__icon { + border: none; +} +.tiny-grid-checkbox.is__indeterminate > input:not(:checked) + .tiny-grid-checkbox__icon > svg { + fill: var(--ti-grid-primary-color); +} +.tiny-grid-checkbox.is__disabled { + cursor: not-allowed; +} +.tiny-grid-checkbox.is__disabled > input + .tiny-grid-checkbox__icon { + border-color: var(--ti-grid-border-color); + background-color: var(--ti-grid-input-disabled-color); +} +.tiny-grid-checkbox.is__disabled > input + .tiny-grid-checkbox__icon:before { + border-color: var(--ti-grid-input-disabled-color); +} +.tiny-grid-checkbox.is__disabled > input + .tiny-grid-checkbox__icon + .tiny-grid-checkbox__label { + color: var(--ti-grid-border-color); +} +.tiny-grid-checkbox.is__disabled > input:checked + .tiny-grid-checkbox__icon { + border-color: var(--ti-grid-disabled-color); + background-color: var(--ti-grid-disabled-color); +} +.tiny-grid-checkbox .tiny-grid-checkbox__label { + padding-left: 5px; + vertical-align: middle; + display: inline-block; +} +.tiny-grid-radio { + display: inline-block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; +} +.tiny-grid-radio.size__mini, +.tiny-grid-radio.size__small { + font-size: var(--ti-grid-font-size); +} +.tiny-grid-radio.size__mini > input + .tiny-grid-radio__icon, +.tiny-grid-radio.size__small > input + .tiny-grid-radio__icon { + font-size: var(--ti-common-font-size-1); +} +.tiny-grid-radio.is__disabled { + cursor: not-allowed; +} +.tiny-grid-radio.is__disabled > input + .tiny-grid-radio__icon { + border-color: var(--ti-grid-border-color); + background-color: var(--ti-grid-input-disabled-color); +} +.tiny-grid-radio.is__disabled > input + .tiny-grid-radio__icon:before { + border-color: var(--ti-grid-input-disabled-color); + background-color: var(--ti-grid-input-disabled-color); +} +.tiny-grid-radio.is__disabled > input + .tiny-grid-radio__icon + .tiny-grid-radio__label { + color: var(--ti-grid-border-color); +} +.tiny-grid-radio.is__disabled > input + .tiny-grid-radio__icon:hover { + border-color: var(--ti-grid-border-color); +} +.tiny-grid-radio.is__disabled > input:checked + .tiny-grid-radio__icon { + border-color: var(--ti-grid-disabled-color); + background-color: var(--ti-grid-disabled-color); +} +.tiny-grid-radio > input { + display: none; +} +.tiny-grid-radio > input + .tiny-grid-radio__icon { + position: relative; + display: inline-block; + width: 1em; + height: 1em; + border: 1px solid var(--ti-grid-border-color); + background-color: #fff; + vertical-align: middle; + border-radius: 50%; + font-size: var(--ti-common-font-size-2); +} +.tiny-grid-radio > input + .tiny-grid-radio__icon:hover { + border-color: var(--ti-grid-primary-hover-color); +} +.tiny-grid-radio > input:checked + .tiny-grid-radio__icon { + background-color: var(--ti-grid-primary-color); + border-color: var(--ti-grid-primary-color); +} +.tiny-grid-radio > input:checked + .tiny-grid-radio__icon:before { + content: ''; + position: absolute; + border-width: 0.15em; + border-style: solid; + border-color: #fff; + background-color: #fff; + border-radius: 50%; + height: 0.4em; + width: 0.4em; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.tiny-grid-radio > input:checked + .tiny-grid-radio__icon + .tiny-grid-radio__label { + color: var(--ti-grid-primary-color); +} +.tiny-grid-radio .tiny-grid-radio__label { + padding-left: 5px; + vertical-align: middle; + display: inline-block; +} +.tiny-grid-radio + .tiny-grid-radio { + margin-left: 10px; +} +.tiny-grid-input__wrapper { + font-size: var(--ti-common-font-size-base); + font-size: var(--ti-grid-font-size, 12px); + display: inline-block; +} +.tiny-grid-input__wrapper.type__textarea { + width: 100%; +} +.tiny-grid-input__wrapper .tiny-grid-input, +.tiny-grid-input__wrapper .tiny-grid-textarea { + border-radius: 4px; + outline: 0; + padding: 4px 8px; + width: 100%; + color: var(--ti-grid-font-color); + border: 1px solid var(--ti-grid-border-color); + background-color: #fff; +} +.tiny-grid-input__wrapper .tiny-grid-input:focus, +.tiny-grid-input__wrapper .tiny-grid-textarea:focus { + border: 1px solid var(--ti-grid-primary-color); +} +.tiny-grid-input__wrapper .tiny-grid-input[disabled], +.tiny-grid-input__wrapper .tiny-grid-textarea[disabled] { + cursor: not-allowed; + background-color: var(--ti-grid-input-disabled-color); +} +.tiny-grid-input__wrapper .tiny-grid-input { + height: 32px; +} +.tiny-grid-input__wrapper .tiny-grid-textarea { + height: 100%; +} +.tiny-grid-input__wrapper.size__medium .tiny-grid-input { + height: 36px; +} +.tiny-grid-input__wrapper.size__small .tiny-grid-input { + height: 32px; +} +.tiny-grid-input__wrapper.size__mini .tiny-grid-input { + height: 28px; +} +.tiny-grid-button { + position: relative; + text-align: center; + background-color: var(--ti-grid-light-color); + outline: 0; + font-size: var(--ti-grid-font-size); + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.tiny-grid-button.is__disabled { + color: var(--ti-grid-primary-disabled-color); +} +.tiny-grid-button.is__disabled:not(.is__loading) { + cursor: no-drop; +} +.tiny-grid-button:not(.is__disabled) { + color: var(--ti-grid-primary-color); + cursor: pointer; +} +.tiny-grid-button.is__loading:before { + content: ''; + position: absolute; + left: -1px; + top: -1px; + right: -1px; + bottom: -1px; + border-radius: inherit; + background-color: hsla(0, 0%, 100%, 0.35); + pointer-events: none; +} +.tiny-grid-button.type__text { + text-decoration: none; + border: 0; + background-color: transparent; +} +.tiny-grid-button.type__text:not(.is__disabled):hover { + color: var(--ti-grid-primary-hover-color); +} +.tiny-grid-button.type__button { + padding: 0 12px; + line-height: 28px; + border: 1px solid var(--ti-grid-border-color); + border-radius: 2px; +} +.tiny-grid-button.type__button.theme__primary { + color: var(--ti-grid-light-color); + border-color: var(--ti-grid-primary-color); + background-color: var(--ti-grid-primary-color); +} +.tiny-grid-button.type__button.theme__primary:not(.is__disabled):hover { + color: var(--ti-grid-light-color); + background-color: var(--ti-grid-primary-hover-color); + border-color: var(--ti-grid-primary-hover-color); +} +.tiny-grid-button.type__button.theme__primary:not(.is__disabled):active { + color: var(--ti-grid-light-color); + background-color: var(--ti-grid-primary-active-color); + border-color: var(--ti-grid-primary-active-color); +} +.tiny-grid-button.type__button:not(.theme__primary):not(.is__disabled):hover { + color: var(--ti-grid-primary-color); + border-color: var(--ti-grid-primary-color); +} +.tiny-grid-button.type__button:not(.theme__primary):not(.is__disabled):active { + color: var(--ti-grid-primary-active-color); + border-color: var(--ti-grid-primary-active-color); +} +.tiny-grid-button.type__button.size__medium { + padding: 0 14px; + line-height: 28px; +} +.tiny-grid-button.type__button.size__small { + padding: 0 12px; + line-height: 26px; +} +.tiny-grid-button.type__button.size__mini { + padding: 0 10px; + line-height: 24px; +} +.tiny-grid-button.size__mini, +.tiny-grid-button.size__small { + font-size: var(--ti-common-font-size-base); +} +.tiny-grid-button + .tiny-grid-button, +.tiny-grid-button + .tiny-grid-button__dropdown { + margin-left: 8px; +} +.tiny-grid-button + .tiny-grid-button.size__medium, +.tiny-grid-button + .tiny-grid-button__dropdown.size__medium { + margin-left: 8px; +} +.tiny-grid-button + .tiny-grid-button.size__small, +.tiny-grid-button + .tiny-grid-button__dropdown.size__small { + margin-left: 6px; +} +.tiny-grid-button + .tiny-grid-button.size__mini, +.tiny-grid-button + .tiny-grid-button__dropdown.size__mini { + margin-left: 4px; +} +.tiny-grid-button__loading-icon { + margin-right: 5px; +} +.tiny-grid-button__dropdown, +.tiny-grid-button__wrapper { + display: inline-block; +} +.tiny-grid-button__dropdown { + position: relative; +} +.tiny-grid-button__dropdown + .tiny-grid-button, +.tiny-grid-button__dropdown + .tiny-grid-button__dropdown { + margin-left: 8px; +} +.tiny-grid-button__dropdown + .tiny-grid-button.size__medium, +.tiny-grid-button__dropdown + .tiny-grid-button__dropdown.size__medium { + margin-left: 8px; +} +.tiny-grid-button__dropdown + .tiny-grid-button.size__small, +.tiny-grid-button__dropdown + .tiny-grid-button__dropdown.size__small { + margin-left: 6px; +} +.tiny-grid-button__dropdown + .tiny-grid-button.size__mini, +.tiny-grid-button__dropdown + .tiny-grid-button__dropdown.size__mini { + margin-left: 4px; +} +.tiny-grid-button__dropdown.is__active > .tiny-grid-button.theme__primary { + color: var(--ti-grid-light-color); + background-color: var(--ti-grid-primary-hover-color); + border-color: var(--ti-grid-primary-hover-color); +} +.tiny-grid-button__dropdown.is__active > .tiny-grid-button:not(.is__disabled):not(.theme__primary) { + color: var(--ti-grid-primary-color); + border-color: var(--ti-grid-primary-color); +} +.tiny-grid-button__dropdown.is__active .tiny-grid-button__dropdown-wrapper { + display: block; +} +.tiny-grid-button__dropdown.is__active .tiny-grid-button__dropdown-arrow { + -webkit-transform: rotate(315deg); + transform: rotate(315deg); +} +.tiny-grid-button__dropdown.is__active .tiny-grid-button__dropdown-arrow.tiny-grid-icon__arrow-bottom { + margin-top: -2px; +} +.tiny-grid-button__dropdown .tiny-grid-button__dropdown-arrow { + font-size: var(--ti-common-font-size-base); + margin-left: 5px; + -webkit-transition: -webkit-transform 0.2s ease-in-out; + transition: -webkit-transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out; +} +.tiny-grid-button__dropdown .tiny-grid-button__dropdown-wrapper { + display: none; + position: absolute; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + margin-top: 5px; + z-index: 100; + padding: 5px; + background-color: var(--ti-grid-light-color); + border-radius: 4px; + border: 1px solid var(--ti-grid-border-color); + -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2); + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2); +} +.tiny-grid-button__dropdown .tiny-grid-button__dropdown-wrapper > .tiny-grid-button { + margin: 0; + display: block; + width: 100%; + border: 0; +} +.tiny-grid-button__dropdown .tiny-grid-button__dropdown-wrapper > .tiny-grid-button.type__text { + padding: 2px 8px; +} +.tiny-grid-button__wrapper .tiny-input { + width: 270px; +} +.tiny-grid-button__wrapper .tiny-button, +.tiny-grid-button__wrapper .tiny-input { + vertical-align: middle; +} +.tiny-grid__tooltip-wrapper { + display: none; + position: absolute; + top: -100%; + left: -100%; + font-size: var(--ti-grid-font-size); + max-width: 400px; + border-radius: 4px; + padding: 8px 12px; + white-space: normal; + word-break: break-word; + -webkit-box-shadow: 2px 2px 4px -2px rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 4px -2px rgba(0, 0, 0, 0.2); + color: var(--ti-grid-font-color); + font-family: var(--ti-grid-font-family); + pointer-events: none; + z-index: 4000; +} +.tiny-grid__tooltip-wrapper.is__visible { + display: block; +} +.tiny-grid__tooltip-wrapper.is__arrow .tiny-grid__tooltip-arrow { + display: block; +} +.tiny-grid__tooltip-wrapper.placement__top .tiny-grid__tooltip-arrow { + bottom: -12px; +} +.tiny-grid__tooltip-wrapper.placement__top .tiny-grid__tooltip-arrow:before { + top: -7px; +} +.tiny-grid__tooltip-wrapper.placement__bottom .tiny-grid__tooltip-arrow { + top: -12px; +} +.tiny-grid__tooltip-wrapper.placement__bottom .tiny-grid__tooltip-arrow:before { + top: -4px; +} +.tiny-grid__tooltip-wrapper.theme__light { + background-color: var(--ti-grid-tooltip-light-background-color); + border: 1px solid var(--ti-grid-border-color); +} +.tiny-grid__tooltip-wrapper.theme__light.placement__top .tiny-grid__tooltip-arrow { + border-top-color: var(--ti-grid-border-color); +} +.tiny-grid__tooltip-wrapper.theme__light.placement__top .tiny-grid__tooltip-arrow:before { + border-top-color: var(--ti-grid-tooltip-light-background-color); +} +.tiny-grid__tooltip-wrapper.theme__light.placement__bottom .tiny-grid__tooltip-arrow { + border-bottom-color: var(--ti-grid-border-color); +} +.tiny-grid__tooltip-wrapper.theme__light.placement__bottom .tiny-grid__tooltip-arrow:before { + border-bottom-color: var(--ti-grid-tooltip-light-background-color); +} +.tiny-grid__tooltip-wrapper.theme__dark { + background: var(--ti-grid-tooltip-dark-background-color); + color: var(--ti-grid-light-color); +} +.tiny-grid__tooltip-wrapper.theme__dark.placement__top .tiny-grid__tooltip-arrow { + border-top-color: var(--ti-grid-tooltip-dark-background-color); +} +.tiny-grid__tooltip-wrapper.theme__dark.placement__top .tiny-grid__tooltip-arrow:before { + border-top-color: var(--ti-grid-tooltip-dark-background-color); +} +.tiny-grid__tooltip-wrapper.theme__dark.placement__bottom .tiny-grid__tooltip-arrow { + border-bottom-color: var(--ti-grid-tooltip-dark-background-color); +} +.tiny-grid__tooltip-wrapper.theme__dark.placement__bottom .tiny-grid__tooltip-arrow:before { + border-bottom-color: var(--ti-grid-tooltip-dark-background-color); +} +.tiny-grid__tooltip-wrapper .tiny-grid__tooltip-arrow { + display: none; + position: absolute; + border-color: transparent; + border-width: 6px; + border-style: solid; + left: 50%; +} +.tiny-grid__tooltip-wrapper .tiny-grid__tooltip-arrow:before { + content: ''; + position: absolute; + border-color: transparent; + border-width: 5px; + border-style: solid; + left: -5px; +} +.tiny-grid__tooltip-wrapper.tiny-grid__valid-error { + background-color: var(--ti-grid-error-color); + color: var(--ti-grid-light-color); +} +.tiny-grid { + --ti-grid-font-family: Helvetica, Arial, 'Microsoft YaHei', sans-serif; + --ti-grid-font-color: var(--ti-base-color-info-normal); + --ti-grid-light-color: var(--ti-base-color-light); + --ti-grid-error-color: var(--ti-base-color-bg-8); + --ti-grid-success-color: var(--ti-base-color-success-normal); + --ti-grid-warning-color: var(--ti-base-color-warning-normal); + --ti-grid-disabled-color: var(--ti-base-color-bg-5); + --ti-grid-normal-color: var(--ti-base-color-placeholder); + --ti-grid-font-size: var(--ti-common-font-size-base); + --ti-grid-border-color: var(--ti-common-color-line-dividing); + --ti-grid-border-radius: var(--ti-common-border-radius-normal); + --ti-grid-header-background-color: var(--ti-common-color-bg-white-emphasize); + --ti-grid-primary-color: var(--ti-base-color-brand-6); + --ti-grid-primary-hover-color: var(--ti-base-color-brand-5); + --ti-grid-primary-active-color: var(--ti-base-color-primary-active); + --ti-grid-primary-disabled-color: #b1b1b1; + --ti-grid-header-column-height: var(--ti-base-size-height-small); + --ti-grid-medium-column-height: 52px; + --ti-grid-default-column-height: 42px; + --ti-grid-small-column-height: 40px; + --ti-grid-mini-column-height: 30px; + --ti-grid-custom-head-height: 40px; + --ti-grid-custom-body-list-height: var(--ti-base-size-height-small); + --ti-icon-fill-active-hover: #fff; + --ti-grid-input-disabled-color: #f5f5f5; + --ti-grid-popup-border-color: #ebeef5; + --ti-grid-row-odd-background-color: #fff; + --ti-grid-row-striped-background-color: #fafafa; + --ti-grid-row-hover-background-color: var(--ti-base-color-hover-background); + --ti-grid-column-hover-background-color: #d7effb; + --ti-grid-column-current-background-color: var(--ti-base-color-hover-background); + --ti-grid-column-icon-border-color: var(--ti-base-color-common-1); + --ti-grid-column-checked-border-width: 2px; + --ti-grid-column-checked-border-color: #d4d4d4; + --ti-grid-loading-background-color: rgba(0, 0, 0, 0.2); + --ti-grid-tooltip-dark-background-color: #303133; + --ti-grid-tooltip-light-background-color: var(--ti-base-color-light); + --ti-grid-modal-loading-color: #78b1eb; + --ti-grid-modal-alert-font-size: 22px; + --ti-grid-modal-header-font-size: var(--ti-common-font-size-1); + --ti-grid-modal-small-btn-font-size: var(--ti-common-font-size-2); + --ti-grid-modal-box-background-color: var(--ti-base-color-light); + --ti-grid-modal-box-border-color: #ebeef5; + --ti-grid-modal-btn-color: #c4c4c4; + --ti-grid-modal-box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); + --ti-grid-modal-border-color: rgba(0, 0, 0, 0.2); + --ti-table-td-padding: 2px 8px; + --ti-table-th-spacing-line-color: var(--ti-common-color-text-white); + --ti-grid-header-icon-font-size: var(--ti-common-font-size-2); + --ti-table-nodata-td-bg-img-url: url('data:image/png;base64,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'); +} +.tiny-hrapprover { + --ti-hrapprover-error-border-color: var(--ti-base-color-bg-8); + --ti-hrapprover-table-color: var(--ti-base-color-info-normal); + --ti-hrapprover-table-font-size: var(--ti-common-font-size-base); + --ti-hrapprover-tr-bgcolor: #fafafa; + --ti-hrapprover-tr-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-hrapprover-tr-odd-bgcolor: var(--ti-base-color-light); + --ti-hrapprover-th-height: var(--ti-base-size-height-small); + --ti-hrapprover-thead-border-color: var(--ti-base-color-border); + --ti-hrapprover-thead-bgcolor: #f1f1f1; +} +.tiny-hrapprover .tiny-hrapprover__list { + height: 180px; + margin-top: 10px; + overflow: auto; +} +.tiny-hrapprover .tiny-hrapprover__error { + border: solid 1px var(--ti-hrapprover-error-border-color); +} +.tiny-hrapprover table tbody tr { + color: var(--ti-hrapprover-table-color); + background: var(--ti-hrapprover-tr-bgcolor); +} +.tiny-hrapprover table tbody tr:hover { + background: var(--ti-hrapprover-tr-hover-bgcolor); +} +.tiny-hrapprover table tbody tr:nth-child(odd) { + background: var(--ti-hrapprover-tr-odd-bgcolor); +} +.tiny-hrapprover table tr { + display: table-row; + vertical-align: inherit; + border-color: inherit; +} +.tiny-hrapprover table th { + border-left: none; + padding: 2px 0 2px 8px; + height: var(--ti-hrapprover-th-height); +} +.tiny-hrapprover table td { + padding: 2px 0 2px 8px; + height: var(--ti-hrapprover-th-height); + font-size: var(--ti-hrapprover-table-font-size); +} +.tiny-hrapprover table thead { + border-bottom: 1px solid var(--ti-hrapprover-thead-border-color); + text-align: left; + background: var(--ti-hrapprover-thead-bgcolor); + color: var(--ti-hrapprover-table-color); +} +.tiny-hrapprover table thead th { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: var(--ti-hrapprover-table-font-size); + color: var(--ti-hrapprover-table-color); +} +.tiny-hrapprover .tiny-input__suffix .tiny-input__icon { + vertical-align: middle; +} +.tiny-image { + --ti-image-error-font-size: var(--ti-common-font-size-1); + --ti-image-error-color: #c0c4cc; + --ti-image-error-background: #f5f7fa; + position: relative; + display: inline-block; + overflow: hidden; +} +.tiny-image__inner { + vertical-align: top; +} +.tiny-image__inner-center { + position: relative; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + display: block; +} +.tiny-image__error { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: var(--ti-image-error-font-size); + color: var(--ti-image-error-color); + vertical-align: middle; +} +.tiny-image__preview { + cursor: pointer; +} +.tiny-image__error, +.tiny-image__placeholder { + background: var(--ti-image-error-background); +} +.tiny-image__error, +.tiny-image__inner, +.tiny-image__placeholder { + width: 100%; + height: 100%; +} +.viewer-fade-enter-active { + -webkit-animation: viewer-fade-in 0.3s; + animation: viewer-fade-in 0.3s; +} +.viewer-fade-leave-active { + -webkit-animation: viewer-fade-out 0.3s; + animation: viewer-fade-out 0.3s; +} +@-webkit-keyframes viewer-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes viewer-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@-webkit-keyframes viewer-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +@keyframes viewer-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +.tiny-image { + --ti-image-viewer-color: var(--ti-base-color-light); + --ti-image-viewer-actions-inner-color: var(--ti-base-color-light); + --ti-image-viewer-close-font-size: var(--ti-common-font-size-4); + --ti-image-viewer-close-bgcolor: #606266; + --ti-image-viewer-close-top: 40px; + --ti-image-viewer-close-right: 40px; + --ti-image-viewer-close-width: 40px; + --ti-image-viewer-close-height: 40px; + --ti-image-viewer-close-bgcolor-hover: #606266; + --ti-image-viewer-actions-border-radius: 22px; + --ti-image-viewer-actions-inner-font-size: 23px; + --ti-image-viewer-actions-width: 282px; + --ti-image-viewer-actions-height: 44px; + --ti-image-viewer-actions-bottom: 30px; + --ti-image-viewer-actions-inner-justify-content: space-around; + --ti-image-viewer-next-font-size: var(--ti-common-font-size-5); + --ti-image-viewer-next-width: 44px; + --ti-image-viewer-next-height: 44px; + --ti-image-viewer-mask-background: none; + --ti-image-viewer-btn-opacity: 0.8; + --ti-image-viewer-mask-bgcolor: #000; +} +.tiny-image .tiny-image-viewer__wrapper { + background: var(--ti-image-viewer-mask-background); + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.tiny-image .tiny-image-viewer__btn { + position: absolute; + z-index: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + border-radius: 50%; + opacity: var(--ti-image-viewer-btn-opacity); + -webkit-box-sizing: border-box; + box-sizing: border-box; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-image .tiny-image-viewer__btn svg { + fill: var(--ti-image-viewer-color); +} +.tiny-image .tiny-image-viewer__close { + top: var(--ti-image-viewer-close-top); + right: var(--ti-image-viewer-close-right); + width: var(--ti-image-viewer-close-width); + height: var(--ti-image-viewer-close-height); + font-size: var(--ti-image-viewer-close-font-size); + background-color: var(--ti-image-viewer-close-bgcolor); +} +.tiny-image .tiny-image-viewer__close:hover { + cursor: pointer; + background-color: var(--ti-image-viewer-close-bgcolor-hover); +} +.tiny-image .tiny-image-viewer__canvas { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-image .tiny-image-viewer__actions { + left: 50%; + bottom: var(--ti-image-viewer-actions-bottom); + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + width: var(--ti-image-viewer-actions-width); + height: var(--ti-image-viewer-actions-height); + padding: 0 23px; + background-color: var(--ti-image-viewer-close-bgcolor); + border-radius: var(--ti-image-viewer-actions-border-radius); +} +.tiny-image .tiny-image-viewer__actions-inner { + width: 100%; + height: 100%; + text-align: justify; + cursor: default; + font-size: var(--ti-image-viewer-actions-inner-font-size); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: var(--ti-image-viewer-actions-inner-justify-content); + -ms-flex-pack: var(--ti-image-viewer-actions-inner-justify-content); + justify-content: var(--ti-image-viewer-actions-inner-justify-content); +} +.tiny-image .tiny-image-viewer__actions-inner svg { + fill: var(--ti-image-viewer-actions-inner-color); + margin-right: 20px; +} +.tiny-image .tiny-image-viewer__actions-inner svg:hover { + cursor: pointer; +} +.tiny-image .tiny-image-viewer__next, +.tiny-image .tiny-image-viewer__prev { + top: 50%; + width: var(--ti-image-viewer-next-width); + height: var(--ti-image-viewer-next-height); + font-size: var(--ti-image-viewer-next-font-size); + background-color: var(--ti-image-viewer-close-bgcolor); +} +.tiny-image .tiny-image-viewer__next:hover, +.tiny-image .tiny-image-viewer__prev:hover { + cursor: pointer; + background-color: var(--ti-image-viewer-close-bgcolor-hover); +} +.tiny-image .tiny-image-viewer__prev { + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + left: 40px; +} +.tiny-image .tiny-image-viewer__next { + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + right: 40px; + text-indent: 2px; +} +.tiny-image .tiny-image-viewer__mask { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + opacity: 0.5; + background: var(--ti-image-viewer-mask-bgcolor); +} +.tiny-transition-icon-out-in-enter-active { + -webkit-animation: bounce-in 0.3s; + animation: bounce-in 0.3s; +} +.tiny-transition-icon-out-in-leave-active { + animation: bounce-in 0.3s reverse; +} +.tiny-transition-icon-scale-in-enter-active { + -webkit-animation: scale-in 0.3s; + animation: scale-in 0.3s; +} +.tiny-transition-icon-scale-in-leave-active { + animation: scale-in 0.3s reverse; +} +@-webkit-keyframes bounce-in { + 0% { + -webkit-transform: translateY(-50%) scale(0); + transform: translateY(-50%) scale(0); + } + 50% { + -webkit-transform: translateY(-50%) scale(1.2); + transform: translateY(-50%) scale(1.2); + } + 100% { + -webkit-transform: translateY(-50%) scale(1); + transform: translateY(-50%) scale(1); + } +} +@keyframes bounce-in { + 0% { + -webkit-transform: translateY(-50%) scale(0); + transform: translateY(-50%) scale(0); + } + 50% { + -webkit-transform: translateY(-50%) scale(1.2); + transform: translateY(-50%) scale(1.2); + } + 100% { + -webkit-transform: translateY(-50%) scale(1); + transform: translateY(-50%) scale(1); + } +} +@-webkit-keyframes scale-in { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + -webkit-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes scale-in { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + -webkit-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +.tiny-textarea { + --ti-input-color: var(--ti-base-color-info-normal); + --ti-input-bgcolor: var(--ti-base-color-light); + --ti-input-font-size: var(--ti-common-font-size-base); + --ti-input-height: var(--ti-base-size-height-normal); + --ti-input-border-radius: var(--ti-common-border-radius-normal); + --ti-input-border-color: var(--ti-base-color-border); + --ti-input-hover-border-color: var(--ti-base-color-border-hover); + --ti-input-active-border-color: var(--ti-base-color-brand-5); + --ti-input-placeholder-color: var(--ti-base-color-placeholder); + --ti-input-disabled-color: var(--ti-base-color-placeholder); + --ti-input-medium-height: var(--ti-base-size-height-medium); + --ti-input-small-height: var(--ti-base-size-height-small); + --ti-input-mini-height: var(--ti-base-size-height-mini); + --ti-input-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-input-disabled-border-color: var(--ti-common-color-line-disabled); + --ti-input-exceed-color: var(--ti-base-color-bg-8); + --ti-input-clear-color: #c0c4cc; + --ti-input-icon-font-size: var(--ti-common-font-size-1); + --ti-input-icon-close-color: #bfbfbf; + --ti-input-clear-color-hover: var(--ti-base-color-brand-6); + position: relative; + display: inline-block; + width: 100%; + vertical-align: bottom; + font-size: var(--ti-input-font-size); +} +.tiny-textarea.is-disabled .tiny-textarea__inner { + background-color: var(--ti-input-disabled-bgcolor); + border-color: var(--ti-input-border-color); + color: var(--ti-input-disabled-color); + cursor: not-allowed; +} +.tiny-textarea.is-disabled .tiny-textarea__inner::-moz-placeholder { + color: var(--ti-input-placeholder-color); + opacity: 1; +} +.tiny-textarea.is-disabled .tiny-textarea__inner:-ms-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea.is-disabled .tiny-textarea__inner::-webkit-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea.is-disabled .tiny-textarea__inner::-ms-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea.is-disabled .tiny-textarea__inner::placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea.is-exceed .tiny-textarea__inner { + border-color: var(--ti-input-exceed-color); +} +.tiny-textarea.is-exceed .tiny-input__count { + color: var(--ti-input-exceed-color); +} +.tiny-textarea .tiny-input__count { + color: #909399; + background: var(--ti-input-bgcolor); + font-size: var(--ti-input-font-size); + position: absolute; + bottom: 5px; + right: 16px; +} +.tiny-textarea__inner { + display: block; + width: 100%; + min-height: 60px; + min-height: calc(var(--ti-input-height, 30px) * 2); + color: var(--ti-input-color); + border: 1px solid var(--ti-input-border-color); + border-radius: var(--ti-input-border-radius); + background: var(--ti-input-bgcolor); + padding: 8px; + line-height: 1.5; + font-size: inherit; + resize: vertical; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-textarea__inner::-moz-placeholder { + color: var(--ti-input-placeholder-color); + opacity: 1; +} +.tiny-textarea__inner:-ms-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea__inner::-webkit-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea__inner::-ms-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea__inner::placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-textarea__inner:hover { + border-color: var(--ti-input-hover-border-color); +} +.tiny-textarea__inner:focus { + border-color: var(--ti-input-active-border-color); +} +.tiny-textarea__inner:focus, +.tiny-textarea__inner:hover { + outline: 0; +} +.tiny-input { + --ti-input-color: var(--ti-base-color-info-normal); + --ti-input-bgcolor: var(--ti-base-color-light); + --ti-input-font-size: var(--ti-common-font-size-base); + --ti-input-height: var(--ti-base-size-height-normal); + --ti-input-border-radius: var(--ti-common-border-radius-normal); + --ti-input-border-color: var(--ti-base-color-border); + --ti-input-hover-border-color: var(--ti-base-color-border-hover); + --ti-input-active-border-color: var(--ti-base-color-brand-5); + --ti-input-placeholder-color: var(--ti-base-color-placeholder); + --ti-input-disabled-color: var(--ti-base-color-placeholder); + --ti-input-medium-height: var(--ti-base-size-height-medium); + --ti-input-small-height: var(--ti-base-size-height-small); + --ti-input-mini-height: var(--ti-base-size-height-mini); + --ti-input-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-input-disabled-border-color: var(--ti-common-color-line-disabled); + --ti-input-exceed-color: var(--ti-base-color-bg-8); + --ti-input-clear-color: #c0c4cc; + --ti-input-icon-font-size: var(--ti-common-font-size-1); + --ti-input-icon-close-color: #bfbfbf; + --ti-input-clear-color-hover: var(--ti-base-color-brand-6); + position: relative; + font-size: var(--ti-input-font-size); + display: inline-table; + width: 100%; +} +.tiny-input::-webkit-scrollbar { + z-index: 11; + width: 6px; +} +.tiny-input::-webkit-scrollbar:horizontal { + height: 6px; +} +.tiny-input::-webkit-scrollbar-thumb { + border-radius: 5px; + width: 6px; + background: #b4bccc; +} +.tiny-input::-webkit-scrollbar-corner { + background: #fff; +} +.tiny-input::-webkit-scrollbar-track { + background: #fff; +} +.tiny-input::-webkit-scrollbar-track-piece { + background: #fff; + width: 6px; +} +.tiny-input.is-exceed .tiny-input__suffix .tiny-input__count { + color: var(--ti-input-exceed-color); +} +.tiny-input.is-disabled .tiny-input__inner { + cursor: not-allowed; + border: 1px solid var(--ti-input-disabled-border-color); + color: var(--ti-input-disabled-color); + background: var(--ti-input-disabled-bgcolor); +} +.tiny-input.is-disabled .tiny-input__inner::-moz-placeholder { + color: #999; + opacity: 1; +} +.tiny-input.is-disabled .tiny-input__inner:-ms-input-placeholder { + color: #999; +} +.tiny-input.is-disabled .tiny-input__inner::-webkit-input-placeholder { + color: #999; +} +.tiny-input.is-disabled .tiny-input__inner::-ms-input-placeholder { + color: #999; +} +.tiny-input.is-disabled .tiny-input__inner::placeholder { + color: #999; +} +.tiny-input.is-disabled .tiny-input__icon { + cursor: not-allowed; +} +.tiny-input.is-disabled .tiny-input__icon.tiny-svg, +.tiny-input.is-disabled .tiny-input__icon.tiny-svg:hover { + fill: var(--ti-input-disabled-color); +} +.tiny-input.is-disabled .tiny-input__prefix .tiny-svg, +.tiny-input.is-disabled .tiny-input__prefix .tiny-svg:hover, +.tiny-input.is-disabled .tiny-input__suffix .tiny-svg, +.tiny-input.is-disabled .tiny-input__suffix .tiny-svg:hover { + fill: var(--ti-input-disabled-color); +} +.tiny-input.is-exceed .tiny-input__inner { + border-color: var(--ti-input-exceed-color); +} +.tiny-input .tiny-input__clear { + font-size: var(--ti-input-icon-font-size); + cursor: pointer; + -webkit-transition: color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-input .tiny-input__clear, +.tiny-input .tiny-input__clear:hover { + fill: var(--ti-input-icon-close-color); +} +.tiny-input .tiny-input__count { + height: 100%; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #909399; + font-size: var(--ti-input-font-size); +} +.tiny-input .tiny-input__count .tiny-input__count-inner { + background: var(--ti-input-bgcolor); + line-height: initial; + display: inline-block; +} +.tiny-input__inner { + width: 100%; + border: 1px solid var(--ti-input-border-color); + border-radius: var(--ti-input-border-radius); + color: var(--ti-input-color); + background: var(--ti-input-bgcolor); + font-size: inherit; + height: var(--ti-input-height); + line-height: var(--ti-input-height); + padding: 0 8px; + outline: 0; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-input__inner::-moz-placeholder { + color: var(--ti-input-placeholder-color); + opacity: 1; +} +.tiny-input__inner:-ms-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-input__inner::-webkit-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-input__inner::-ms-input-placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-input__inner::placeholder { + color: var(--ti-input-placeholder-color); +} +.tiny-input__inner:active, +.tiny-input__inner:focus, +.tiny-input__inner:hover { + outline: 0; + border-color: var(--ti-input-hover-border-color); +} +.tiny-input__inner::-ms-clear { + display: none; + width: 0; + height: 0; +} +.tiny-input__prefix, +.tiny-input__suffix { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + -webkit-transition: all 0.3s; + transition: all 0.3s; + text-align: center; + color: var(--ti-input-border-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-input.is-active .tiny-input__inner, +.tiny-input__inner:focus { + border-color: var(--ti-input-active-border-color); + outline: 0; +} +.tiny-input__suffix { + right: 8px; + -webkit-transition: all 0.3s; + transition: all 0.3s; + pointer-events: none; +} +.tiny-input__suffix:hover { + cursor: pointer; +} +.tiny-input__suffix-inner { + pointer-events: all; + font-size: var(--ti-common-font-size-1); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-input__prefix { + left: 8px; + -webkit-transition: all 0.3s; + transition: all 0.3s; + font-size: var(--ti-input-icon-font-size); +} +.tiny-input__prefix > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-input__icon { + height: 100%; + line-height: var(--ti-input-height); + text-align: center; + -webkit-transition: all 0.3s; + transition: all 0.3s; + font-size: var(--ti-input-icon-font-size); + fill: var(--ti-input-hover-border-color); +} +.tiny-input__icon:hover { + fill: var(--ti-input-active-border-color); +} +.tiny-input__icon:after { + content: ''; + height: 100%; + width: 0; + display: inline-block; + vertical-align: middle; +} +.tiny-input__icon .svg-operationfaild, +.tiny-input__icon .svg-operationfaild:hover { + fill: var(--ti-input-icon-close-color); +} +.tiny-input__validateIcon { + pointer-events: none; +} +.tiny-input-suffix .tiny-input__inner { + padding-right: 30px; + padding-left: 8px; +} +.tiny-input-prefix .tiny-input__inner { + padding-left: 30px; + padding-right: 28px; +} +.tiny-input-medium .tiny-input__inner { + height: var(--ti-input-medium-height); + line-height: var(--ti-input-medium-height); +} +.tiny-input-medium .tiny-input__suffix { + line-height: calc(var(--ti-input-medium-height) - 2px); +} +.tiny-input-small .tiny-input__inner { + height: var(--ti-input-small-height); + line-height: var(--ti-input-small-height); +} +.tiny-input-small .tiny-input__suffix { + line-height: calc(var(--ti-input-small-height) - 2px); +} +.tiny-input-mini .tiny-input__inner { + height: var(--ti-input-mini-height); + line-height: var(--ti-input-mini-height); +} +.tiny-input-mini .tiny-input__suffix { + line-height: calc(var(--ti-input-mini-height) - 2px); +} +.tiny-input-group { + --ti-input-color: var(--ti-base-color-info-normal); + --ti-input-bgcolor: var(--ti-base-color-light); + --ti-input-font-size: var(--ti-common-font-size-base); + --ti-input-height: var(--ti-base-size-height-normal); + --ti-input-border-radius: var(--ti-common-border-radius-normal); + --ti-input-border-color: var(--ti-base-color-border); + --ti-input-hover-border-color: var(--ti-base-color-border-hover); + --ti-input-active-border-color: var(--ti-base-color-brand-5); + --ti-input-placeholder-color: var(--ti-base-color-placeholder); + --ti-input-disabled-color: var(--ti-base-color-placeholder); + --ti-input-medium-height: var(--ti-base-size-height-medium); + --ti-input-small-height: var(--ti-base-size-height-small); + --ti-input-mini-height: var(--ti-base-size-height-mini); + --ti-input-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-input-disabled-border-color: var(--ti-common-color-line-disabled); + --ti-input-exceed-color: var(--ti-base-color-bg-8); + --ti-input-clear-color: #c0c4cc; + --ti-input-icon-font-size: var(--ti-common-font-size-1); + --ti-input-icon-close-color: #bfbfbf; + --ti-input-clear-color-hover: var(--ti-base-color-brand-6); + line-height: normal; + display: inline-table; + width: 100%; + border-collapse: separate; + border-spacing: 0; +} +.tiny-input-group > .tiny-input__inner { + vertical-align: middle; + display: table-cell; +} +.tiny-input-group__append, +.tiny-input-group__prepend { + background-color: var(--ti-input-disabled-bgcolor); + color: var(--ti-input-placeholder-color); + border: 1px solid var(--ti-input-border-color); + border-radius: var(--ti-input-border-radius); + padding: 0 20px; + width: 1px; + vertical-align: middle; + display: table-cell; + position: relative; + white-space: nowrap; +} +.tiny-input-group__append:focus, +.tiny-input-group__prepend:focus { + outline: 0; +} +.tiny-input-group__append .tiny-button, +.tiny-input-group__append .tiny-select, +.tiny-input-group__prepend .tiny-button, +.tiny-input-group__prepend .tiny-select { + display: inline-block; + margin: -10px -20px; +} +.tiny-input-group__append .tiny-button, +.tiny-input-group__append .tiny-input, +.tiny-input-group__prepend .tiny-button, +.tiny-input-group__prepend .tiny-input { + font-size: inherit; +} +.tiny-input-group__append button.tiny-button, +.tiny-input-group__append div.tiny-select .tiny-input__inner, +.tiny-input-group__append div.tiny-select:hover .tiny-input__inner, +.tiny-input-group__prepend button.tiny-button, +.tiny-input-group__prepend div.tiny-select .tiny-input__inner, +.tiny-input-group__prepend div.tiny-select:hover .tiny-input__inner { + border-color: transparent; + background-color: transparent; + color: inherit; + border-top: 0; + border-bottom: 0; +} +.tiny-input-group__append .tiny-select .tiny-input.is-focus .tiny-input__inner, +.tiny-input-group__prepend .tiny-select .tiny-input.is-focus .tiny-input__inner { + border-color: transparent; +} +.tiny-input-group-prepend .tiny-input__inner, +.tiny-input-group__append { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.tiny-input-group-append .tiny-input__suffix { + top: calc(50% - 7px); +} +.tiny-input-group-append .tiny-input__inner, +.tiny-input-group__prepend { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.tiny-input-group__prepend { + border-right: 0; +} +.tiny-input-group__append { + border-left: 0; +} +.tiny-icon-loading { + font-size: var(--ti-common-font-size-1); + line-height: 1; + vertical-align: text-top; + -webkit-animation: rotating 2s linear infinite; + animation: rotating 2s linear infinite; +} +@keyframes rotating { + 0% { + -webkit-transform: rotateZ(0); + transform: rotateZ(0); + } + 100% { + -webkit-transform: rotateZ(360deg); + transform: rotateZ(360deg); + } +} +.tiny-ip-address { + --ti-ip-address-normal-height: var(--ti-base-size-height-normal); + --ti-ip-address-normal-color: var(--ti-base-color-info-normal); + --ti-ip-address-icon-color: var(--ti-base-color-info-normal); + --ti-ip-address-normal-disabled-color: var(--ti-base-color-placeholder); + --ti-ip-address-normal-border-color: var(--ti-base-color-border); + --ti-ip-address-normal-background: var(--ti-base-color-light); + --ti-ip-address-radius: var(--ti-common-border-radius-normal); + --ti-ip-address-font-size: var(--ti-common-font-size-base); + --ti-ip-address-border-hover-color: var(--ti-base-color-brand-6); + --ti-ip-address-disabled-background: var(--ti-common-color-bg-disabled); + --ti-ip-address-disabled-border: var(--ti-common-color-line-disabled); + width: 270px; + max-width: 100%; + outline: 0; + display: inline-table; + text-align: left; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-ip-address__input { + position: relative; + padding: 0; + width: 100%; + height: var(--ti-ip-address-normal-height); + border: 1px solid var(--ti-ip-address-normal-border-color); + color: var(--ti-ip-address-normal-color); + border-radius: var(--ti-ip-address-radius); + background: var(--ti-ip-address-normal-background); + font-size: var(--ti-ip-address-font-size); + padding: 0 8px; + display: block; + white-space: nowrap; + background-image: none; + -ms-user-select: auto; + -webkit-user-select: auto; + -o-user-select: auto; + -moz-user-select: auto; + user-select: auto; + -webkit-transition: border 0.3s; + transition: border 0.3s; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-ip-address__input.readonly, +.tiny-ip-address__input[readonly] { + cursor: not-allowed; + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-ip-address__input.readonly.active, +.tiny-ip-address__input.readonly:active, +.tiny-ip-address__input.readonly:focus, +.tiny-ip-address__input.readonly:hover, +.tiny-ip-address__input.readonly[active], +.tiny-ip-address__input[readonly].active, +.tiny-ip-address__input[readonly]:active, +.tiny-ip-address__input[readonly]:focus, +.tiny-ip-address__input[readonly]:hover, +.tiny-ip-address__input[readonly][active] { + border-color: var(--ti-ip-address-border-hover-color); +} +.tiny-ip-address__input::-moz-placeholder { + color: var(--ti-ip-address-normal-disabled-color); + opacity: 1; +} +.tiny-ip-address__input:-ms-input-placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input::-webkit-input-placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input::-ms-input-placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input::placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input:hover { + border: 1px solid var(--ti-ip-address-border-hover-color); + color: var(--ti-ip-address-normal-color); +} +.tiny-ip-address__input:hover::-moz-placeholder { + color: var(--ti-ip-address-normal-disabled-color); + opacity: 1; +} +.tiny-ip-address__input:hover:-ms-input-placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input:hover::-webkit-input-placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input:hover::-ms-input-placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input:hover::placeholder { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input.active, +.tiny-ip-address__input:active, +.tiny-ip-address__input:focus, +.tiny-ip-address__input[active] { + border: 1px solid var(--ti-ip-address-border-hover-color); + color: var(--ti-ip-address-normal-color); +} +.tiny-ip-address__input:focus::-moz-placeholder { + color: #d9d9d9; + opacity: 1; +} +.tiny-ip-address__input:focus:-ms-input-placeholder { + color: #d9d9d9; +} +.tiny-ip-address__input:focus::-webkit-input-placeholder { + color: #d9d9d9; +} +.tiny-ip-address__input:focus::-ms-input-placeholder { + color: #d9d9d9; +} +.tiny-ip-address__input:focus::placeholder { + color: #d9d9d9; +} +.tiny-ip-address__input.disabled, +.tiny-ip-address__input[disabled] { + cursor: not-allowed; + pointer-events: none; + border: 1px solid var(--ti-ip-address-disabled-border); + color: var(--ti-ip-address-normal-disabled-color); + background: var(--ti-ip-address-disabled-background); + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-ip-address__input.disabled .tiny-svg, +.tiny-ip-address__input[disabled] .tiny-svg { + fill: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input li { + float: left; + overflow: hidden; + width: 25%; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-ip-address__input li > input { + border: none; + text-align: center; + outline: 0; + background: 0 0; + color: var(--ti-ip-address-normal-color); + width: calc(100% - 12px); + float: left; + height: calc(var(--ti-ip-address-normal-height) - 2px); + line-height: calc(var(--ti-ip-address-normal-height) - 2px); + padding: 0; +} +.tiny-ip-address__input li > input.active, +.tiny-ip-address__input li > input:active, +.tiny-ip-address__input li > input:focus, +.tiny-ip-address__input li > input[active] { + color: var(--ti-ip-address-normal-color); +} +.tiny-ip-address__input li > input:hover { + color: var(--ti-ip-address-normal-color); +} +.tiny-ip-address__input li > input.disabled, +.tiny-ip-address__input li > input[disabled] { + color: var(--ti-ip-address-normal-disabled-color); +} +.tiny-ip-address__input li svg { + vertical-align: middle; + fill: var(--ti-ip-address-icon-color); +} +.tiny-ip-address__input li:last-child > svg { + display: none; +} +.tiny-ip-address__input li:last-child > input { + width: 100%; +} +.tiny-ip-address__input li:only-child { + width: 100%; +} +.tiny-ip-address__input li:only-child > input { + width: 100%; + text-align: left; + padding: 0 8px; +} +.tiny-link { + --ti-link-font-size: var(--ti-common-font-size-1); + --ti-link-font-weight: var(--ti-common-font-weight-5); + --ti-link-border-color: var(--ti-base-color-brand-6); + --ti-link-default-color: #606266; + --ti-link-default-border-color: var(--ti-base-color-brand-6); + --ti-link-default-hover-color: var(--ti-base-color-brand-7); + --ti-link-default-disabled-color: #c0c4cc; + --ti-link-primary-color: var(--ti-base-color-brand-6); + --ti-link-primary-border-color: var(--ti-base-color-brand-6); + --ti-link-primary-hover-color: var(--ti-base-color-brand-5); + --ti-link-primary-disabled-color: #a0cfff; + --ti-link-danger-color: var(--ti-base-color-bg-8); + --ti-link-danger-border-color: var(--ti-base-color-bg-8); + --ti-link-danger-hover-color: var(--ti-base-color-bg-7); + --ti-link-danger-disabled-color: var(--ti-base-color-bg-5); + --ti-link-success-color: var(--ti-base-color-success-normal); + --ti-link-success-border-color: var(--ti-base-color-success-normal); + --ti-link-success-hover-color: var(--ti-base-color-success-hover); + --ti-link-success-disabled-color: var(--ti-base-color-bg-5); + --ti-link-warning-color: var(--ti-base-color-warning-normal); + --ti-link-warning-border-color: var(--ti-base-color-warning-normal); + --ti-link-warning-hover-color: var(--ti-base-color-warning-hover); + --ti-link-warning-disabled-color: var(--ti-base-color-bg-5); + --ti-link-info-color: var(--ti-base-color-info-normal); + --ti-link-info-border-color: var(--ti-base-color-info-normal); + --ti-link-info-hover-color: var(--ti-base-color-info-hover); + --ti-link-info-disabled-color: var(--ti-base-color-bg-5); + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + vertical-align: middle; + position: relative; + text-decoration: none; + outline: 0; + cursor: pointer; + padding: 0; + font-size: var(--ti-link-font-size); + font-weight: var(--ti-link-font-weight); +} +.tiny-link.is-underline:hover:after { + content: ''; + position: absolute; + left: 0; + right: 0; + height: 0; + bottom: 0; + border-bottom: 1px solid var(--ti-link-border-color); +} +.tiny-link.is-disabled { + cursor: not-allowed; +} +.tiny-link.tiny-link--default { + color: var(--ti-link-default-color); + fill: var(--ti-link-default-color); +} +.tiny-link.tiny-link--default.is-underline:hover:after, +.tiny-link.tiny-link--default:after { + border-color: var(--ti-link-default-border-color); +} +.tiny-link.tiny-link--default:hover { + color: var(--ti-link-default-hover-color); + fill: var(--ti-link-default-hover-color); + text-decoration: none; +} +.tiny-link.tiny-link--default.is-disabled { + color: var(--ti-link-default-disabled-color); + fill: var(--ti-link-default-disabled-color); +} +.tiny-link.tiny-link--primary { + color: var(--ti-link-primary-color); + fill: var(--ti-link-primary-color); +} +.tiny-link.tiny-link--primary.is-underline:hover:after, +.tiny-link.tiny-link--primary:after { + border-color: var(--ti-link-primary-border-color); +} +.tiny-link.tiny-link--primary:hover { + color: var(--ti-link-primary-hover-color); + fill: var(--ti-link-primary-hover-color); + text-decoration: none; +} +.tiny-link.tiny-link--primary.is-disabled { + color: var(--ti-link-primary-disabled-color); + fill: var(--ti-link-primary-disabled-color); +} +.tiny-link.tiny-link--danger { + color: var(--ti-link-danger-color); + fill: var(--ti-link-danger-color); +} +.tiny-link.tiny-link--danger.is-underline:hover:after, +.tiny-link.tiny-link--danger:after { + border-color: var(--ti-link-danger-border-color); +} +.tiny-link.tiny-link--danger:hover { + color: var(--ti-link-danger-hover-color); + fill: var(--ti-link-danger-hover-color); + text-decoration: none; +} +.tiny-link.tiny-link--danger.is-disabled { + color: var(--ti-link-danger-disabled-color); + fill: var(--ti-link-danger-disabled-color); +} +.tiny-link.tiny-link--success { + color: var(--ti-link-success-color); + fill: var(--ti-link-success-color); +} +.tiny-link.tiny-link--success.is-underline:hover:after, +.tiny-link.tiny-link--success:after { + border-color: var(--ti-link-success-border-color); +} +.tiny-link.tiny-link--success:hover { + color: var(--ti-link-success-hover-color); + fill: var(--ti-link-success-hover-color); + text-decoration: none; +} +.tiny-link.tiny-link--success.is-disabled { + color: var(--ti-link-success-disabled-color); + fill: var(--ti-link-success-disabled-color); +} +.tiny-link.tiny-link--warning { + color: var(--ti-link-warning-color); + fill: var(--ti-link-warning-color); +} +.tiny-link.tiny-link--warning.is-underline:hover:after, +.tiny-link.tiny-link--warning:after { + border-color: var(--ti-link-warning-border-color); +} +.tiny-link.tiny-link--warning:hover { + color: var(--ti-link-warning-hover-color); + fill: var(--ti-link-warning-hover-color); + text-decoration: none; +} +.tiny-link.tiny-link--warning.is-disabled { + color: var(--ti-link-warning-disabled-color); + fill: var(--ti-link-warning-disabled-color); +} +.tiny-link.tiny-link--info { + color: var(--ti-link-info-color); + fill: var(--ti-link-info-color); +} +.tiny-link.tiny-link--info.is-underline:hover:after, +.tiny-link.tiny-link--info:after { + border-color: var(--ti-link-info-border-color); +} +.tiny-link.tiny-link--info:hover { + color: var(--ti-link-info-hover-color); + fill: var(--ti-link-info-hover-color); + text-decoration: none; +} +.tiny-link.tiny-link--info.is-disabled { + color: var(--ti-link-info-disabled-color); + fill: var(--ti-link-info-disabled-color); +} +.tiny-link-menu { + --ti-link-menu-nav-item-color: var(--ti-base-color-brand-6); + --ti-link-menu-nav-item-border-color: #c4c4c4; + --ti-link-menu-btn-color: rgba(24, 144, 255, 0.8); + --ti-link-menu-btn-bgcolor: var(--ti-base-color-light); + --ti-link-menu-input-height: var(--ti-base-size-height-normal); + --ti-link-menu-input-font-size: var(--ti-common-font-size-base); + --ti-link-menu-input-color: var(--ti-base-color-info-normal); + --ti-link-menu-input-border-color: var(--ti-base-color-border); + --ti-link-menu-input-border-radius: var(--ti-common-border-radius-normal); + --ti-link-menu-tree-node-color: var(--ti-common-color-text-disabled); +} +.tiny-link-menu__nav .tiny-link-menu__nav-item { + color: var(--ti-link-menu-nav-item-color); + font-size: var(--ti-common-font-size-1); + border-right: 1px solid var(--ti-link-menu-nav-item-border-color); + padding: 0 8px; + line-height: 1; + display: inline-block; + background: 0; + white-space: nowrap; + text-decoration: none; + outline: 0; + text-align: center; + cursor: pointer; +} +.tiny-link-menu__nav .tiny-link-menu__nav-item .tiny-svg { + fill: var(--ti-link-menu-nav-item-color); + margin-right: 4px; +} +.tiny-link-menu__nav .tiny-link-menu__nav-item span { + line-height: 1; + vertical-align: middle; +} +.tiny-link-menu__nav .tiny-link-menu__btn { + color: var(--ti-link-menu-btn-color); + background: var(--ti-link-menu-btn-bgcolor); + padding: 0 8px; + line-height: 1; + outline: 0; + text-align: center; + border: none; + cursor: pointer; +} +.tiny-link-menu__nav .tiny-link-menu__btn .tiny-svg { + fill: var(--ti-link-menu-nav-item-color); + font-size: var(--ti-common-font-size-3); +} +.tiny-link-menu__dialog-btn { + text-align: center; +} +.tiny-link-menu .tiny-input { + width: 270px; + margin-bottom: 5px; +} +.tiny-link-menu .tiny-input .tiny-input__inner { + height: var(--ti-link-menu-input-height); + line-height: var(--ti-link-menu-input-height); + font-size: var(--ti-link-menu-input-font-size); + color: var(--ti-link-menu-input-color); + background: var(--ti-link-menu-btn-bgcolor); + border: 1px solid var(--ti-link-menu-input-border-color); + border-radius: var(--ti-link-menu-input-border-radius); + padding: 0 8px; + display: block; + white-space: nowrap; + -webkit-user-select: auto; + -moz-user-select: auto; + -ms-user-select: auto; + user-select: auto; + -webkit-transition: border 0.3s; + transition: border 0.3s; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-link-menu .tiny-button:last-child { + color: var(--ti-link-menu-nav-item-color); + background-color: var(--ti-link-menu-btn-bgcolor); + border-color: var(--ti-link-menu-input-border-color); +} +.tiny-link-menu .tiny-tree .tiny-tree-node .tiny-checkbox { + -webkit-transform: translateY(1px); + transform: translateY(1px); +} +.tiny-link-menu .tiny-tree .tiny-tree-node .tree-node-body { + display: block; + text-decoration: none; +} +.tiny-link-menu .tiny-tree .tiny-tree-node .tree-node-body > .tiny-svg { + margin-left: 4px; +} +.tiny-link-menu .tiny-tree .tiny-tree-node .tree-node-name { + color: var(--ti-link-menu-tree-node-color); + font-size: var(--ti-link-menu-input-font-size); + border-radius: var(--ti-link-menu-input-border-radius); + padding-left: 4px; + font-weight: 700; + vertical-align: middle; +} +.tiny-link-menu .tiny-tree .tiny-tree-node.is-focusable .tree-node-name { + color: var(--ti-link-menu-input-color); +} +.tiny-link-menu .tiny-tree.tiny-link-menu__overflow .tree-node { + width: calc(100% - 36px); +} +.tiny-link-menu .tiny-tree.tiny-link-menu__overflow .tree-node-name { + width: 100%; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tiny-tree-node__content { + height: auto; + padding: 2px 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tiny-tree-node__content .tiny-tree-node__expand-icon { + -webkit-transform: translateY(-3px); + transform: translateY(-3px); +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tiny-tree-node__content .tiny-tree-node__expand-icon.expanded { + -webkit-transform: translateY(-3px) rotate(90deg); + transform: translateY(-3px) rotate(90deg); +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tiny-tree-node__content .tree-node { + width: 100%; +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tree-node-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + text-decoration: none; +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tree-node-body .tiny-svg { + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-transform: translateY(2px); + transform: translateY(2px); +} +.tiny-link-menu .tiny-tree.tiny-link-menu__wrap .tree-node-name { + display: inline-block; + white-space: normal; + line-height: normal; + word-break: break-word; + -webkit-transform: translateY(-2px); + transform: translateY(-2px); +} +.tiny-loading { + --ti-loading-text-color: var(--ti-base-color-brand-6); + --ti-loading-mask-bgcolor: rgba(255, 255, 255, 0.9); + --ti-loading-text-font-size: var(--ti-common-font-size-1); + --ti-loading-spinner-height: 42px; + --ti-loading-spinner-width: 42px; + --ti-loading-fullscreen-height: 50px; + --ti-loading-fullscreen-width: 50px; +} +.tiny-loading__mask { + position: absolute; + z-index: 2000; + background-color: var(--ti-loading-mask-bgcolor); + margin: 0; + top: 0; + right: 0; + bottom: 0; + left: 0; + -webkit-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.tiny-loading__mask.is-fullscreen { + position: fixed; +} +.tiny-loading__mask.is-fullscreen .tiny-loading__spinner { + margin-top: -25px; +} +.tiny-loading__mask.is-fullscreen .tiny-loading__spinner .circular { + height: var(--ti-loading-fullscreen-height); + width: var(--ti-loading-fullscreen-width); +} +.tiny-loading__spinner { + top: 50%; + margin-top: -21px; + width: 100%; + text-align: center; + position: absolute; +} +.tiny-loading__spinner .tiny-loading__text { + color: var(--ti-loading-text-color); + margin: 3px 0; + font-size: var(--ti-loading-text-font-size); +} +.tiny-loading__spinner .circular { + height: var(--ti-loading-spinner-height); + width: var(--ti-loading-spinner-width); + -webkit-animation: loading-rotate 2s linear infinite; + animation: loading-rotate 2s linear infinite; +} +.tiny-loading__spinner .path { + -webkit-animation: loading-dash 1.5s ease-in-out infinite; + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: var(--ti-loading-text-color); + stroke-linecap: round; +} +.tiny-loading__spinner svg { + fill: var(--ti-loading-text-color); +} +.tiny-loading__parent-relative { + position: relative !important; +} +.tiny-loading__parent-hidden { + overflow: hidden !important; +} +.tiny-loading-fade-enter, +.tiny-loading-fade-leave-active { + opacity: 0; +} +@keyframes loading-rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px; + } +} +.tiny-icon-loading { + font-size: var(--ti-common-font-size-1); + line-height: 1; + vertical-align: text-top; + -webkit-animation: rotating 2s linear infinite; + animation: rotating 2s linear infinite; +} +@keyframes rotating { + 0% { + -webkit-transform: rotateZ(0); + transform: rotateZ(0); + } + 100% { + -webkit-transform: rotateZ(360deg); + transform: rotateZ(360deg); + } +} +.tiny-logout { + cursor: pointer; + display: inline; +} +.tiny-menu.menu-hor { + --ti-menubar-title-font-size: var(--ti-common-font-size-base-normal); + --ti-menubar-title-color: var(--ti-base-color-light); + --ti-menubar-li-height: var(--ti-common-size-12x); + --ti-menubar-menu-height: var(--ti-base-size-height-large); + --ti-menubar-menu-font-size: var(--ti-common-font-size-1); + --ti-menubar-submenu-normal-color: var(--ti-base-color-info-normal); + --ti-menubar-submenu-hover-color: var(--ti-base-color-hover-background); + --ti-menubar-submenu-active-color: var(--ti-base-color-selected-background); + --ti-menubar-submenu-li-height: var(--ti-common-size-10x); + --ti-menubar-background-normal: var(--ti-base-color-navigation-background); + --ti-menubar-background-active: #474c5e; + --ti-menubar-dropdown-border-color: #c9ccda; + --ti-menubar-dropdown-hover-border-color: #585f7f; + --ti-menubar-dropdown-hover-background: #191b25; + margin-bottom: 0; + min-height: 30px; + min-width: 300px; + font-size: var(--ti-menubar-menu-font-size, 14px); +} +.tiny-menu.menu-hor > ul > li { + display: inline-block; + margin-left: -4px; + position: relative; + text-align: center; + padding: 0; + margin: 0; +} +.tiny-menu.menu-hor > ul > li > a { + display: block; + padding: 0 10px; + min-width: 120px; + margin-right: -1px; + color: var(--ti-menubar-title-color); + font-size: var(--ti-common-font-size-2); +} +.tiny-menu.menu-hor > ul > li > a span.menu-icon { + margin-right: 8px; + top: -2px; +} +.tiny-menu.menu-hor > ul > li .submenu > li > a { + color: var(--ti-menubar-submenu-normal-color); +} +.tiny-menu.menu-hor > ul > li .submenu > li > a:focus, +.tiny-menu.menu-hor > ul > li .submenu > li > a:hover { + background: var(--ti-menubar-submenu-hover-color); +} +.tiny-menu.menu-hor > ul > li .submenu > li > a.active, +.tiny-menu.menu-hor > ul > li .submenu > li > a:active { + background: var(--ti-menubar-submenu-active-color); +} +.tiny-menu.menu-hor > ul > li .submenu > li > span.icon-starActive { + left: 8px; +} +.tiny-menu.menu-hor > ul > li .submenu > li > span.icon-transpond { + right: 8px; +} +.tiny-menu.menu-hor > ul > li.node-selected > a, +.tiny-menu.menu-hor > ul > li:hover > a { + border-right: 0; +} +.tiny-menu.menu-hor > ul > li:last-child > a { + border-right: 0; +} +.tiny-menu.menu-hor > ul li { + padding: 0; + height: var(--ti-menubar-li-height); + line-height: var(--ti-menubar-li-height); + position: relative; +} +.tiny-menu.menu-hor > ul li > a { + min-width: 60px; + width: 100%; + height: 100%; + color: var(--ti-menubar-title-color); +} +.tiny-menu.menu-hor > ul li > a:active, +.tiny-menu.menu-hor > ul li > a:focus, +.tiny-menu.menu-hor > ul li > a:hover { + color: var(--ti-menubar-title-color); + text-decoration: none; + background: var(--ti-menubar-background-active); +} +.tiny-menu.menu-hor ul { + padding: 0; + margin: 0; + background: var(--ti-menubar-background-normal); +} +.tiny-menu.menu-hor .menus-left, +.tiny-menu.menu-hor .menus-left .submenu { + left: auto; + right: 100%; +} +.tiny-menu.menu-hor .node-selected > .submenu { + left: auto; + margin-top: 2px; +} +.tiny-menu.menu-hor .node-selected > .submenu > li.node-selected { + background: var(--ti-menubar-background-active); +} +.tiny-menu.menu-hor .node-selected > .submenu > li.node-selected a { + color: var(--ti-menubar-submenu-normal-color); +} +.tiny-menu.menu-hor .node-selected > .submenu > li.node-selected a:hover { + color: #1890ff; + background: #fff; +} +.tiny-menu.menu-hor .node-selected > .submenu > li .submenu { + margin-top: -40px; + margin-left: 2px; +} +.tiny-menu.menu-hor .node-selected > .submenu .node-selected > .submenu { + left: 100%; +} +.tiny-menu.menu-hor .node-selected .submenu { + background: #fff; + border: 1px solid #d9d9d9; + -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); +} +.tiny-menu.menu-hor .menu-dropdown { + margin-top: 0; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group { + padding: 0 0 0 15px; + display: table-cell; + text-align: left; + word-break: break-all; + min-width: 330px; + max-width: 350px; + font-weight: 400; + vertical-align: top; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group li { + line-height: 30px; + display: inline-block; + margin-right: 8px; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group li.menu-row { + display: block; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group li.menu-row:after, +.tiny-menu.menu-hor .menu-dropdown .menu-group li.menu-row:before { + content: ''; + display: table; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group li.menu-row:after { + clear: both; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group li a { + padding-right: 8px; +} +.tiny-menu.menu-hor .menu-dropdown .menu-group:last-child { + border-right: 0; +} +.tiny-menu.menu-hor .menu-dropdown .memu-group-sub { + font-weight: 400; + border: none; + line-height: 25px; + display: block; +} +.tiny-menu.menu-hor .menu-dropdown .memu-group-sub:after, +.tiny-menu.menu-hor .menu-dropdown .memu-group-sub:before { + content: ''; + display: table; +} +.tiny-menu.menu-hor .menu-dropdown .memu-group-sub:after { + clear: both; +} +.tiny-menu.menu-hor .menu-dropdown .memu-group-sub li { + border: 0; +} +.tiny-menu.menu-hor .submenu { + margin-top: 0; +} +.tiny-menu.menu-hor .submenu li { + padding: 0; + height: var(--ti-menubar-submenu-li-height); + line-height: var(--ti-menubar-submenu-li-height); +} +.tiny-menu.menu-hor .submenu li .starActive-favorite { + color: #e1860a; +} +.tiny-menu.menu-hor .submenu li a { + padding: 0 35px 0 12px; + white-space: nowrap; + text-align: left; +} +.tiny-menu.menu-hor .submenu li span { + position: absolute; + color: var(--ti-menubar-submenu-normal-color); +} +.tiny-menu.menu-hor .menu-dropdown, +.tiny-menu.menu-hor .submenu { + position: absolute; + z-index: 10; + border-top: 0; + margin-top: 0; +} +.tiny-menu.menu-hor span.icon-starActive, +.tiny-menu.menu-hor span.icon-transpond { + position: absolute; +} +.tiny-menu.menu-hor span.icon-transpond { + right: 5px; + margin-right: 0; +} +.tiny-menu.menu-hor span.icon-starActive { + left: 0; +} +.tiny-menu.menu-hor span.icon-starActive + a { + padding-left: 35px; +} +.menu-roll > ul:after, +.menu-roll > ul:before { + content: ''; + display: table; +} +.menu-roll > ul:after { + clear: both; +} +.menu-roll > ul > li { + display: none; + margin-left: 0; +} +.menu-roll > ul > li:after, +.menu-roll > ul > li:before { + content: ''; + display: table; +} +.menu-roll > ul > li:after { + clear: both; +} +.menu-roll > ul > li a { + height: 45px; + font-weight: 700; + min-width: 30px; + margin: 0; + padding: 0 6px; + text-align: left; +} +.menu-roll > ul > li.node-selected > a { + float: left; + width: 100%; +} +.menu-roll .submenu { + text-align: left; + line-height: 30px; + left: 100%; + margin-top: 45px; + min-width: 180px; +} +.menu-roll .submenu .submenu { + margin-top: -31px; + top: inherit; +} +.menu-roll .submenu li { + padding: 0 10px; + height: 45px; + line-height: 45px; +} +.menu-roll .submenu li a { + padding: 0 6px; + display: block; + padding-right: 27px; +} +.menu-roll .submenu li span { + float: right; + margin: 5px 0 0 10px; +} +.menu-roll .submenu li span.tiny-icon { + float: none !important; +} +.menu-roll .submenu li span.icon-starActive, +.menu-roll .submenu li span.icon-transpond { + position: initial; +} +.menu-roll .node-selected { + display: block; +} +.menu-roll .node-selected > .submenu { + display: block; + left: 100%; + margin: 0; + min-width: 720px; +} +.menu-roll .node-selected > .submenu li { + float: left; +} +.roll-popup > ul > li { + display: block; +} +.roll-popup > ul > li > .submenu { + display: none; +} +.hor-dropdown { + position: relative; + z-index: 100; +} +.hor-dropdown .hor-dropdown-content, +.hor-dropdown > ul { + float: left; +} +.hor-dropdown-content { + position: relative; + color: #fff; +} +.hor-dropdown-content > span { + width: 80px; + text-align: center; + display: inline-block; + line-height: 31px; + position: relative; + z-index: 1; + background: var(--ti-menubar-background-normal); + line-height: 46px; +} +.hor-dropdown-content > span i { + width: 15px; + height: 16px; + padding-top: 1px; + border-radius: 2px; + cursor: pointer; + border: 1px solid var(--ti-menubar-dropdown-border-color); +} +.hor-dropdown-content .dropdown-menu { + position: absolute; + min-width: 140px; + padding: 5px; + right: 0; + margin-top: -1px; + background: var(--ti-menubar-background-normal); + padding: 5px 0; +} +.hor-dropdown-content .dropdown-menu li { + line-height: 24px; + padding: 2px 10px; + border: 1px solid var(--ti-menubar-background-normal); +} +.hor-dropdown-content .dropdown-menu li a { + color: #fff; +} +.hor-dropdown-content .dropdown-menu li:hover { + -webkit-box-shadow: inset 0 0 4px rgba(255, 255, 255, 0.6); + box-shadow: inset 0 0 4px rgba(255, 255, 255, 0.6); + border-radius: 3px; + border: 1px solid var(--ti-menubar-dropdown-hover-border-color); + background: var(--ti-menubar-dropdown-hover-background); +} +.menu-horline > ul > li { + position: inherit; +} +.menu-horline > ul > li a { + font-weight: 400; +} +.menu-horline > ul > li a span.tiny-icon { + margin-right: 5px; +} +.menu-horline > ul > li.node-more { + position: relative; +} +.menu-horline > ul > li.node-more > .submenu { + left: 0; +} +.menu-horline > ul > li.node-more > .submenu > li { + float: none; +} +.menu-horline > ul > li.node-more > .submenu > li > a { + text-align: left; +} +.menu-horline > ul > li.node-more > .submenu span.tiny-icon { + margin-left: 5px; +} +.menu-horline > ul > li.node-selected { + position: inherit; +} +.menu-horline .submenu { + min-width: 100%; +} +.menu-horline .submenu li { + float: left; +} +.menu-horline .submenu li a { + padding: 0 8px; + margin: 5px 0; + line-height: 35px; + text-align: center; +} +.menu-horline .submenu li span.tiny-icon { + float: none !important; +} +.menu-horline .submenu li span.icon-starActive, +.menu-horline .submenu li span.icon-transpond { + position: initial; +} +.menu-horline .node-selected > .submenu { + height: 45px; + left: 0; +} +.menu-horline .node-selected > .submenu li { + line-height: 45px; +} +.tiny-milestone { + --ti-milestone-color: var(--ti-base-color-light); + --ti-milestone-font-size: var(--ti-common-font-size-base); + --ti-milestone-icon-width: var(--ti-common-size-5x); + --ti-milestone-icon-height: var(--ti-common-size-5x); + --ti-milestone-line-background: #dbdbdb; + --ti-milestone-status-color: var(--ti-base-color-placeholder); + --ti-milestone-flag-tip-line-height: 20px; + --ti-milestone-flag-tip-background: var(--ti-base-color-border); + --ti-milestone-flag-tip-border-radius: var(--ti-common-border-radius-normal); + --ti-milestone-flag-content-border-radius: var(--ti-common-border-radius-1); + --ti-milestone-flag-content-font-size: var(--ti-common-font-size-1); + overflow: hidden; + padding-top: 38px; +} +.tiny-milestone .tiny-milestone__node { + display: block; + float: left; +} +.tiny-milestone .tiny-milestone__node::before { + content: ''; + width: 28px; + height: 28px; + display: block; + position: relative; + left: calc(50% - 14px); + top: 28px; + z-index: 15; +} +.tiny-milestone .tiny-milestone__node.is-solid::before { + background: var(--ti-milestone-color); +} +.tiny-milestone .tiny-milestone__node.is-solid .tiny-svg { + fill: var(--ti-milestone-color); +} +.tiny-milestone .tiny-milestone__node .iconfix { + font-size: var(--ti-common-font-size-4); +} +.tiny-milestone .tiny-milestone__icon { + background: var(--ti-milestone-color); + width: var(--ti-milestone-icon-width, 20px); + height: var(--ti-milestone-icon-height, 20px); + line-height: var(--ti-milestone-icon-height, 20px); + position: relative; + font-size: var(--ti-milestone-font-size, 12px); + text-align: center; + left: calc(50% - 10px); + top: 4px; + border-radius: 50%; + color: var(--ti-milestone-color); + cursor: pointer; + z-index: 15; +} +.tiny-milestone .tiny-milestone__icon.is-completed { + border: solid 2px; +} +.tiny-milestone .tiny-milestone__icon.is-completed .tiny-svg { + fill: #1890ff; + vertical-align: baseline; +} +.tiny-milestone .tiny-milestone__line { + height: 4px; + left: 50%; + top: -8px; + position: relative; + background: var(--ti-milestone-line-background); +} +.tiny-milestone .tiny-milestone__line-end { + width: 0; +} +.tiny-milestone .tiny-milestone__description { + line-height: 14px; + margin-top: 8px; + position: relative; + overflow: hidden; + text-align: center; +} +.tiny-milestone .tiny-milestone__description-name { + width: 100%; + color: #333; + font-size: var(--ti-milestone-font-size); + float: left; +} +.tiny-milestone .tiny-milestone__description-status { + color: var(--ti-milestone-status-color); + font-size: var(--ti-milestone-font-size); + float: left; + width: 100%; +} +.tiny-milestone .tiny-milestone__flag-tip { + position: fixed; + padding: 2px 4px; + line-height: var(--ti-milestone-flag-tip-line-height); + background: var(--ti-milestone-flag-tip-background); + border-radius: var(--ti-milestone-flag-tip-border-radius); + border: solid 1px var(--ti-milestone-flag-tip-background); + text-align: center; + word-wrap: break-word; +} +.tiny-milestone .tiny-milestone__flag-tip::before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border: 1px solid; + border-width: 8px 8px 0 8px; + border-color: #d9d9d9 transparent; + content: ''; + left: calc(50% - 4px); + bottom: -6px; +} +.tiny-milestone .tiny-milestone__flag { + position: absolute; + left: calc(50% - 29px); + bottom: 5px; + width: 58px; + text-align: center; + z-index: 1; +} +.tiny-milestone .tiny-milestone__flag:hover { + z-index: 2; +} +.tiny-milestone .tiny-milestone__flag-content { + width: 58px; + height: 34px; + padding: 0; + line-height: 15px; + font-size: var(--ti-milestone-flag-content-font-size); + border-radius: var(--ti-milestone-flag-content-border-radius); + color: var(--ti-milestone-color); + background: #333; + cursor: pointer; + vertical-align: middle; + display: table-cell; +} +.tiny-milestone .tiny-milestone__flag-content p { + color: var(--ti-milestone-color); + width: 58px; + font-size: var(--ti-common-font-size-base); + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + padding: 0 4px; + margin: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-milestone .tiny-milestone__flag-line { + height: 30px; + width: 1px; + margin-left: 50%; + background: #333; +} +.tiny-milestone .tiny-milestone__dot { + display: block; + background: var(--ti-milestone-flag-line-color); + border: solid 1px; + border-radius: 50%; + width: 5px; + height: 5px; + position: relative; + bottom: -29px; + right: 2px; +} +.tiny-modal { + --ti-modal-font-size: var(--ti-common-font-size-base); + --ti-modal-font-color: var(--ti-base-color-info-normal); + --ti-modal-font-family: Helvetica, Arial, 'Microsoft YaHei', sans-serif; + --ti-modal-primary-color: var(--ti-common-color-prompt); + --ti-modal-success-color: var(--ti-common-color-success); + --ti-modal-error-color: var(--ti-common-color-error); + --ti-modal-warning-color: var(--ti-common-color-warn); + --ti-modal-loading-color: var(--ti-common-color-prompt); + --ti-modal-alert-font-size: 22px; + --ti-modal-header-font-size: var(--ti-common-font-size-3); + --ti-modal-header-text-color: var(--ti-common-color-text-primary); + --ti-modal-header-font-weight: var(--ti-base-font-weight-bold); + --ti-modal-header-padding: 32px 32px 12px 32px; + --ti-modal-body-padding: 0 32px; + --ti-modal-footer-padding: 28px 32px 32px; + --ti-modal-footer-btn-border-radius: var(--ti-common-border-radius-normal); + --ti-modal-close-btn-font-size: var(--ti-common-font-size-1); + --ti-modal-close-btn-top: 13px; + --ti-modal-close-btn-scale: scale(1, 1); + --ti-modal-close-btn-padding: 0; + --ti-modal-small-btn-font-size: var(--ti-common-font-size-2); + --ti-modal-box-background-color: var(--ti-base-color-light); + --ti-modal-btn-color: var(--ti-base-color-common-5); + --ti-modal-box-shadow: var(--ti-common-shadow-4-down); + --ti-modal-box-border-radius: var(--ti-common-border-radius-normal); + --ti-modal-border-color: rgba(0, 0, 0, 0.2); + --ti-modal-close-btn-background-color-hover: var(--ti-base-color-light); + --ti-modal-footer-default-button: inline-block; + --ti-modal-box-width: 400px; +} +.tiny-modal__wrapper { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + font-size: var(--ti-modal-font-size); + color: var(--ti-modal-font-color); + font-family: var(--ti-modal-font-family, Helvetica, Arial, 'Microsoft YaHei', sans-serif); + -webkit-transition: top 0.4s; + transition: top 0.4s; +} +.tiny-modal__wrapper.active { + display: block; +} +.tiny-modal__wrapper.is__visible.is__mask:before { + background-color: rgba(0, 0, 0, 0.3); +} +.tiny-modal__wrapper.is__visible.type__message .tiny-modal__box { + -webkit-transform: translateY(0); + transform: translateY(0); +} +.tiny-modal__wrapper.is__visible:not(.type__message) .tiny-modal__box:not(.is__drag) { + top: 15vh; + -webkit-transition: top 0s ease-in, opacity 0.4s ease-in; + transition: top 0s ease-in, opacity 0.4s ease-in; +} +.tiny-modal__wrapper.is__visible .tiny-modal__box { + opacity: 1; + visibility: visible; +} +.tiny-modal__wrapper:not(.lock__view) { + pointer-events: none; +} +.tiny-modal__wrapper.lock__scroll { + overflow: hidden; +} +.tiny-modal__wrapper:not(.lock__scroll) { + overflow: auto; +} +.tiny-modal__wrapper:not(.type__message) .tiny-modal__text { + font-size: var(--ti-common-font-size-base); + color: var(--ti-common-color-text-secondary); + line-height: var(--ti-common-line-height-number); +} +.tiny-modal__wrapper.is__mask:before, +.tiny-modal__wrapper.lock__view:before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; + pointer-events: auto; +} +.tiny-modal__wrapper.is__animat.is__mask:before { + -webkit-transition: background-color, 0.2s, ease-in-out; + transition: background-color, 0.2s, ease-in-out; +} +.tiny-modal__wrapper.is__animat.type__message .tiny-modal__box:not(.is__drag) { + -webkit-transition: all, 0.2s, ease-out; + transition: all, 0.2s, ease-out; +} +.tiny-modal__wrapper.size__mini, +.tiny-modal__wrapper.size__small { + font-size: var(--ti-modal-font-size); +} +.tiny-modal__wrapper.size__mini .tiny-modal__box, +.tiny-modal__wrapper.size__small .tiny-modal__box { + padding: 6px 0; +} +.tiny-modal__wrapper.size__mini .tiny-modal__body, +.tiny-modal__wrapper.size__small .tiny-modal__body { + padding: 4px 14px 10px 14px; +} +.tiny-modal__wrapper.size__mini .tiny-modal__footer, +.tiny-modal__wrapper.size__small .tiny-modal__footer { + padding: 4px 14px 8px 14px; +} +.tiny-modal__wrapper.size__mini .tiny-modal__header, +.tiny-modal__wrapper.size__small .tiny-modal__header { + font-size: var(--ti-modal-header-font-size); + padding: 6px 30px 8px 14px; +} +.tiny-modal__wrapper.size__mini .tiny-modal__close-btn, +.tiny-modal__wrapper.size__mini .tiny-modal__zoom-btn, +.tiny-modal__wrapper.size__small .tiny-modal__close-btn, +.tiny-modal__wrapper.size__small .tiny-modal__zoom-btn { + font-size: var(--ti-modal-small-btn-font-size); + top: 10px; +} +.tiny-modal__wrapper.type__alert .tiny-modal__body, +.tiny-modal__wrapper.type__confirm .tiny-modal__body, +.tiny-modal__wrapper.type__message .tiny-modal__body { + white-space: normal; + word-break: break-word; +} +.tiny-modal__wrapper.type__message { + text-align: center; +} +.tiny-modal__wrapper.type__message .tiny-modal__box { + display: inline-block; + padding: 24px; + margin-top: 0; + width: auto; + -webkit-box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1); + -webkit-transform: translateY(-10%); + transform: translateY(-10%); +} +.tiny-modal__wrapper.type__message .tiny-modal__box .tiny-modal__body:after { + content: ''; + display: block; + clear: both; + height: 0; + overflow: hidden; + visibility: hidden; +} +.tiny-modal__wrapper.type__message .tiny-modal__box .tiny-modal__content { + max-width: 800px; + float: left; +} +.tiny-modal__wrapper.type__message .tiny-modal__status-wrapper { + font-size: var(--ti-modal-small-btn-font-size); + padding-right: 10px; +} +.tiny-modal__wrapper.type__alert .tiny-modal__box, +.tiny-modal__wrapper.type__confirm .tiny-modal__box, +.tiny-modal__wrapper.type__modal .tiny-modal__box { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + position: absolute; + left: 50%; + top: 0; + -webkit-box-shadow: var(--ti-modal-box-shadow); + box-shadow: var(--ti-modal-box-shadow); + border: 1px solid var(--ti-modal-border-color); +} +.tiny-modal__wrapper.type__alert .tiny-modal__box .tiny-modal__header, +.tiny-modal__wrapper.type__confirm .tiny-modal__box .tiny-modal__header, +.tiny-modal__wrapper.type__modal .tiny-modal__box .tiny-modal__header { + cursor: move; +} +.tiny-modal__wrapper.type__modal .tiny-modal__body { + overflow: auto; +} +.tiny-modal__wrapper.type__modal .tiny-modal__body .tiny-modal__content { + overflow: auto; +} +.tiny-modal__wrapper.type__alert .tiny-modal__status-wrapper, +.tiny-modal__wrapper.type__confirm .tiny-modal__status-wrapper { + font-size: var(--ti-modal-alert-font-size); + padding: 0 10px 0 2px; +} +.tiny-modal__wrapper.status__info .tiny-modal__status-wrapper { + fill: var(--ti-modal-primary-color); +} +.tiny-modal__wrapper.status__question .tiny-modal__status-wrapper, +.tiny-modal__wrapper.status__warning .tiny-modal__status-wrapper { + fill: var(--ti-modal-warning-color); +} +.tiny-modal__wrapper.status__success .tiny-modal__status-wrapper { + fill: var(--ti-modal-success-color); +} +.tiny-modal__wrapper.status__error .tiny-modal__status-wrapper { + fill: var(--ti-modal-error-color); +} +.tiny-modal__wrapper.status__loading .tiny-modal__status-wrapper { + fill: var(--ti-modal-loading-color); +} +.tiny-modal__wrapper.is__maximize .tiny-modal__box .tiny-modal__header { + cursor: default; +} +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .sb-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .selb-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .sest-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .st-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .swlb-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .swst-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .wl-resize, +.tiny-modal__wrapper.is__maximize .tiny-modal__resize .wr-resize { + display: none; +} +.tiny-modal__box { + width: var(--ti-modal-box-width); + background-color: var(--ti-modal-box-background-color); + border-radius: var(--ti-modal-box-border-radius); + font-size: var(--ti-modal-header-font-size); + -webkit-box-shadow: var(--ti-common-shadow-4-down); + box-shadow: var(--ti-common-shadow-4-down); + text-align: left; + pointer-events: auto; + visibility: hidden; + opacity: 0; +} +.tiny-modal__box.is__drag { + cursor: move; +} +.tiny-modal__box.is__drag .tiny-modal__body:after, +.tiny-modal__box.is__drag .tiny-modal__footer:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.tiny-modal__box.is__drag .tiny-modal__body { + overflow: hidden; +} +.tiny-modal__box.is__drag .tiny-modal__body .tiny-modal__content { + overflow: hidden; +} +.tiny-modal__status-wrapper { + -ms-flex-negative: 0; + flex-shrink: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-modal__status-icon { + font-style: normal; +} +.tiny-modal__content { + width: 100%; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.tiny-modal__body, +.tiny-modal__footer, +.tiny-modal__header { + position: relative; +} +.tiny-modal__body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + padding: var(--ti-modal-body-padding); +} +.tiny-modal__header { + -ms-flex-negative: 0; + flex-shrink: 0; + color: var(--ti-modal-header-text-color); + font-size: var(--ti-modal-header-font-size); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-weight: var(--ti-modal-header-font-weight); + border-bottom: none; + padding: var(--ti-modal-header-padding); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tiny-modal__close-btn, +.tiny-modal__zoom-btn { + font-size: var(--ti-modal-close-btn-font-size); + position: absolute; + right: 24px; + top: var(--ti-modal-close-btn-top); + z-index: 1; + fill: var(--ti-modal-btn-color); + -webkit-transform: var(--ti-modal-close-btn-scale); + transform: var(--ti-modal-close-btn-scale); + cursor: pointer; + padding: var(--ti-modal-close-btn-padding); + border-radius: 4px; +} +.tiny-modal__close-btn:hover, +.tiny-modal__zoom-btn:hover { + fill: var(--ti-modal-btn-color); + background-color: var(--ti-modal-close-btn-background-color-hover); +} +.tiny-modal__zoom-btn { + right: 44px; + border-color: #c0c4cc; +} +.tiny-modal__zoom-btn:hover { + border-color: #606266; +} +.tiny-modal__footer { + -ms-flex-negative: 0; + flex-shrink: 0; + text-align: center; + padding: var(--ti-modal-footer-padding); +} +.tiny-modal__footer .tiny-button { + border-radius: var(--ti-modal-footer-btn-border-radius); +} +.tiny-modal__footer .tiny-button--default { + display: var(--ti-modal-footer-default-button); +} +.tiny-modal__resize .sb-resize, +.tiny-modal__resize .selb-resize, +.tiny-modal__resize .sest-resize, +.tiny-modal__resize .st-resize, +.tiny-modal__resize .swlb-resize, +.tiny-modal__resize .swst-resize, +.tiny-modal__resize .wl-resize, +.tiny-modal__resize .wr-resize { + position: absolute; + z-index: 100; +} +.tiny-modal__resize .wl-resize, +.tiny-modal__resize .wr-resize { + width: 8px; + height: 100%; + top: 0; + cursor: w-resize; +} +.tiny-modal__resize .wl-resize { + left: -3px; +} +.tiny-modal__resize .wr-resize { + right: -3px; +} +.tiny-modal__resize .selb-resize, +.tiny-modal__resize .sest-resize, +.tiny-modal__resize .swlb-resize, +.tiny-modal__resize .swst-resize { + width: 10px; + height: 10px; + z-index: 101; +} +.tiny-modal__resize .sest-resize, +.tiny-modal__resize .swst-resize { + top: -8px; +} +.tiny-modal__resize .selb-resize, +.tiny-modal__resize .swlb-resize { + bottom: -8px; +} +.tiny-modal__resize .sest-resize, +.tiny-modal__resize .swlb-resize { + cursor: sw-resize; +} +.tiny-modal__resize .selb-resize, +.tiny-modal__resize .swst-resize { + cursor: se-resize; +} +.tiny-modal__resize .swlb-resize, +.tiny-modal__resize .swst-resize { + left: -8px; +} +.tiny-modal__resize .selb-resize, +.tiny-modal__resize .sest-resize { + right: -8px; +} +.tiny-modal__resize .sb-resize, +.tiny-modal__resize .st-resize { + width: 100%; + height: 8px; + left: 0; + cursor: s-resize; +} +.tiny-modal__resize .st-resize { + top: -3px; +} +.tiny-modal__resize .sb-resize { + bottom: -3px; +} +@-webkit-keyframes modal-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes modal-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@-webkit-keyframes modal-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +@keyframes modal-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +@keyframes modal-fade-in { + 0% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes modal-fade-out { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} +.tiny-nav-menu { + --ti-nav-menu-height: var(--ti-base-size-height-large); + --ti-nav-menu-background: var(--ti-base-color-navigation-background); + --ti-nav-menu-item-font-size: var(--ti-common-font-size-2); + --ti-nav-menu-item-font-color: var(--ti-base-color-light); + --ti-nav-menu-item-hover-background: #474c5e; + --ti-nav-menu-setting-font-size: 22px; + --ti-nav-menu-popmenu-color: var(--ti-base-color-info-normal); + --ti-nav-menu-popmenu-border-color: var(--ti-base-color-border); + --ti-nav-menu-popmenu-more-item-height: 40px; + --ti-nav-menu-popmenu-more-item-hover-color: var(--ti-base-color-brand-6); + --ti-nav-menu-popmenu-more-item-hover-background: var(--ti-base-color-hover-background); + --ti-nav-menu-popmenu-more-item-active-background: var(--ti-base-color-selected-background); + --ti-nav-menu-popmenu-node-title-font-size: var(--ti-common-font-size-1); + --ti-nav-menu-popmenu-node-item-font-size: var(--ti-common-font-size-base, 12px); + background: var(--ti-nav-menu-background); + height: var(--ti-nav-menu-height); + position: relative; + padding: 0 24px; +} +.tiny-nav-menu > .slot-logo { + float: left; + overflow: hidden; + margin: 0 100px 0 0; + line-height: var(--ti-nav-menu-height); +} +.tiny-nav-menu > .slot-toolbar { + float: right; +} +.tiny-nav-menu > .slot-toolbar > .setting { + position: relative; + float: right; + margin: 0 0 0 24px; +} +.tiny-nav-menu > .slot-toolbar > .setting > .tiny-icon { + font-size: var(--ti-nav-menu-setting-font-size); + line-height: var(--ti-nav-menu-height); + cursor: pointer; + color: #fff; +} +.tiny-nav-menu > .slot-toolbar > .setting > .more-setting { + position: absolute; + right: 0; + min-width: 120px; + background-color: var(--ti-nav-menu-item-font-color); + border: 1px solid #d9d9d9; + -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); +} +.tiny-nav-menu > .slot-toolbar > .setting > .more-setting > .setting-item { + padding: 6px 10px; + color: #333; +} +.tiny-nav-menu > .slot-toolbar > .setting > .more-setting > .setting-item:hover { + background: var(--ti-nav-menu-popmenu-more-item-hover-background); +} +.tiny-nav-menu > .slot-toolbar > .setting > .more-setting > .setting-item:active { + background: var(--ti-nav-menu-popmenu-more-item-active-background); +} +.tiny-nav-menu > .slot-toolbar > .template-toolbar .tiny-selector { + margin-top: 0; +} +.tiny-nav-menu > .menu { + float: left; + height: var(--ti-nav-menu-height); + line-height: var(--ti-nav-menu-height); + overflow: hidden; +} +.tiny-nav-menu > .menu > li { + float: left; +} +.tiny-nav-menu > .menu > li > a, +.tiny-nav-menu > .menu > li > span { + padding: 0 12px; + font-size: var(--ti-nav-menu-item-font-size); + text-align: center; + color: var(--ti-nav-menu-item-font-color); + cursor: pointer; + display: block; + height: var(--ti-nav-menu-height); + line-height: var(--ti-nav-menu-height); + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-nav-menu > .menu > li > a.active, +.tiny-nav-menu > .menu > li > a:hover, +.tiny-nav-menu > .menu > li > span.active, +.tiny-nav-menu > .menu > li > span:hover { + color: var(--ti-nav-menu-item-font-color); + background: var(--ti-nav-menu-item-hover-background); + text-decoration: none; +} +.tiny-nav-menu > .menu > li > a.selected, +.tiny-nav-menu > .menu > li > span.selected { + border-bottom: 3px solid #fff; +} +.tiny-nav-menu > .more { + padding: 0 12px; + font-size: var(--ti-nav-menu-item-font-size); + text-align: center; + color: var(--ti-nav-menu-item-font-color); + cursor: pointer; + display: inline-block; + height: var(--ti-nav-menu-height); + line-height: var(--ti-nav-menu-height); +} +.tiny-nav-menu > .more.active, +.tiny-nav-menu > .more.selected, +.tiny-nav-menu > .more:hover { + color: var(--ti-nav-menu-item-font-color); + background: var(--ti-nav-menu-item-hover-background); +} +.tiny-nav-menu > .more.selected { + border-bottom: 3px solid #fff; +} +.tiny-nav-menu > .popmenu { + position: absolute; + background: #fff; + width: 100%; + border: 1px solid var(--ti-nav-menu-popmenu-border-color); + -webkit-box-shadow: 0 0 4px var(--ti-nav-menu-popmenu-border-color); + box-shadow: 0 0 4px var(--ti-nav-menu-popmenu-border-color); + max-height: calc(100vh - var(--ti-nav-menu-height)); + overflow-y: auto; + left: 0; +} +.tiny-nav-menu > .popmenu > .more-menu { + float: left; + width: 160px; + height: 100%; + border-right: 1px solid var(--ti-nav-menu-popmenu-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-nav-menu > .popmenu > .more-menu > ul { + list-style: none; +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li { + height: var(--ti-nav-menu-popmenu-more-item-height); + line-height: var(--ti-nav-menu-popmenu-more-item-height); + padding: 0 12px 0 24px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li.active, +.tiny-nav-menu > .popmenu > .more-menu > ul > li:hover { + color: var(--ti-nav-menu-popmenu-more-item-hover-color); + background: var(--ti-nav-menu-popmenu-more-item-hover-background); +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li.active .more-icon, +.tiny-nav-menu > .popmenu > .more-menu > ul > li:hover .more-icon { + fill: var(--ti-nav-menu-popmenu-more-item-hover-color); +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li > a { + color: var(--ti-nav-menu-popmenu-color); +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li > a, +.tiny-nav-menu > .popmenu > .more-menu > ul > li > span { + display: block; + height: var(--ti-nav-menu-popmenu-more-item-height); + line-height: var(--ti-nav-menu-popmenu-more-item-height); + font-size: var(--ti-common-font-size-base); + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li > a.showicon, +.tiny-nav-menu > .popmenu > .more-menu > ul > li > span.showicon { + width: calc(100% - 12px); +} +.tiny-nav-menu > .popmenu > .more-menu > ul > li > .more-icon { + font-size: var(--ti-common-font-size-base); +} +.tiny-nav-menu > .popmenu > .sub-menu { + float: left; + width: calc(100% - 160px); + padding-left: 14px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-nav-menu > .popmenu > .sub-menu.full-width { + width: 100%; + padding: 0 86px; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul { + list-style: none; + overflow: hidden; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group { + list-style: none; + margin-bottom: 24px; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group:first-child { + margin-top: 18px; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .tiny-nav-menu__sub-menu-title { + color: var(--ti-nav-menu-popmenu-color); + font-size: var(--ti-nav-menu-popmenu-node-title-font-size); + font-weight: 700; + margin: 0 0 12px 0; + word-break: break-all; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .tiny-nav-menu__sub-menu-title:only-child { + border-bottom: none; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .sub-item { + font-size: var(--ti-nav-menu-popmenu-node-item-font-size); + padding: 4px 0; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .sub-item:hover { + background: var(--ti-nav-menu-popmenu-more-item-hover-background); +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .sub-item.active, +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .sub-item:active { + background: var(--ti-nav-menu-popmenu-more-item-active-background); +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .sub-item > a { + color: var(--ti-nav-menu-popmenu-color); + white-space: normal; + word-break: break-all; + text-decoration: none; +} +.tiny-nav-menu > .popmenu > .sub-menu > ul .group > .sub-item > span { + color: var(--ti-nav-menu-popmenu-color); + white-space: normal; + word-break: break-all; +} +.tiny-nav-menu > .single { + width: auto; + height: auto; + padding: 0; +} +.tiny-nav-menu > .single > .sub-menu.full-width { + padding: 0; +} +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group { + margin: 0; +} +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group .tiny-nav-menu__sub-menu-title { + padding: 18px 35px 0 12px; +} +.tiny-nav-menu + > .single + > .sub-menu.full-width + > ul + .group + .tiny-nav-menu__sub-menu-title.tiny-nav-menu__sub-menu-title-blank { + padding: 0 35px 0 12px; +} +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group > .title { + margin: 0; + line-height: 40px; + padding: 0 35px 0 12px; +} +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group > .sub-item { + height: 40px; + line-height: 40px; + padding: 0 35px 0 12px; + margin: 0; +} +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group > .sub-item:hover { + background: var(--ti-nav-menu-popmenu-more-item-hover-background); +} +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group > .sub-item.active, +.tiny-nav-menu > .single > .sub-menu.full-width > ul .group > .sub-item:active { + background: var(--ti-nav-menu-popmenu-more-item-active-background); +} +.tiny-nav-menu > .more-button { + float: left; + text-align: center; + padding: 0 12px; + height: var(--ti-nav-menu-height); + line-height: var(--ti-nav-menu-height); + overflow: hidden; + fill: #fff; + font-size: var(--ti-nav-menu-item-font-size); +} +.tiny-nav-menu > .more-button:hover { + background: var(--ti-nav-menu-item-hover-background); +} +.tiny-nav-menu > .more-button.float-right { + float: right; + margin-left: 10px; +} +.tiny-nav-menu > .slot-mobile-menu { + display: none; +} +@media (max-width: 768px) { + .tiny-nav-menu > .more-button.mobile { + display: none; + } + .tiny-nav-menu > .slot-mobile-menu { + display: block; + } + .tiny-nav-menu > .menu { + display: none; + } + .tiny-nav-menu > .popmenu .sub-menu .full-width { + padding: 0; + } +} +.tiny-notify { + --ti-notify-info-background: var(--ti-common-color-prompt-bg); + --ti-notify-info-icon-color: var(--ti-common-color-prompt); + --ti-notify-warning-background: var(--ti-common-color-warn-bg); + --ti-notify-warning-icon-color: var(--ti-common-color-warn); + --ti-notify-error-background: var(--ti-common-color-error-bg); + --ti-notify-error-icon-color: var(--ti-common-color-error); + --ti-notify-success-background: var(--ti-common-color-success-bg); + --ti-notify-success-icon-color: var(--ti-common-color-success); + --ti-notify-color: var(--ti-base-color-brand-6); + --ti-notify-border-radius: var(--ti-common-border-radius-normal); + --ti-notify-title-color: var(--ti-base-color-info-normal); + --ti-notify-title-font-size: var(--ti-common-font-size-1); + --ti-notify-title-font-weight: var(--ti-common-font-weight-7); + --ti-notify-content-font-size: var(--ti-common-font-size-1); + --ti-notify-content-margin: 0; + --ti-notify-message-margin: 0 0 0 10px; + --ti-notify-icon-size: var(--ti-common-font-size-5); + --ti-notify-close-color: var(--ti-base-color-common-7); + --ti-notify-max-width: 400px; + --ti-notify-box-shadow: var(--ti-common-shadow-4-down); + position: fixed; + z-index: 1101; + max-width: var(--ti-notify-max-width); + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: all 0.3s; + transition: all 0.3s; + overflow: hidden; + white-space: nowrap; + padding: 16px; + background: var(--ti-notify-background); + border-radius: 2px; + border-radius: var(--ti-notify-border-radius); + font-size: var(--ti-common-font-size-base); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-shadow: var(--ti-notify-box-shadow); + box-shadow: var(--ti-notify-box-shadow); +} +.tiny-notify--info { + background: var(--ti-notify-info-background); +} +.tiny-notify--warning { + background: var(--ti-notify-warning-background); +} +.tiny-notify--error { + background: var(--ti-notify-error-background); +} +.tiny-notify--success { + background: var(--ti-notify-success-background); +} +.tiny-notify.top-left { + left: 10px; + top: 25px; +} +.tiny-notify.bottom-left { + left: 10px; + bottom: 25px; +} +.tiny-notify.top-right { + right: 10px; + top: 25px; +} +.tiny-notify.bottom-right { + right: 10px; + bottom: 25px; +} +.tiny-notify .tiny-notify__title { + font-weight: var(--ti-notify-title-font-weight); + font-size: var(--ti-notify-title-font-size); + color: var(--ti-notify-title-color); + line-height: 1.74; +} +.tiny-notify .tiny-notify__icon { + color: var(--ti-notify-color); +} +.tiny-notify .tiny-notify__content { + color: var(--ti-notify-title-color); + font-size: var(--ti-common-font-size-base); + margin: 0; + padding: 0; + font-size: var(--ti-common-font-size-1); + word-break: break-all; + white-space: pre-wrap; +} +.tiny-notify .tiny-notify__closebtn { + cursor: pointer; + color: var(--ti-notify-color); + position: absolute; + top: 50%; + right: 10px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.tiny-notify .tiny-notify__icon-zone { + width: 24px; + height: 24px; + font-size: var(--ti-notify-icon-size); +} +.tiny-notify .tiny-notify__message-zone { + width: calc(100% - 40px); + margin: var(--ti-notify-message-margin); +} +.tiny-notify .tiny-notify__close-zone { + width: 16px; + height: 16px; + font-size: var(--ti-common-font-size-2); + cursor: pointer; +} +.tiny-notify--info .tiny-notify__icon-zone { + fill: var(--ti-notify-info-icon-color); +} +.tiny-notify--info .tiny-notify__close-zone { + fill: var(--ti-notify-close-color); +} +.tiny-notify--warning .tiny-notify__icon-zone { + fill: var(--ti-notify-warning-icon-color); +} +.tiny-notify--warning .tiny-notify__close-zone { + fill: var(--ti-notify-close-color); +} +.tiny-notify--error .tiny-notify__icon-zone { + fill: var(--ti-notify-error-icon-color); +} +.tiny-notify--error .tiny-notify__close-zone { + fill: var(--ti-notify-close-color); +} +.tiny-notify--success .tiny-notify__icon-zone { + fill: var(--ti-notify-success-icon-color); +} +.tiny-notify--error .tiny-notify__close-zone { + fill: var(--ti-notify-close-color); +} +.tiny-notify__icon-zone .tiny-notify__icon-status { + position: relative; +} +.tiny-notify--no-close .tiny-notify__message-zone { + width: calc(100% - 24px); +} +.tiny-notify__message-zone .tiny-notify__title-wrapper { + height: 24px; + line-height: 24px; + color: var(--ti-notify-title-color); + font-size: var(--ti-notify-title-font-size); +} +.tiny-notify__message-zone .tiny-notify__content-wrapper { + height: auto; + line-height: 24px; + max-height: 96px; + overflow-y: auto; + font-size: var(--ti-notify-content-font-size); + margin: var(--ti-notify-content-margin); +} +.tiny-notify__close-zone .tiny-notify__icon-close { + position: relative; + top: -5px; +} +.tiny-notify--no-icon .tiny-notify__message-zone { + width: 100%; +} +.tiny-numeric { + --ti-numeric-input-width: 180px; + --ti-numeric-input-radius: var(--ti-common-border-radius-normal); + --ti-numeric-input-normal-border-color: var(--ti-base-color-border); + --ti-numeric-input-normal-color: var(--ti-base-color-info-normal); + --ti-numeric-input-normal-background: var(--ti-base-color-light); + --ti-numeric-input-normal-height: 28px; + --ti-numeric-input-normal-active-border-color: var(--ti-base-color-border-hover); + --ti-numeric-input-placeholder-color: var(--ti-base-color-placeholder); + --ti-numeric-input-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-numeric-input-icon-hover-color: var(--ti-base-color-border-hover); + --ti-numeric-input-icon-disabled-color: var(--ti-common-color-icon-disabled); + --ti-numeric-input-disabled-border-color: var(--ti-common-color-line-disabled); + position: relative; + display: inline-block; + width: var(--ti-numeric-input-width); +} +.tiny-numeric__input { + display: block; + line-height: normal; +} +.tiny-numeric__input.is-disabled .tiny-numeric__input-inner { + cursor: not-allowed; + pointer-events: none; + border: 1px solid var(--ti-numeric-input-disabled-border-color); + color: var(--ti-numeric-input-placeholder-color); + background: var(--ti-numeric-input-disabled-bgcolor); +} +.tiny-numeric__input.is-disabled .tiny-numeric__input-inner::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.tiny-numeric__input.is-disabled .tiny-numeric__input-inner:-ms-input-placeholder { + color: #bfbfbf; +} +.tiny-numeric__input.is-disabled .tiny-numeric__input-inner::-webkit-input-placeholder { + color: #bfbfbf; +} +.tiny-numeric__input.is-disabled .tiny-numeric__input-inner::-ms-input-placeholder { + color: #bfbfbf; +} +.tiny-numeric__input.is-disabled .tiny-numeric__input-inner::placeholder { + color: #bfbfbf; +} +.tiny-numeric__input.is-disabled .tiny-input__icon { + cursor: not-allowed; +} +.tiny-numeric__input.has-unit .tiny-numeric__input-inner { + padding: 0 50px 0 8px; +} +.tiny-numeric__input.text-align-left .tiny-numeric__input-inner { + text-align: left; +} +.tiny-numeric__input-inner { + width: 100%; + height: var(--ti-numeric-input-normal-height); + line-height: var(--ti-numeric-input-normal-height); + border: 1px solid var(--ti-numeric-input-normal-border-color); + border-radius: var(--ti-numeric-input-radius); + color: var(--ti-numeric-input-normal-color); + background: var(--ti-numeric-input-normal-background); + font-size: var(--ti-common-font-size-base); + padding: 0 calc(var(--ti-numeric-input-normal-height) + 8px); + outline: 0; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + -webkit-transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-numeric__input-inner::-moz-placeholder { + color: var(--ti-numeric-input-placeholder-color); + opacity: 1; +} +.tiny-numeric__input-inner:-ms-input-placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner::-webkit-input-placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner::-ms-input-placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner::placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner:hover { + border: 1px solid var(--ti-numeric-input-normal-active-border-color); +} +.tiny-numeric__input-inner:active, +.tiny-numeric__input-inner:focus { + border: 1px solid var(--ti-base-color-brand-6); +} +.tiny-numeric__input-inner:focus { + outline: 0; +} +.tiny-numeric__input-inner:focus::-moz-placeholder { + color: var(--ti-numeric-input-placeholder-color); + opacity: 1; +} +.tiny-numeric__input-inner:focus:-ms-input-placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner:focus::-webkit-input-placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner:focus::-ms-input-placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner:focus::placeholder { + color: var(--ti-numeric-input-placeholder-color); +} +.tiny-numeric__input-inner::-ms-clear { + display: none; + width: 0; + height: 0; +} +.tiny-numeric__decrease, +.tiny-numeric__increase { + position: absolute; + z-index: 1; + top: 1px; + width: 30px; + height: calc(100% - 2px); + line-height: calc(var(--ti-numeric-input-normal-height) - 2px); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + font-size: var(--ti-common-font-size-1); + text-align: center; + cursor: pointer; +} +.tiny-numeric__decrease svg, +.tiny-numeric__increase svg { + fill: var(--ti-numeric-input-normal-active-border-color); +} +.tiny-numeric__decrease:hover:not(.is-disabled) ~ .tiny-numeric__input .tiny-numeric__input-inner:not(.is-disabled), +.tiny-numeric__increase:hover:not(.is-disabled) ~ .tiny-numeric__input .tiny-numeric__input-inner:not(.is-disabled) { + border-color: var(--ti-numeric-input-icon-hover-color); +} +.tiny-numeric__decrease:hover:not(.is-disabled) + ~ .tiny-numeric__input.is-disabled + .tiny-numeric__input-inner:not(.is-disabled), +.tiny-numeric__increase:hover:not(.is-disabled) + ~ .tiny-numeric__input.is-disabled + .tiny-numeric__input-inner:not(.is-disabled) { + border-color: var(--ti-numeric-input-normal-border-color); +} +.tiny-numeric__decrease:hover svg, +.tiny-numeric__increase:hover svg { + fill: var(--ti-numeric-input-icon-hover-color); +} +.tiny-numeric__decrease.is-disabled, +.tiny-numeric__increase.is-disabled { + cursor: not-allowed; +} +.tiny-numeric__decrease.is-disabled svg, +.tiny-numeric__increase.is-disabled svg { + fill: var(--ti-numeric-input-icon-disabled-color); +} +.tiny-numeric__increase { + right: 1px; + border-radius: 0 4px 4px 0; + border-left: 1px solid var(--ti-numeric-input-normal-border-color); +} +.tiny-numeric__decrease { + left: 1px; + border-radius: 4px 0 0 4px; + border-right: 1px solid var(--ti-numeric-input-normal-border-color); +} +.tiny-numeric__unit { + right: 0; + position: absolute; + z-index: 1; + top: 1px; + width: 50px; + height: calc(100% - 2px); + color: #666; + font-size: var(--ti-common-font-size-base); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-left: 1px solid #d9d9d9; + margin: 0 1px 0 0; + background: #f1f1f1; +} +.tiny-numeric.is-disabled .tiny-numeric__decrease, +.tiny-numeric.is-disabled .tiny-numeric__increase { + border-color: var(--ti-numeric-input-disabled-border-color); +} +.tiny-numeric.is-disabled .tiny-numeric__decrease svg, +.tiny-numeric.is-disabled .tiny-numeric__increase svg { + fill: var(--ti-numeric-input-icon-disabled-color); +} +.tiny-numeric.is-disabled .tiny-numeric__decrease:hover, +.tiny-numeric.is-disabled .tiny-numeric__increase:hover { + cursor: not-allowed; +} +.tiny-numeric.is-disabled .tiny-numeric__decrease:hover svg, +.tiny-numeric.is-disabled .tiny-numeric__increase:hover svg { + fill: var(--ti-numeric-input-icon-disabled-color); +} +.tiny-numeric--medium { + width: 270px; +} +.tiny-numeric--medium .tiny-numeric__decrease, +.tiny-numeric--medium .tiny-numeric__increase { + width: 42px; + line-height: 40px; + font-size: var(--ti-common-font-size-2); +} +.tiny-numeric--medium .tiny-numeric__input-inner { + height: 42px; + line-height: 42px; + padding-left: 43px; + padding-right: 43px; +} +.tiny-numeric--small { + width: 200px; +} +.tiny-numeric--small .tiny-numeric__decrease, +.tiny-numeric--small .tiny-numeric__increase { + width: 36px; + line-height: 34px; + font-size: var(--ti-common-font-size-1); +} +.tiny-numeric--small .tiny-numeric__input-inner { + height: 36px; + line-height: 36px; + padding-left: 37px; + padding-right: 37px; +} +.tiny-numeric--mini { + width: 130px; +} +.tiny-numeric--mini .tiny-numeric__decrease, +.tiny-numeric--mini .tiny-numeric__increase { + width: 24px; + line-height: 20px; + font-size: var(--ti-common-font-size-base); +} +.tiny-numeric--mini .tiny-numeric__input-inner { + height: 24px; + line-height: 24px; + padding-left: 35px; + padding-right: 35px; +} +.tiny-numeric.is-without-controls .tiny-numeric__input-inner { + padding-left: 8px; + padding-right: 8px; +} +.tiny-numeric.is-without-controls .tiny-numeric__input.has-unit .tiny-numeric__input-inner { + padding: 0 50px 0 8px; +} +.tiny-numeric.is-without-controls .tiny-numeric__input.text-align-left .tiny-numeric__input-inner { + text-align: left; +} +.tiny-numeric.is-controls-right .tiny-numeric__input-inner { + padding-left: 8px; + padding-right: 38px; +} +.tiny-numeric.is-controls-right .tiny-numeric__decrease, +.tiny-numeric.is-controls-right .tiny-numeric__increase { + height: auto; + line-height: 14px; +} +.tiny-numeric.is-controls-right .tiny-numeric__decrease svg, +.tiny-numeric.is-controls-right .tiny-numeric__increase svg { + -webkit-transform: scale(0.8); + transform: scale(0.8); +} +.tiny-numeric.is-controls-right .tiny-numeric__increase { + border-radius: 0 4px 0 0; + border-bottom: 1px solid var(--ti-numeric-input-normal-border-color); +} +.tiny-numeric.is-controls-right .tiny-numeric__decrease { + right: 1px; + bottom: 1px; + top: auto; + left: auto; + border-right: none; + border-left: 1px solid var(--ti-numeric-input-normal-border-color); + border-radius: 0 0 4px; +} +.tiny-numeric.is-controls-right .tiny-numeric__decrease svg { + -webkit-transform: scale(0.8) translateY(3px); + transform: scale(0.8) translateY(3px); +} +.tiny-numeric.is-controls-right[class*='medium'] [class*='decrease'], +.tiny-numeric.is-controls-right[class*='medium'] [class*='increase'] { + line-height: 20px; +} +.tiny-numeric.is-controls-right[class*='small'] [class*='decrease'], +.tiny-numeric.is-controls-right[class*='small'] [class*='increase'] { + line-height: 17px; +} +.tiny-numeric.is-controls-right[class*='mini'] [class*='decrease'], +.tiny-numeric.is-controls-right[class*='mini'] [class*='increase'] { + line-height: 8px; +} +.tiny-select-dropdown { + --ti-select-dropdown-item-color: var(--ti-base-color-info-normal); + --ti-select-dropdown-item-font-size: var(--ti-common-font-size-base); + --ti-select-dropdown-item-height: var(--ti-base-size-height-minor); + --ti-select-dropdown-item-disabled-color: var(--ti-base-color-placeholder); + --ti-select-dropdown-item-disabled-bgcolor: var(--ti-base-color-light); + --ti-select-dropdown-item-bgcolor: var(--ti-base-color-light); + --ti-select-dropdown-item-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-select-dropdown-item-selected-bgcolor: var(--ti-base-color-selected-background); + --ti-select-dropdown-item-selected-color: var(--ti-base-color-selected-font-color); + --ti-select-dropdown-item-icon-color: var(--ti-common-color-line-normal); + --ti-select-dropdown-item-icon-font-size: var(--ti-common-font-size-2); + --ti-select-dropdown-item-icon-selected-color: var(--ti-base-color-brand-6); +} +.tiny-select-dropdown.is-multiple .tiny-select-dropdown__item.selected { + color: var(--ti-select-dropdown-item-color); + background-color: var(--ti-select-dropdown-item-bgcolor); +} +.tiny-select-dropdown__item { + position: relative; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--ti-select-dropdown-item-color); + font-size: var(--ti-select-dropdown-item-font-size); + height: var(--ti-select-dropdown-item-height); + line-height: var(--ti-select-dropdown-item-height); + cursor: pointer; +} +.tiny-select-dropdown__item.is-disabled { + color: var(--ti-select-dropdown-item-disabled-color); + cursor: not-allowed; +} +.tiny-select-dropdown__item.is-disabled:hover { + background-color: var(--ti-select-dropdown-item-disabled-bgcolor); +} +.tiny-select-dropdown__item.hover, +.tiny-select-dropdown__item:hover { + background-color: var(--ti-select-dropdown-item-hover-bgcolor); +} +.tiny-select-dropdown__item.selected { + color: var(--ti-select-dropdown-item-selected-color); + background-color: var(--ti-select-dropdown-item-selected-bgcolor); +} +.tiny-select-dropdown__item .tiny-svg { + fill: var(--ti-select-dropdown-item-icon-color); + font-size: var(--ti-select-dropdown-item-icon-font-size); + margin-right: 8px; +} +.tiny-select-dropdown__item .checked-sur.tiny-svg, +.tiny-select-dropdown__item .halfselect.tiny-svg, +.tiny-select-dropdown__item.hover .tiny-svg, +.tiny-select-dropdown__item.selected .tiny-svg { + fill: var(--ti-select-dropdown-item-icon-selected-color); +} +.tiny-select-dropdown__item.memorize-highlight { + color: var(--ti-select-dropdown-item-icon-selected-color); +} +.tiny-select-group { + --ti-select-group-wrap-background: #e4e7ed; + --ti-select-group-title-font-size: var(--ti-common-font-size-base); + --ti-select-group-title-color: #909399; + --ti-select-group-title-line-height: var(--ti-base-size-height-minor); + margin: 0; + padding: 0; +} +.tiny-select-group__wrap { + position: relative; + list-style: none; + margin: 0; + padding: 0; +} +.tiny-select-group__wrap:not(:last-of-type) { + padding-bottom: 24px; +} +.tiny-select-group__wrap:not(:last-of-type)::after { + content: ''; + position: absolute; + display: block; + left: 8px; + right: 8px; + bottom: 12px; + height: 1px; + background: var(--ti-select-group-wrap-background); +} +.tiny-select-group__wrap .tiny-select-group__title { + padding-left: 8px; + font-size: var(--ti-select-group-title-font-size); + color: var(--ti-select-group-title-color); + line-height: var(--ti-select-group-title-line-height); +} +.tiny-pager { + --ti-pager-normal-color: var(--ti-base-color-info-normal); + --ti-pager-primary-color: var(--ti-base-color-brand-6); + --ti-pager-primary-hover-color: var(--ti-base-color-brand-5); + --ti-pager-input-border-color: var(--ti-base-color-border); + --ti-pager-input-hover-border-color: var(--ti-common-color-line-hover); + --ti-pager-input-color-disabled: var(--ti-base-color-common-2); + --ti-pager-input-color-hover: var(--ti-base-color-brand-6); + --ti-pager-font-size: var(--ti-common-font-size-base); + --ti-pager-font-color: var(--ti-common-color-text-secondary); + --ti-pager-font-normal: var(--ti-base-color-secondary); + --ti-pager-height: var(--ti-base-size-height-mini); + --ti-pager-input-width: 40px; + --ti-pager-list-padding: 0 6px; + --ti-pager-list-light-shadow: none; + --ti-pager-input-height: var(--ti-base-size-height-mini); + --ti-pager-input-border-radius: var(--ti-common-border-radius-normal); + --ti-pager-poplist-item-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-pager-poplist-item-hover-text-color: var(--ti-common-color-text-highlight); + --ti-pager-poplist-item-selected-bgcolor: var(--ti-common-color-bg-emphasize); + --ti-pager-poplist-item-hover-border: 1px solid transparent; + text-align: left; + padding: 12px 0; + color: var(--ti-pager-font-color); +} +.tiny-pager .tiny-pager__group { + display: inline-block; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + vertical-align: middle; + font-size: var(--ti-pager-font-size); +} +.tiny-pager .tiny-pager__group > span { + display: inline-block; + vertical-align: middle; +} +.tiny-pager .tiny-pager__total { + height: 24px; + line-height: 24px; + font-size: 12px; + color: var(--ti-pager-normal-color); +} +.tiny-pager .tiny-pager__pages { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: var(--ti-pager-font-size); +} +.tiny-pager .tiny-pager__pages li { + background: 0 0; + display: inline-block; + font-size: var(--ti-pager-font-size); + cursor: pointer; + margin-right: 4px; + text-align: center; + line-height: var(--ti-pager-height); + border-radius: var(--ti-pager-input-border-radius); + height: var(--ti-pager-height); + color: var(--ti-pager-font-color); + padding: var(--ti-pager-list-padding); + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid transparent; + -webkit-transition: all 0.5s ease; + transition: all 0.5s ease; +} +.tiny-pager .tiny-pager__pages li a { + color: var(--ti-pager-font-color); +} +.tiny-pager .tiny-pager__pages li svg { + fill: var(--ti-pager-font-color); + vertical-align: middle; +} +.tiny-pager .tiny-pager__pages li:not(.dot):not(.is-active):hover { + color: var(--ti-pager-poplist-item-hover-text-color); + background-color: var(--ti-pager-poplist-item-hover-bgcolor); + -webkit-box-shadow: var(--ti-pager-list-light-shadow); + box-shadow: var(--ti-pager-list-light-shadow); + border: var(--ti-pager-poplist-item-hover-border); +} +.tiny-pager .tiny-pager__pages li:not(.dot):not(.is-active):hover svg { + fill: var(--ti-pager-poplist-item-hover-text-color); +} +.tiny-pager .tiny-pager__pages li.dot .icon { + font-size: 14px; +} +.tiny-pager .tiny-pager__pages li.is-active { + color: #fff; + background-color: var(--ti-pager-primary-color); +} +.tiny-pager__goto { + font-size: 0; +} +.tiny-pager__goto input[type='text'] { + width: var(--ti-pager-input-width); + text-align: center; + vertical-align: middle; + border-radius: var(--ti-pager-input-border-radius); + display: inline-block; + position: inherit; + height: var(--ti-pager-input-height); + line-height: var(--ti-pager-input-height); + border: 1px solid var(--ti-pager-input-border-color); + color: var(--ti-pager-normal-color); + font-size: var(--ti-pager-font-size); + -webkit-transition: border 0.3s; + transition: border 0.3s; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin-left: 14px; + margin-right: 4px; +} +.tiny-pager__goto input[type='text']:hover { + border: 1px solid var(--ti-pager-input-hover-border-color); + color: var(--ti-pager-normal-color); +} +.tiny-pager__goto input[type='text'].active, +.tiny-pager__goto input[type='text']:active, +.tiny-pager__goto input[type='text']:focus, +.tiny-pager__goto input[type='text'][active] { + border: 1px solid var(--ti-pager-primary-color); + -webkit-box-shadow: 0 0 0 transparent; + box-shadow: 0 0 0 transparent; +} +.tiny-pager__goto button { + height: var(--ti-pager-input-height); + line-height: var(--ti-pager-input-height); + border: 1px solid #d9d9d9; + color: var(--ti-pager-font-color); + vertical-align: middle; + border-radius: var(--ti-pager-input-border-radius); + background: #fff; + font-size: var(--ti-pager-font-size); + padding: 0 8px; + text-align: center; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + -webkit-transition: border 0.3s, color 0.3s, background 0.3s; + transition: border 0.3s, color 0.3s, background 0.3s; + outline: 0; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-pager__btn-next, +.tiny-pager__btn-prev { + height: var(--ti-pager-height); + width: 24px; + line-height: var(--ti-pager-height); + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: var(--ti-pager-font-size); + font-weight: bolder; + color: var(--ti-pagination-prev-next-color); + outline: 0; + border: none; + background: 0 0; + margin-left: 4px; + padding: 0; + vertical-align: middle; + cursor: pointer; +} +.tiny-pager__btn-next span, +.tiny-pager__btn-prev span { + color: var(--ti-pager-primary-color); +} +.tiny-pager__btn-next svg, +.tiny-pager__btn-prev svg { + fill: var(--ti-pager-normal-color); + font-size: var(--ti-pager-font-size); + vertical-align: middle; +} +.tiny-pager__btn-next:hover, +.tiny-pager__btn-prev:hover { + background-color: var(--ti-pager-poplist-item-hover-bgcolor); +} +.tiny-pager__btn-next:hover svg, +.tiny-pager__btn-prev:hover svg { + fill: var(--ti-pager-poplist-item-hover-text-color); +} +.tiny-pager__btn-next[disabled], +.tiny-pager__btn-next[disabled]:hover, +.tiny-pager__btn-prev[disabled], +.tiny-pager__btn-prev[disabled]:hover { + background-color: transparent; + cursor: not-allowed; +} +.tiny-pager__btn-next[disabled] span, +.tiny-pager__btn-prev[disabled] span { + color: var(--ti-pagination-text-color-disabled); +} +.tiny-pager__btn-next[disabled] svg, +.tiny-pager__btn-prev[disabled] svg { + fill: var(--ti-pagination-text-color-disabled); +} +.tiny-pager__selector.tiny-popover.tiny-popper { + width: 60px; + padding: 0; +} +.tiny-pager__selector.tiny-popover.tiny-popper[x-placement^='bottom'] { + margin-top: 2px; +} +.tiny-pager__selector.tiny-popover.tiny-popper[x-placement^='top'] { + margin-bottom: 0; +} +.tiny-pager__selector-body { + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; +} +.tiny-pager__selector-poplist .list-item { + min-height: 30px; + padding: 0 8px; + line-height: 30px; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-pager__selector-poplist .list-item:hover { + cursor: pointer; + background: var(--ti-pager-poplist-item-hover-bgcolor); + color: var(--ti-pager-poplist-item-hover-text-color); +} +.tiny-pager__selector-poplist .list-item.is-selected { + background: var(--ti-pager-poplist-item-selected-bgcolor); + color: var(--ti-pager-normal-color); +} +.tiny-pager__selector-poplist .list-item.is-selected:hover { + background: var(--ti-pager-poplist-item-selected-bgcolor); +} +.tiny-pager__selector-poplist .list-item.select-pre { + background: var(--ti-pager-poplist-item-hover-bgcolor); + color: var(--ti-pager-poplist-item-hover-text-color); +} +.tiny-pager__selector-poplist .list-item.select-pre.is-selected { + color: #fff; + background: var(--ti-pager-poplist-item-selected-bgcolor); +} +.tiny-pager .tiny-pager__popover { + margin: 0 4px 0 14px; +} +.tiny-pager .tiny-pager__sizes .tiny-pager__popover { + margin: 0; +} +.tiny-pager .tiny-pager__sizes + .tiny-pager__group { + margin: 0 16px; +} +.tiny-pager .tiny-pager__group + .tiny-pager__sizes { + margin: 0 16px; +} +.tiny-pager__input { + width: 60px; + vertical-align: middle; + position: relative; +} +.tiny-pager__input input { + width: 100%; + height: var(--ti-pager-input-height); + line-height: var(--ti-pager-input-height); + border: 1px solid var(--ti-pager-input-border-color); + color: var(--ti-pager-normal-color); + border-radius: var(--ti-pager-input-border-radius); + background: #fff; + font-size: var(--ti-pager-font-size, 12px); + padding: 0 8px; + display: block; + stop-color: var(--ti-pager-input-color-disabled); + lighting-color: var(--ti-pager-input-color-hover); + padding: 6px 10px; + white-space: nowrap; + -webkit-transition: border 0.3s; + transition: border 0.3s; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-pager__input input:hover { + outline: 0; + border-color: var(--ti-pager-input-hover-border-color); +} +.tiny-pager__input input:active, +.tiny-pager__input input:focus { + outline: 0; + border-color: var(--ti-pager-input-hover-border-color); +} +.tiny-pager__input-btn { + width: 24px; + height: var(--ti-pager-height); + line-height: var(--ti-pager-height); + position: absolute; + right: 2px; + bottom: 0; + top: 0; + outline: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + overflow: hidden; + cursor: pointer; +} +.tiny-pager__input-btn svg { + font-size: var(--ti-pager-font-size); + fill: var(--ti-pager-font-normal); + vertical-align: middle; +} +.tiny-pager .tiny-popover__reference { + outline: 0; +} +@media (max-width: 768px) { + .tiny-pager { + text-align: left; + } + .tiny-pager .tiny-pager__pull-left { + float: none !important; + } +} +.dialog-pbi { + --ti-pbi-font-size-base: var(--ti-common-font-size-base); + --ti-pbi-selected-color: #138fc7; + --ti-pbi-selected-background: rgba(31, 158, 216, 0.12); + --ti-pbi-list-border-color: #ccc; +} +.dialog-pbi.tiny-dialog .dialog-body { + font-size: var(--ti-pbi-font-size-base); + font-weight: 400; +} +.dialog-pbi .tiny-selected { + color: var(--ti-pbi-selected-color); + background: var(--ti-pbi-selected-background); +} +.dialog-pbi .pbi_col { + width: 200px; + float: left; +} +.dialog-pbi .pbi_list { + height: 460px; + overflow-y: auto; + border: 1px solid var(--ti-pbi-list-border-color); + padding: 4px; +} +.tiny-dialog { + background: var(--ti-dialog-background); + padding: 0; + -webkit-box-shadow: var(--ti-dialog-shadow); + box-shadow: var(--ti-dialog-shadow); + -webkit-animation: dialog-fade-in 0.3s; + animation: dialog-fade-in 0.3s; +} +.tiny-dialog .dialog-head { + background: var(--ti-dialog-head-background); + font-size: var(--ti-dialog-head-font-size); +} +.tiny-dialog .dialog-head .dialog-title { + color: var(--ti-dialog-title-color); + display: inline-block; + font-size: var(--ti-dialog-title-font-size); + font-weight: var(--ti-dialog-title-font-weight); + margin: 0; +} +.tiny-dialog .dialog-head .dialog-operation { + float: right; +} +.tiny-dialog .dialog-head .dialog-operation > a { + color: var(--ti-dialog-operation-color); +} +.tiny-dialog .dialog-head .dialog-operation > a:hover { + color: var(--ti-dialog-operation-hover-color); +} +.tiny-dialog .dialog-head .dialog-operation > a .tiny-small-close { + font-size: var(--ti-dialog-head-font-size); +} +.tiny-dialog .dialog-body { + width: 100%; + padding: var(--ti-dialog-body-padding); + min-height: var(--ti-dialog-body-min-height); + font-size: var(--ti-dialog-body-font-size); + font-weight: 700; + overflow: auto; + overflow-x: hidden; + color: var(--ti-dialog-body-color); + max-height: 55vh !important; +} +.tiny-dialog .dialog-head-alert-confirm { + padding: 0 24px; + height: 40px; + line-height: 40px; + border-bottom: 1px solid #d9d9d9; +} +.tiny-toolbar { + clear: both; + text-align: center; +} +.tiny-transition-timepicker { + -webkit-animation: fadein 0.3s; + animation: fadein 0.3s; +} +.tiny-transition-timepicker-up { + -webkit-animation: fadeup 0.3s; + animation: fadeup 0.3s; +} +@-webkit-keyframes fadein { + 0% { + -webkit-transform: translateY(-200px); + transform: translateY(-200px); + z-index: -999; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + z-index: 0; + } +} +@keyframes fadein { + 0% { + -webkit-transform: translateY(-200px); + transform: translateY(-200px); + z-index: -999; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + z-index: 0; + } +} +@-webkit-keyframes fadeup { + 0% { + -webkit-transform: translateY(200px); + transform: translateY(200px); + z-index: -999; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + z-index: 0; + } +} +@keyframes fadeup { + 0% { + -webkit-transform: translateY(200px); + transform: translateY(200px); + z-index: -999; + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + z-index: 0; + } +} +.tiny-date-table { + font-size: var(--ti-date-picker-font-size); + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-date-table.is-week-mode .tiny-date-table__row:hover td.available:hover { + color: var(--ti-date-picker-font-color); +} +.tiny-date-table.is-week-mode .tiny-date-table__row:hover td:first-child div { + margin-left: 5px; + border-top-left-radius: var(--ti-date-table-td-border-radius); + border-bottom-left-radius: var(--ti-date-table-td-border-radius); +} +.tiny-date-table.is-week-mode .tiny-date-table__row:hover td:last-child div { + margin-right: 5px; + border-top-right-radius: var(--ti-date-table-td-border-radius); + border-bottom-right-radius: var(--ti-date-table-td-border-radius); +} +.tiny-date-table.is-week-mode .tiny-date-table__row:hover div { + background-color: var(--ti-date-picker-hover-bgcolor); +} +.tiny-date-table.is-week-mode .tiny-date-table__row.current div { + background-color: var(--ti-date-table-week-current-bgcolor); +} +.tiny-date-table.is-week-mode .tiny-date-table__row.current div:hover { + background-color: var(--ti-date-table-week-current-hover-bgcolor); +} +.tiny-date-table.is-week-mode .tiny-date-table__row.current td.available:hover span { + background-color: transparent; +} +.tiny-date-table.is-week-mode .tiny-date-table__row.current td.available.end-date span, +.tiny-date-table.is-week-mode .tiny-date-table__row.current td.available.start-date span { + background-color: var(--ti-date-picker-current-select-bgcolor); +} +.tiny-date-table td { + width: var(--ti-date-table-td-width); + height: var(--ti-date-table-td-height); + padding: var(--ti-date-table-td-padding); + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + cursor: pointer; + position: relative; +} +.tiny-date-table td div { + height: 24px; + min-width: 36px; + padding: 3px 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-date-table td span { + min-width: var(--ti-date-table-td-span-width); + height: var(--ti-date-table-td-span-height); + line-height: var(--ti-date-table-td-span-height); + display: block; + margin: 0 auto; + position: absolute; + left: 50%; + top: 5px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} +.tiny-date-table td.next-month, +.tiny-date-table td.pre-month { + color: var(--ti-date-table-td-pre-month-color); + cursor: pointer; +} +.tiny-date-table td.next-month span:hover, +.tiny-date-table td.pre-month span:hover { + background: var(--ti-datetime-beside-day-bg-color-hover); +} +.tiny-date-table td.today { + position: relative; + color: var(--ti-date-table-td-today-color); +} +.tiny-date-table td.today:after { + content: ''; + width: 12px; + height: 1px; + background: var(--ti-date-table-td-today-border-color); + position: absolute; + left: 0; + right: 0; + margin: auto; + bottom: 5px; +} +.tiny-date-table td.today.end-date span, +.tiny-date-table td.today.start-date span { + color: var(--ti-date-table-td-nomal-color); +} +.tiny-date-table td.available:hover span { + background-color: var(--ti-date-picker-hover-bgcolor); + border-radius: var(--ti-date-picker-current-border-radius); +} +.tiny-date-table td.current:not(.disabled) span { + color: var(--ti-date-table-td-nomal-color); + background-color: var(--ti-date-picker-current-select-bgcolor); + border-radius: var(--ti-date-picker-current-border-radius); +} +.tiny-date-table td.end-date div, +.tiny-date-table td.start-date div { + color: var(--ti-date-table-td-nomal-color); +} +.tiny-date-table td.end-date span, +.tiny-date-table td.start-date span { + background-color: var(--ti-date-picker-current-select-bgcolor); +} +.tiny-date-table td.start-date div { + margin-left: 5px; + border-top-left-radius: var(--ti-date-table-td-border-radius); + border-bottom-left-radius: var(--ti-date-table-td-border-radius); +} +.tiny-date-table td.end-date div { + margin-right: 5px; + border-top-right-radius: var(--ti-date-table-td-border-radius); + border-bottom-right-radius: var(--ti-date-table-td-border-radius); +} +.tiny-date-table td.disabled div { + background-color: var(--ti-date-picker-disabled-bgcolor); + opacity: 1; + cursor: not-allowed; + color: var(--ti-date-picker-disabled-color); +} +.tiny-date-table td.in-range div { + background-color: var(--ti-date-picker-range-bgcolor); +} +.tiny-date-table td.in-range div:hover { + background-color: var(--ti-date-picker-range-hover-bgcolor); +} +.tiny-date-table td.in-range.end-date:hover span, +.tiny-date-table td.in-range.start-date:hover span { + background-color: var(--ti-date-picker-current-select-bgcolor); +} +.tiny-date-table td.available { + padding: 0; +} +.tiny-date-table td.selected div { + margin-left: 5px; + margin-right: 5px; + background-color: var(--ti-date-table-td-range-bgcolor); +} +.tiny-date-table td.selected div:hover { + background-color: var(--ti-date-table-td-range-bgcolor); +} +.tiny-date-table td.selected span { + background-color: var(--ti-date-picker-current-select-bgcolor); + color: var(--ti-date-table-td-nomal-color); + border: none; +} +.tiny-date-table td.selected.available:hover span { + background-color: var(--ti-date-picker-current-select-bgcolor); +} +.tiny-date-table td.week { + font-size: 80%; + color: var(--ti-date-picker-font-color); +} +.tiny-date-table th { + color: var(--ti-date-table-th-font-color); + font-weight: 400; +} +.tiny-month-table { + font-size: var(--ti-date-picker-font-size); + margin: -1px; + border-collapse: collapse; +} +.tiny-month-table td { + text-align: center; + padding: 16px 0; + cursor: pointer; +} +.tiny-month-table td div { + height: 32px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-month-table td.today .cell { + color: var(--ti-month-table-td-color); + font-weight: 700; +} +.tiny-month-table td.today.end-date .cell, +.tiny-month-table td.today.start-date .cell { + color: var(--ti-month-table-td-date-color); +} +.tiny-month-table td.disabled .cell { + background-color: var(--ti-date-picker-disabled-bgcolor); + cursor: not-allowed; + color: var(--ti-date-picker-disabled-color); +} +.tiny-month-table td.disabled .cell:hover { + color: var(--ti-date-picker-disabled-color); +} +.tiny-month-table td .cell { + width: 100%; + height: 32px; + line-height: 32px; + display: block; + color: var(--ti-date-picker-font-color); +} +.tiny-month-table td .cell:hover { + background: var(--ti-date-picker-hover-bgcolor); +} +.tiny-month-table td.in-range div, +.tiny-month-table td.in-range div:hover { + background-color: var(--ti-month-table-td-range-bgcolor); +} +.tiny-month-table td.end-date div, +.tiny-month-table td.start-date div { + color: var(--ti-month-table-td-date-color); +} +.tiny-month-table td.end-date .cell, +.tiny-month-table td.start-date .cell { + color: var(--ti-month-table-td-date-color); + background-color: var(--ti-month-table-td-color); +} +.tiny-month-table td:not(.in-range) { + padding: 16px 4px; +} +.tiny-month-table td:not(.in-range) div { + height: auto; + padding: 0; +} +.tiny-month-table td:not(.in-range) .cell { + width: auto; + height: 32px; + line-height: 32px; + border-radius: 2px; +} +.tiny-month-table td.current:not(.disabled) .cell, +.tiny-month-table td.current:not(.disabled) .cell:hover { + color: var(--ti-date-table-td-nomal-color); + background: var(--ti-month-table-td-color); +} +.tiny-year-table { + font-size: var(--ti-date-picker-font-size); + margin: -1px; + border-collapse: collapse; +} +.tiny-year-table td { + text-align: center; + cursor: pointer; +} +.tiny-year-table td.today .cell { + color: var(--ti-year-table-td-color); + font-weight: 700; +} +.tiny-year-table td.disabled .cell { + background-color: var(--ti-date-picker-disabled-bgcolor); + cursor: not-allowed; + color: var(--ti-date-picker-disabled-color); +} +.tiny-year-table td.disabled .cell:hover { + color: var(--ti-date-picker-disabled-color); +} +.tiny-year-table td .cell { + width: 48px; + height: 24px; + line-height: 24px; + display: block; + color: var(--ti-date-picker-font-color); + margin: 0 auto; + border-radius: 2px; +} +.tiny-year-table td .cell:hover { + background: var(--ti-date-picker-hover-bgcolor); +} +.tiny-year-table td.current:not(.disabled) .cell { + color: var(--ti-date-table-td-nomal-color); + background: var(--ti-date-picker-current-select-bgcolor); +} +.tiny-year-table td.available { + padding: 16px 3px; +} +.tiny-year-table .tiny-icon { + color: var(--ti-year-table-td-icon-color); +} +.tiny-time-spinner__wrapper { + max-height: 190px; + overflow: auto; + display: inline-block; + width: 50%; + vertical-align: top; + position: relative; +} +.tiny-time-spinner__wrapper .tiny-scrollbar__wrap:not(.tiny-scrollbar__wrap--hidden-default) { + padding-bottom: 15px; +} +.tiny-time-spinner__wrapper.is-arrow { + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + overflow: hidden; +} +.tiny-time-spinner__wrapper.is-arrow .tiny-time-spinner__list { + -webkit-transform: translateY(-32px); + transform: translateY(-32px); +} +.tiny-time-spinner__wrapper.is-arrow .tiny-time-spinner__item:hover:not(.disabled):not(.active) { + background: var(--ti-date-picker-bgcolor); + cursor: default; +} +.tiny-time-spinner__wrapper .tiny-time-spinner__list { + -webkit-transform: translateY(-6px); + transform: translateY(-6px); +} +.tiny-time-spinner__wrapper:last-child .tiny-time-spinner__list { + border-right: 0; +} +.tiny-time-spinner__arrow { + font-size: var(--ti-date-picker-font-size); + color: var(--ti-time-spinner-arrow-color); + height: 30px; + line-height: 30px; + position: absolute; + left: 0; + width: 100%; + z-index: 1; + text-align: center; + cursor: pointer; +} +.tiny-time-spinner__arrow .tiny-svg { + fill: var(--ti-time-spinner-arrow-color); +} +.tiny-time-spinner__arrow:hover .tiny-svg { + fill: var(--ti-time-spinner-arrow-hover-color); +} +.tiny-time-spinner__arrow.tiny-icon-arrow-up { + top: 10px; +} +.tiny-time-spinner__arrow.tiny-icon-arrow-down { + bottom: 10px; +} +.tiny-time-spinner__arrow.tiny-input { + width: 70%; +} +.tiny-time-spinner__arrow.tiny-input .tiny-input__inner { + padding: 0; + text-align: center; +} +.tiny-time-spinner__list { + padding: 0; + margin: 0; + list-style: none; + text-align: center; + border-right: 1px solid var(--ti-time-spinner-list-border-color); +} +.tiny-time-spinner__list::after, +.tiny-time-spinner__list::before { + content: ''; + display: block; + width: 100%; + height: 80px; +} +.tiny-time-spinner__item { + font-size: var(--ti-date-picker-font-size); + color: var(--ti-date-picker-font-color); + height: 32px; + line-height: 32px; +} +.tiny-time-spinner__item:hover:not(.disabled):not(.active) { + background: var(--ti-date-picker-selected-bgcolor); + cursor: pointer; +} +.tiny-time-spinner__item.active:not(.disabled) { + color: var(--ti-time-spinner-item-active-color); + font-weight: var(--ti-time-spinner-item-font-weight); + background-color: var(--ti-time-spinner-item-bgcolor); +} +.tiny-time-spinner__item.disabled { + color: var(--ti-date-picker-disabled-color); + cursor: not-allowed; +} +.tiny-time-spinner.has-seconds .tiny-time-spinner__wrapper { + width: 33.3%; +} +.tiny-date-editor { + --ti-date-picker-width: 280px; + --ti-date-picker-font-size: var(--ti-common-font-size-base); + --ti-date-picker-font-color: var(--ti-base-color-info-normal); + --ti-date-picker-bgcolor: var(--ti-base-color-light); + --ti-date-picker-border-radius: var(--ti-common-border-radius-normal); + --ti-date-picker-border-color: var(--ti-common-color-line-dividing); + --ti-date-picker-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-disabled-color: var(--ti-common-color-text-disabled); + --ti-date-picker-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-date-picker-selected-bgcolor: #f2f2f3; + --ti-date-picker-icon-font-size: var(--ti-common-font-size-1); + --ti-date-picker-current-select-bgcolor: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-color: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-radius: 0; + --ti-date-picker-range-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-range-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-td-width: 36px; + --ti-date-table-td-height: 34px; + --ti-date-table-td-padding: 4px 0; + --ti-date-table-td-span-width: 36px; + --ti-date-table-td-span-height: 24px; + --ti-date-table-th-font-color: var(--ti-base-color-common-2); + --ti-date-table-td-border-radius: 0; + --ti-date-table-td-pre-month-color: var(--ti-base-color-common-2); + --ti-date-table-td-nomal-color: var(--ti-base-color-light); + --ti-date-table-td-range-bgcolor: #f2f6fc; + --ti-date-table-td-today-border-color: var(--ti-base-color-brand-6); + --ti-date-table-td-today-color: var(--ti-date-picker-font-color); + --ti-date-table-week-current-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-week-current-hover-bgcolor: var(--ti-base-color-brand-3); + --ti-month-table-td-color: var(--ti-base-color-brand-7); + --ti-month-table-td-range-bgcolor: #f2f6fc; + --ti-month-table-td-date-color: var(--ti-base-color-light); + --ti-month-table-td-date-border-radius: 24px; + --ti-year-table-td-color: var(--ti-base-color-brand-7); + --ti-year-table-td-icon-color: #303133; + --ti-time-spinner-arrow-color: #909399; + --ti-time-spinner-arrow-hover-color: var(--ti-base-color-brand-7); + --ti-time-spinner-item-active-color: #303133; + --ti-time-spinner-item-font-weight: 700; + --ti-time-spinner-item-bgcolor: transparent; + --ti-time-spinner-list-border-color: transparent; + --ti-picker-panel-line-height: var(--ti-base-size-height-minor); + --ti-picker-panel-shortcut-font-size: var(--ti-common-font-size-1); + --ti-picker-panel-icon-btn-color: var(--ti-base-color-common-2); + --ti-picker-panel-icon-btn-hover-color: var(--ti-base-color-brand-7); + --ti-picker-panel-icon-btn-disabled-color: var(--ti-base-color-bg-5); + --ti-picker-panel-border-color: rgba(0, 0, 0, 0.15); + --ti-picker-panel-box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + --ti-date-picker-header-label-hover-color: var(--ti-base-color-brand-7); + --ti-date-range-picker-header-font-size: var(--ti-common-font-size-2); + --ti-date-range-picker-time-header-icon-color: #303133; + --ti-time-range-picker-header-font-size: var(--ti-common-font-size-1); + --ti-time-panel-footer-height: 36px; + --ti-time-panel-btn-color: #303133; + --ti-time-panel-btn-confirm-color: var(--ti-base-color-brand-7); + --ti-range-separator-color: #303133; + --ti-time-panel-border-color: var(--ti-date-picker-border-color); + --ti-time-panel-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-time-panel-content-split-line-display: block; + --ti-time-panel-btn-cancel-display: inline-block; + --ti-time-panel-btn-bgcolor: transparent; + --ti-time-panel-btn-padding: 0 5px; + --ti-time-panel-btn-radius: var(--ti-common-border-radius-normal); + --ti-time-panel-btn-height: 28px; + --ti-time-panel-btn-min-width: inherit; + --ti-time-panel-btn-font-weight: 800; + --ti-time-panel-btn-confirm-hover-bgcolor: transparent; + --ti-date-editor-input-icon-fill-color: #575d6c; + position: relative; + display: inline-block; + text-align: left; +} +.tiny-date-editor.tiny-input, +.tiny-date-editor.tiny-input__inner { + width: 100%; +} +.tiny-date-editor--monthrange.tiny-input, +.tiny-date-editor--monthrange.tiny-input__inner { + width: 300px; +} +.tiny-date-editor--daterange.tiny-input, +.tiny-date-editor--daterange.tiny-input__inner, +.tiny-date-editor--timerange.tiny-input, +.tiny-date-editor--timerange.tiny-input__inner { + width: 350px; +} +.tiny-date-editor--datetimerange.tiny-input, +.tiny-date-editor--datetimerange.tiny-input__inner { + width: 400px; +} +.tiny-date-editor--dates .tiny-input__inner { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-date-editor .tiny-input__icon { + cursor: pointer; + fill: var(--ti-date-editor-input-icon-fill-color); +} +.tiny-date-editor .tiny-input__icon .baseClearicon { + margin-right: 8px; + fill: #252b3a; +} +.tiny-date-editor .tiny-input__icon .baseClearicon:hover { + fill: var(--ti-input-clear-color-hover); +} +.tiny-date-editor .tiny-input__icon:not(.tiny-range__icon) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-date-editor .tiny-range__icon { + font-size: var(--ti-date-picker-icon-font-size); + color: #c0c4cc; + margin-left: -5px; + float: left; + line-height: 1; +} +.tiny-date-editor .tiny-range-input, +.tiny-date-editor .tiny-range-separator { + font-size: var(--ti-date-picker-font-size); + height: 100%; + margin: 0; + text-align: center; + display: inline-block; +} +.tiny-date-editor .tiny-range-input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: none; + outline: 0; + padding: 0; + width: 39%; + color: var(--ti-date-picker-font-color); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-date-editor .tiny-range-input::-moz-placeholder { + color: #999; + opacity: 1; +} +.tiny-date-editor .tiny-range-input:-ms-input-placeholder { + color: #999; +} +.tiny-date-editor .tiny-range-input::-webkit-input-placeholder { + color: #999; +} +.tiny-date-editor .tiny-range-input::-ms-input-placeholder { + color: #999; +} +.tiny-date-editor .tiny-range-input::placeholder { + color: #999; +} +.tiny-date-editor .tiny-range-separator { + padding: 0 5px; + line-height: 22px; + width: 12%; + color: var(--ti-range-separator-color); +} +.tiny-date-editor .tiny-range__close-icon { + font-size: var(--ti-date-picker-icon-font-size); + width: 25px; + float: right; + line-height: 32px; + margin-right: 14px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-date-editor .tiny-range__close-icon, +.tiny-date-editor .tiny-range__close-icon:hover { + fill: var(--ti-input-icon-close-color); +} +.tiny-range-editor.tiny-input__inner { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 3px 10px; +} +.tiny-range-editor .tiny-range-input { + line-height: 1; +} +.tiny-range-editor.is-active, +.tiny-range-editor.is-active:hover { + border-color: var(--ti-date-picker-current-border-color); +} +.tiny-range-editor--medium.tiny-input__inner { + height: 42px; +} +.tiny-range-editor--medium .tiny-range-separator { + line-height: 34px; + font-size: var(--ti-common-font-size-2); +} +.tiny-range-editor--medium .tiny-range-input { + font-size: var(--ti-common-font-size-2); +} +.tiny-range-editor--medium .tiny-range__close-icon, +.tiny-range-editor--medium .tiny-range__icon { + line-height: 34px; +} +.tiny-range-editor--small.tiny-input__inner { + height: 36px; +} +.tiny-range-editor--small .tiny-range-separator { + line-height: 28px; + font-size: var(--ti-common-font-size-1); +} +.tiny-range-editor--small .tiny-range-input { + font-size: var(--ti-common-font-size-1); +} +.tiny-range-editor--small .tiny-range__close-icon, +.tiny-range-editor--small .tiny-range__icon { + line-height: 28px; +} +.tiny-range-editor--mini.tiny-input__inner { + height: 24px; +} +.tiny-range-editor--mini .tiny-range-separator { + line-height: 16px; + font-size: var(--ti-common-font-size-base); +} +.tiny-range-editor--mini .tiny-range-input { + font-size: var(--ti-common-font-size-base); +} +.tiny-range-editor--mini .tiny-range__close-icon, +.tiny-range-editor--mini .tiny-range__icon { + line-height: 16px; +} +.tiny-range-editor.is-disabled { + background-color: var(--ti-date-picker-disabled-bgcolor); + border-color: var(--ti-date-picker-border-color); + color: var(--ti-date-picker-disabled-color); + cursor: not-allowed; +} +.tiny-range-editor.is-disabled:focus, +.tiny-range-editor.is-disabled:hover { + border-color: var(--ti-date-picker-border-color); +} +.tiny-range-editor.is-disabled input { + color: var(--ti-date-picker-disabled-color); + background-color: var(--ti-date-picker-disabled-bgcolor); + cursor: not-allowed; +} +.tiny-range-editor.is-disabled input::-moz-placeholder { + color: #999; + opacity: 1; +} +.tiny-range-editor.is-disabled input:-ms-input-placeholder { + color: #999; +} +.tiny-range-editor.is-disabled input::-webkit-input-placeholder { + color: #999; +} +.tiny-range-editor.is-disabled input::-ms-input-placeholder { + color: #999; +} +.tiny-range-editor.is-disabled input::placeholder { + color: #999; +} +.tiny-range-editor.is-disabled .tiny-range-separator { + color: var(--ti-date-picker-disabled-color); +} +.tiny-picker-panel { + --ti-date-picker-width: 280px; + --ti-date-picker-font-size: var(--ti-common-font-size-base); + --ti-date-picker-font-color: var(--ti-base-color-info-normal); + --ti-date-picker-bgcolor: var(--ti-base-color-light); + --ti-date-picker-border-radius: var(--ti-common-border-radius-normal); + --ti-date-picker-border-color: var(--ti-common-color-line-dividing); + --ti-date-picker-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-disabled-color: var(--ti-common-color-text-disabled); + --ti-date-picker-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-date-picker-selected-bgcolor: #f2f2f3; + --ti-date-picker-icon-font-size: var(--ti-common-font-size-1); + --ti-date-picker-current-select-bgcolor: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-color: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-radius: 0; + --ti-date-picker-range-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-range-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-td-width: 36px; + --ti-date-table-td-height: 34px; + --ti-date-table-td-padding: 4px 0; + --ti-date-table-td-span-width: 36px; + --ti-date-table-td-span-height: 24px; + --ti-date-table-th-font-color: var(--ti-base-color-common-2); + --ti-date-table-td-border-radius: 0; + --ti-date-table-td-pre-month-color: var(--ti-base-color-common-2); + --ti-date-table-td-nomal-color: var(--ti-base-color-light); + --ti-date-table-td-range-bgcolor: #f2f6fc; + --ti-date-table-td-today-border-color: var(--ti-base-color-brand-6); + --ti-date-table-td-today-color: var(--ti-date-picker-font-color); + --ti-date-table-week-current-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-week-current-hover-bgcolor: var(--ti-base-color-brand-3); + --ti-month-table-td-color: var(--ti-base-color-brand-7); + --ti-month-table-td-range-bgcolor: #f2f6fc; + --ti-month-table-td-date-color: var(--ti-base-color-light); + --ti-month-table-td-date-border-radius: 24px; + --ti-year-table-td-color: var(--ti-base-color-brand-7); + --ti-year-table-td-icon-color: #303133; + --ti-time-spinner-arrow-color: #909399; + --ti-time-spinner-arrow-hover-color: var(--ti-base-color-brand-7); + --ti-time-spinner-item-active-color: #303133; + --ti-time-spinner-item-font-weight: 700; + --ti-time-spinner-item-bgcolor: transparent; + --ti-time-spinner-list-border-color: transparent; + --ti-picker-panel-line-height: var(--ti-base-size-height-minor); + --ti-picker-panel-shortcut-font-size: var(--ti-common-font-size-1); + --ti-picker-panel-icon-btn-color: var(--ti-base-color-common-2); + --ti-picker-panel-icon-btn-hover-color: var(--ti-base-color-brand-7); + --ti-picker-panel-icon-btn-disabled-color: var(--ti-base-color-bg-5); + --ti-picker-panel-border-color: rgba(0, 0, 0, 0.15); + --ti-picker-panel-box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + --ti-date-picker-header-label-hover-color: var(--ti-base-color-brand-7); + --ti-date-range-picker-header-font-size: var(--ti-common-font-size-2); + --ti-date-range-picker-time-header-icon-color: #303133; + --ti-time-range-picker-header-font-size: var(--ti-common-font-size-1); + --ti-time-panel-footer-height: 36px; + --ti-time-panel-btn-color: #303133; + --ti-time-panel-btn-confirm-color: var(--ti-base-color-brand-7); + --ti-range-separator-color: #303133; + --ti-time-panel-border-color: var(--ti-date-picker-border-color); + --ti-time-panel-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-time-panel-content-split-line-display: block; + --ti-time-panel-btn-cancel-display: inline-block; + --ti-time-panel-btn-bgcolor: transparent; + --ti-time-panel-btn-padding: 0 5px; + --ti-time-panel-btn-radius: var(--ti-common-border-radius-normal); + --ti-time-panel-btn-height: 28px; + --ti-time-panel-btn-min-width: inherit; + --ti-time-panel-btn-font-weight: 800; + --ti-time-panel-btn-confirm-hover-bgcolor: transparent; + --ti-date-editor-input-icon-fill-color: #575d6c; + color: var(--ti-date-picker-font-color); + font-size: var(--ti-date-picker-font-size); + border: 1px solid var(--ti-picker-panel-border-color); + -webkit-box-shadow: var(--ti-picker-panel-box-shadow); + box-shadow: var(--ti-picker-panel-box-shadow); + background: var(--ti-date-picker-bgcolor); + border-radius: var(--ti-common-border-radius-normal); + line-height: var(--ti-picker-panel-line-height); + margin: var(--ti-base-dropdown-gap) 0; +} +.tiny-picker-panel__body-wrapper::after, +.tiny-picker-panel__body::after { + content: ''; + display: table; + clear: both; +} +.tiny-picker-panel__body { + padding-bottom: 8px; +} +.tiny-picker-panel__content { + position: relative; +} +.tiny-picker-panel__footer { + border-top: 1px solid var(--ti-date-picker-border-color); + padding: 6px 16px; + background-color: var(--ti-date-picker-bgcolor); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-picker-panel__footer .tiny-button { + min-width: 60px; +} +.tiny-picker-panel__footer .tiny-button:only-child { + float: right; +} +.tiny-picker-panel__footer .tiny-button--text { + text-align: left; +} +.tiny-picker-panel__shortcut { + display: block; + width: 100%; + border: 0; + background-color: transparent; + line-height: 28px; + font-size: var(--ti-picker-panel-shortcut-font-size); + color: var(--ti-date-picker-font-color); + padding-left: 12px; + text-align: left; + outline: 0; + cursor: pointer; +} +.tiny-picker-panel__shortcut:hover { + background-color: var(--ti-date-picker-hover-bgcolor); +} +.tiny-picker-panel__shortcut.active { + background-color: var(--ti-date-picker-selected-bgcolor); +} +.tiny-picker-panel__btn { + color: var(--ti-date-picker-font-color); + border: 1px solid var(--ti-date-picker-border-color); + font-size: var(--ti-date-picker-font-size); + line-height: 24px; + border-radius: var(--ti-date-picker-border-radius); + padding: 0 20px; + cursor: pointer; + outline: 0; + background-color: transparent; +} +.tiny-picker-panel__btn [disabled] { + color: var(--ti-date-picker-disabled-color); + cursor: not-allowed; +} +.tiny-picker-panel__icon-btn { + font-size: var(--ti-date-picker-font-size); + line-height: 30px; + fill: var(--ti-picker-panel-icon-btn-color); + border: 0; + background: 0 0; + cursor: pointer; + outline: 0; +} +.tiny-picker-panel__icon-btn:hover { + fill: var(--ti-picker-panel-icon-btn-hover-color); +} +.tiny-picker-panel__icon-btn.is-disabled { + color: var(--ti-picker-panel-icon-btn-disabled-color); +} +.tiny-picker-panel__icon-btn.is-disabled:hover { + cursor: not-allowed; +} +.tiny-picker-panel__link-btn { + vertical-align: middle; +} +.tiny-picker-panel [slot='sidebar'], +.tiny-picker-panel__sidebar { + position: absolute; + top: 0; + bottom: 0; + width: 110px; + border-right: 1px solid var(--ti-date-picker-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-top: 6px; + background-color: var(--ti-date-picker-bgcolor); + overflow: auto; +} +.tiny-picker-panel [slot='sidebar'] + .tiny-picker-panel__body, +.tiny-picker-panel__sidebar + .tiny-picker-panel__body { + margin-left: 110px; +} +.tiny-picker-panel__timezone { + margin-bottom: 10px; +} +.tiny-picker-panel__timezone .tiny-picker-panel__tzlist { + z-index: 10; + overflow-y: hidden; +} +.tiny-picker-panel__timezone .tiny-picker-panel__tzlist-li { + height: 30px; + line-height: 30px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 10px; + border: 1px solid #f4f0f0; + cursor: pointer; +} +.tiny-picker-panel__timezone .tiny-picker-panel__tzlist .tiny-popup { + position: absolute; + width: 238px; + bottom: 77px; + max-height: 260px; + -webkit-box-shadow: 0 -1px 2px 0 rgba(53, 29, 29, 0.5); + box-shadow: 0 -1px 2px 0 rgba(53, 29, 29, 0.5); +} +.tiny-picker-panel__timezone .tiny-input { + position: relative; +} +.tiny-date-picker { + --ti-date-picker-width: 280px; + --ti-date-picker-font-size: var(--ti-common-font-size-base); + --ti-date-picker-font-color: var(--ti-base-color-info-normal); + --ti-date-picker-bgcolor: var(--ti-base-color-light); + --ti-date-picker-border-radius: var(--ti-common-border-radius-normal); + --ti-date-picker-border-color: var(--ti-common-color-line-dividing); + --ti-date-picker-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-disabled-color: var(--ti-common-color-text-disabled); + --ti-date-picker-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-date-picker-selected-bgcolor: #f2f2f3; + --ti-date-picker-icon-font-size: var(--ti-common-font-size-1); + --ti-date-picker-current-select-bgcolor: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-color: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-radius: 0; + --ti-date-picker-range-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-range-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-td-width: 36px; + --ti-date-table-td-height: 34px; + --ti-date-table-td-padding: 4px 0; + --ti-date-table-td-span-width: 36px; + --ti-date-table-td-span-height: 24px; + --ti-date-table-th-font-color: var(--ti-base-color-common-2); + --ti-date-table-td-border-radius: 0; + --ti-date-table-td-pre-month-color: var(--ti-base-color-common-2); + --ti-date-table-td-nomal-color: var(--ti-base-color-light); + --ti-date-table-td-range-bgcolor: #f2f6fc; + --ti-date-table-td-today-border-color: var(--ti-base-color-brand-6); + --ti-date-table-td-today-color: var(--ti-date-picker-font-color); + --ti-date-table-week-current-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-week-current-hover-bgcolor: var(--ti-base-color-brand-3); + --ti-month-table-td-color: var(--ti-base-color-brand-7); + --ti-month-table-td-range-bgcolor: #f2f6fc; + --ti-month-table-td-date-color: var(--ti-base-color-light); + --ti-month-table-td-date-border-radius: 24px; + --ti-year-table-td-color: var(--ti-base-color-brand-7); + --ti-year-table-td-icon-color: #303133; + --ti-time-spinner-arrow-color: #909399; + --ti-time-spinner-arrow-hover-color: var(--ti-base-color-brand-7); + --ti-time-spinner-item-active-color: #303133; + --ti-time-spinner-item-font-weight: 700; + --ti-time-spinner-item-bgcolor: transparent; + --ti-time-spinner-list-border-color: transparent; + --ti-picker-panel-line-height: var(--ti-base-size-height-minor); + --ti-picker-panel-shortcut-font-size: var(--ti-common-font-size-1); + --ti-picker-panel-icon-btn-color: var(--ti-base-color-common-2); + --ti-picker-panel-icon-btn-hover-color: var(--ti-base-color-brand-7); + --ti-picker-panel-icon-btn-disabled-color: var(--ti-base-color-bg-5); + --ti-picker-panel-border-color: rgba(0, 0, 0, 0.15); + --ti-picker-panel-box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + --ti-date-picker-header-label-hover-color: var(--ti-base-color-brand-7); + --ti-date-range-picker-header-font-size: var(--ti-common-font-size-2); + --ti-date-range-picker-time-header-icon-color: #303133; + --ti-time-range-picker-header-font-size: var(--ti-common-font-size-1); + --ti-time-panel-footer-height: 36px; + --ti-time-panel-btn-color: #303133; + --ti-time-panel-btn-confirm-color: var(--ti-base-color-brand-7); + --ti-range-separator-color: #303133; + --ti-time-panel-border-color: var(--ti-date-picker-border-color); + --ti-time-panel-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-time-panel-content-split-line-display: block; + --ti-time-panel-btn-cancel-display: inline-block; + --ti-time-panel-btn-bgcolor: transparent; + --ti-time-panel-btn-padding: 0 5px; + --ti-time-panel-btn-radius: var(--ti-common-border-radius-normal); + --ti-time-panel-btn-height: 28px; + --ti-time-panel-btn-min-width: inherit; + --ti-time-panel-btn-font-weight: 800; + --ti-time-panel-btn-confirm-hover-bgcolor: transparent; + --ti-date-editor-input-icon-fill-color: #575d6c; + width: var(--ti-date-picker-width); +} +.tiny-date-picker.has-sidebar.has-time { + width: 434px; +} +.tiny-date-picker.has-sidebar { + width: 398px; +} +.tiny-date-picker.has-time .tiny-picker-panel__body-wrapper { + position: relative; +} +.tiny-date-picker table { + table-layout: fixed; + width: 100%; +} +.tiny-date-picker__editor-wrap { + position: relative; + display: table-cell; + padding: 0 5px; +} +.tiny-date-picker__time-header { + position: relative; + border-bottom: 1px solid var(--ti-date-picker-border-color); + font-size: var(--ti-date-picker-font-size); + padding: 8px 5px 5px; + display: table; + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-date-picker__header { + margin: 12px; + text-align: center; +} +.tiny-date-picker__header--bordered { + margin-bottom: 0; + padding-bottom: 12px; + border-bottom: 1px solid var(--ti-date-picker-border-color); +} +.tiny-date-picker__header--bordered + .tiny-picker-panel__content { + margin-top: 0; +} +.tiny-date-picker__header-label { + font-size: var(--ti-date-picker-font-size); + font-weight: 700; + padding: 0 4px; + text-align: center; + cursor: pointer; + color: var(--ti-date-picker-font-color); + vertical-align: middle; +} +.tiny-date-picker__header-label.active, +.tiny-date-picker__header-label:hover { + color: var(--ti-date-picker-header-label-hover-color); +} +.tiny-date-picker__prev-btn { + float: left; +} +.tiny-date-picker__next-btn { + float: right; +} +.tiny-date-picker__time-wrap { + padding: 10px; + text-align: center; +} +.tiny-date-picker__time-label { + float: left; + cursor: pointer; + line-height: 30px; + margin-left: 10px; +} +.tiny-date-range-picker { + width: 558px; +} +.tiny-date-range-picker.has-sidebar { + width: 668px; +} +.tiny-date-range-picker table { + table-layout: fixed; + width: 100%; +} +.tiny-date-range-picker .tiny-picker-panel__body { + min-width: var(--ti-date-range-picker-body-min-width); +} +.tiny-date-range-picker .tiny-picker-panel__content { + margin: 0; +} +.tiny-date-range-picker__header { + position: relative; + text-align: center; + height: 28px; +} +.tiny-date-range-picker__header [class*='arrow-left'] { + float: left; +} +.tiny-date-range-picker__header [class*='arrow-right'] { + float: right; +} +.tiny-date-range-picker__header div { + font-size: var(--ti-date-range-picker-header-font-size); + font-weight: 500; + margin-right: 50px; +} +.tiny-date-range-picker__content { + float: left; + width: 50%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 16px; +} +.tiny-date-range-picker__content.is-left { + border-right: 1px solid var(--ti-date-picker-border-color); +} +.tiny-date-range-picker__content .tiny-date-range-picker__header div { + margin-left: 50px; + margin-right: 50px; +} +.tiny-date-range-picker__editors-wrap { + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: table-cell; +} +.tiny-date-range-picker__editors-wrap.is-right { + text-align: right; +} +.tiny-date-range-picker__time-header { + position: relative; + border-bottom: 1px solid var(--ti-date-picker-border-color); + font-size: var(--ti-date-picker-font-size); + padding: 8px 5px 5px; + display: table; + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-date-range-picker__time-header > .tiny-icon-arrow-right { + font-size: var(--ti-common-font-size-4); + vertical-align: middle; + display: table-cell; + color: var(--ti-date-range-picker-time-header-icon-color); +} +.tiny-date-range-picker__time-picker-wrap { + position: relative; + display: table-cell; + padding: 0 5px; +} +.tiny-date-range-picker__time-picker-wrap .tiny-picker-panel { + position: absolute; + top: 13px; + right: 0; + z-index: 1; + background: var(--ti-date-picker-bgcolor); +} +.tiny-time-range-picker { + width: 354px; + overflow: visible; +} +.tiny-time-range-picker__content { + position: relative; + text-align: center; + padding: 10px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.tiny-time-range-picker__cell { + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 4px 7px 7px; + width: 50%; +} +.tiny-time-range-picker__header { + margin-bottom: 5px; + text-align: center; + font-size: var(--ti-time-range-picker-header-font-size); +} +.tiny-time-range-picker__body { + border-radius: var(--ti-date-picker-border-radius); + border: 1px solid var(--ti-date-picker-border-color); +} +.tiny-time-panel { + --ti-date-picker-width: 280px; + --ti-date-picker-font-size: var(--ti-common-font-size-base); + --ti-date-picker-font-color: var(--ti-base-color-info-normal); + --ti-date-picker-bgcolor: var(--ti-base-color-light); + --ti-date-picker-border-radius: var(--ti-common-border-radius-normal); + --ti-date-picker-border-color: var(--ti-common-color-line-dividing); + --ti-date-picker-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-disabled-color: var(--ti-common-color-text-disabled); + --ti-date-picker-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-date-picker-selected-bgcolor: #f2f2f3; + --ti-date-picker-icon-font-size: var(--ti-common-font-size-1); + --ti-date-picker-current-select-bgcolor: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-color: var(--ti-base-color-brand-6); + --ti-date-picker-current-border-radius: 0; + --ti-date-picker-range-bgcolor: var(--ti-base-color-brand-2); + --ti-date-picker-range-hover-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-td-width: 36px; + --ti-date-table-td-height: 34px; + --ti-date-table-td-padding: 4px 0; + --ti-date-table-td-span-width: 36px; + --ti-date-table-td-span-height: 24px; + --ti-date-table-th-font-color: var(--ti-base-color-common-2); + --ti-date-table-td-border-radius: 0; + --ti-date-table-td-pre-month-color: var(--ti-base-color-common-2); + --ti-date-table-td-nomal-color: var(--ti-base-color-light); + --ti-date-table-td-range-bgcolor: #f2f6fc; + --ti-date-table-td-today-border-color: var(--ti-base-color-brand-6); + --ti-date-table-td-today-color: var(--ti-date-picker-font-color); + --ti-date-table-week-current-bgcolor: var(--ti-base-color-brand-2); + --ti-date-table-week-current-hover-bgcolor: var(--ti-base-color-brand-3); + --ti-month-table-td-color: var(--ti-base-color-brand-7); + --ti-month-table-td-range-bgcolor: #f2f6fc; + --ti-month-table-td-date-color: var(--ti-base-color-light); + --ti-month-table-td-date-border-radius: 24px; + --ti-year-table-td-color: var(--ti-base-color-brand-7); + --ti-year-table-td-icon-color: #303133; + --ti-time-spinner-arrow-color: #909399; + --ti-time-spinner-arrow-hover-color: var(--ti-base-color-brand-7); + --ti-time-spinner-item-active-color: #303133; + --ti-time-spinner-item-font-weight: 700; + --ti-time-spinner-item-bgcolor: transparent; + --ti-time-spinner-list-border-color: transparent; + --ti-picker-panel-line-height: var(--ti-base-size-height-minor); + --ti-picker-panel-shortcut-font-size: var(--ti-common-font-size-1); + --ti-picker-panel-icon-btn-color: var(--ti-base-color-common-2); + --ti-picker-panel-icon-btn-hover-color: var(--ti-base-color-brand-7); + --ti-picker-panel-icon-btn-disabled-color: var(--ti-base-color-bg-5); + --ti-picker-panel-border-color: rgba(0, 0, 0, 0.15); + --ti-picker-panel-box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + --ti-date-picker-header-label-hover-color: var(--ti-base-color-brand-7); + --ti-date-range-picker-header-font-size: var(--ti-common-font-size-2); + --ti-date-range-picker-time-header-icon-color: #303133; + --ti-time-range-picker-header-font-size: var(--ti-common-font-size-1); + --ti-time-panel-footer-height: 36px; + --ti-time-panel-btn-color: #303133; + --ti-time-panel-btn-confirm-color: var(--ti-base-color-brand-7); + --ti-range-separator-color: #303133; + --ti-time-panel-border-color: var(--ti-date-picker-border-color); + --ti-time-panel-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-time-panel-content-split-line-display: block; + --ti-time-panel-btn-cancel-display: inline-block; + --ti-time-panel-btn-bgcolor: transparent; + --ti-time-panel-btn-padding: 0 5px; + --ti-time-panel-btn-radius: var(--ti-common-border-radius-normal); + --ti-time-panel-btn-height: 28px; + --ti-time-panel-btn-min-width: inherit; + --ti-time-panel-btn-font-weight: 800; + --ti-time-panel-btn-confirm-hover-bgcolor: transparent; + --ti-date-editor-input-icon-fill-color: #575d6c; + margin: 5px 0; + border: 1px solid var(--ti-time-panel-border-color); + background-color: var(--ti-date-picker-bgcolor); + -webkit-box-shadow: var(--ti-time-panel-box-shadow); + box-shadow: var(--ti-time-panel-box-shadow); + border-radius: var(--ti-date-picker-border-radius); + position: absolute; + width: 180px; + left: 0; + z-index: 1000; + -webkit-box-sizing: content-box; + box-sizing: content-box; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-time-panel__content { + font-size: 0; + position: relative; + overflow: hidden; +} +.tiny-time-panel__content:after, +.tiny-time-panel__content:before { + display: var(--ti-time-panel-content-split-line-display); + content: ''; + top: 50%; + position: absolute; + margin-top: -19px; + height: 32px; + z-index: -1; + left: 0; + right: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-top: 6px; + text-align: left; + border-top: 1px solid var(--ti-date-picker-border-color); + border-bottom: 1px solid var(--ti-date-picker-border-color); +} +.tiny-time-panel__content:after { + left: 50%; + margin-left: 12%; + margin-right: 12%; +} +.tiny-time-panel__content:before { + padding-left: 50%; + margin-right: 12%; + margin-left: 12%; +} +.tiny-time-panel__content.has-seconds:after { + left: calc(100% / 3 * 2); +} +.tiny-time-panel__content.has-seconds:before { + padding-left: calc(100% / 3); +} +.tiny-time-panel__footer { + border-top: 1px solid var(--ti-date-picker-border-color); + padding: 4px; + height: 36px; + height: var(--ti-time-panel-footer-height, 36px); + line-height: 25px; + text-align: right; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-time-panel__btn { + min-width: var(--ti-time-panel-btn-min-width); + border: none; + line-height: var(--ti-time-panel-btn-height); + padding: var(--ti-time-panel-btn-padding); + margin: 0 5px; + cursor: pointer; + background-color: var(--ti-time-panel-btn-bgcolor); + outline: 0; + font-size: 12px; + color: var(--ti-time-panel-btn-color); + border-radius: var(--ti-time-panel-btn-radius); + -webkit-transition: background-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: background-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-time-panel__btn.cancel { + display: var(--ti-time-panel-btn-cancel-display); +} +.tiny-time-panel__btn.confirm { + font-weight: var(--ti-time-panel-btn-font-weight); + color: var(--ti-time-panel-btn-confirm-color); +} +.tiny-time-panel__btn.confirm:hover { + background-color: var(--ti-time-panel-btn-confirm-hover-bgcolor); +} +.tiny-time-select .tiny-time-select__item { + color: var(--ti-date-picker-font-color); + font-size: var(--ti-common-font-size-base); + padding: 0 8px; + line-height: var(--ti-base-size-height-normal); + height: var(--ti-base-size-height-normal); +} +.tiny-time-select .tiny-time-select__item:not(.disabled):hover { + background-color: var(--ti-date-picker-hover-bgcolor); + cursor: pointer; +} +.tiny-time-select .tiny-time-select__item.selected:not(.disabled) { + background-color: var(--ti-date-picker-selected-bgcolor); +} +.tiny-time-select .tiny-time-select__item.disabled { + color: var(--ti-date-picker-disabled-color); + cursor: not-allowed; +} +.tiny-scrollbar { + overflow: hidden; + position: relative; +} +.tiny-scrollbar:active > .tiny-scrollbar__bar, +.tiny-scrollbar:focus > .tiny-scrollbar__bar, +.tiny-scrollbar:hover > .tiny-scrollbar__bar { + opacity: 1; + -webkit-transition: opacity 340ms ease-out; + transition: opacity 340ms ease-out; +} +.tiny-scrollbar__wrap { + overflow: scroll; + height: 100%; +} +.tiny-scrollbar__wrap--hidden-default::-webkit-scrollbar { + width: 0; + height: 0; +} +.tiny-scrollbar__thumb { + position: relative; + display: block; + width: 0; + height: 0; + cursor: pointer; + border-radius: inherit; + background-color: rgba(144, 147, 153, 0.3); + -webkit-transition: 0.3s background-color; + transition: 0.3s background-color; +} +.tiny-scrollbar__thumb:hover { + background-color: rgba(144, 147, 153, 0.5); +} +.tiny-scrollbar__bar { + position: absolute; + right: 2px; + bottom: 2px; + z-index: 1; + border-radius: 4px; + opacity: 0; + -webkit-transition: opacity 120ms ease-out; + transition: opacity 120ms ease-out; +} +.tiny-scrollbar__bar.is-vertical { + width: 6px; + top: 2px; +} +.tiny-scrollbar__bar.is-vertical > div { + width: 100%; +} +.tiny-scrollbar__bar.is-horizontal { + height: 6px; + left: 2px; +} +.tiny-scrollbar__bar.is-horizontal > div { + height: 100%; +} +.tiny-fade-in-linear-enter-active, +.tiny-fade-in-linear-leave-active { + -webkit-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.tiny-fade-in-linear-enter, +.tiny-fade-in-linear-enter-from, +.tiny-fade-in-linear-leave, +.tiny-fade-in-linear-leave-active, +.tiny-fade-in-linear-leave-from { + opacity: 0; +} +.tiny-fade-in-enter-active, +.tiny-fade-in-leave-active { + -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.tiny-fade-in-enter, +.tiny-fade-in-enter-from, +.tiny-fade-in-leave-active { + opacity: 0; +} +.tiny-zoom-in-center-enter-active, +.tiny-zoom-in-center-leave-active { + -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.tiny-zoom-in-center-enter, +.tiny-zoom-in-center-enter-from, +.tiny-zoom-in-center-leave-active { + opacity: 0; + -webkit-transform: scaleX(0); + transform: scaleX(0); +} +.tiny-zoom-in-top-enter-active, +.tiny-zoom-in-top-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: center top; + transform-origin: center top; +} +.tiny-zoom-in-top-enter, +.tiny-zoom-in-top-enter-from, +.tiny-zoom-in-top-leave-active { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0); +} +.tiny-zoom-in-bottom-enter-active, +.tiny-zoom-in-bottom-leave-active { + opacity: 1; + -webkit-transform: scaleY(1); + transform: scaleY(1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +.tiny-zoom-in-bottom-enter, +.tiny-zoom-in-bottom-enter-from, +.tiny-zoom-in-bottom-leave-active { + opacity: 0; + -webkit-transform: scaleY(0); + transform: scaleY(0); +} +.tiny-zoom-in-left-enter-active, +.tiny-zoom-in-left-leave-active { + opacity: 1; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform-origin: top left; + transform-origin: top left; +} +.tiny-zoom-in-left-enter, +.tiny-zoom-in-left-enter-from, +.tiny-zoom-in-left-leave-active { + opacity: 0; + -webkit-transform: scale(0.45, 0.45); + transform: scale(0.45, 0.45); +} +.tiny-list-enter-active, +.tiny-list-leave-active { + -webkit-transition: all 1s; + transition: all 1s; +} +.tiny-list-enter, +.tiny-list-enter-from, +.tiny-list-leave-active { + opacity: 0; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); +} +.tiny-opacity-transition { + -webkit-transition: opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.collapse-transition { + -webkit-transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out; + transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out; +} +.horizontal-collapse-transition { + -webkit-transition: 0.3s width ease-in-out, 0.3s padding-left ease-in-out, 0.3s padding-right ease-in-out; + transition: 0.3s width ease-in-out, 0.3s padding-left ease-in-out, 0.3s padding-right ease-in-out; +} +.fade-in-linear-enter, +.fade-in-linear-enter-from, +.fade-in-linear-leave, +.fade-in-linear-leave-active, +.fade-in-linear-leave-from { + opacity: 0; +} +.fade-in-linear-enter-active, +.fade-in-linear-leave-active { + -webkit-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.tiny-popupload { + --ti-popupload-font-size: var(--ti-common-font-size-base); + --ti-popupload-dialog-table-border-color: var(--ti-base-color-border); + --ti-popupload-dialog-table-header-height: var(--ti-base-size-height-small); + --ti-popupload-dialog-table-header-color: var(--ti-base-color-info-normal); + --ti-popupload-dialog-table-header-background: #f1f1f1; + --ti-popupload-dialog-table-icon-color: var(--ti-base-color-brand-6); + --ti-popupload-dialog-table-icon-hover-color: var(--ti-base-color-bg-8); + font-size: var(--ti-popupload-font-size); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-popupload__dialog { + max-height: 512px; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-popupload__dialog-header .tiny-alert { + margin-bottom: 10px; +} +.tiny-popupload__dialog-body { + padding-bottom: 24px; +} +.tiny-popupload__dialog-body .tiny-upload-list { + display: none; +} +.tiny-popupload__dialog-footer { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-bottom: 24px; +} +.tiny-popupload__dialog-tips { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-popupload__dialog-table { + height: 280px; + width: 100%; + margin-top: 10px; +} +.tiny-popupload__dialog-table .header-col { + border-right: 1px solid var(--ti-popupload-dialog-table-border-color); + padding: 0 12px; +} +.tiny-popupload__dialog-table .header-col:last-child { + border-right: none; +} +.tiny-popupload__dialog-table .body-col { + padding: 8px 12px; + margin: 0; + line-height: 20px; +} +.tiny-popupload__dialog-table .col1 { + width: 60%; +} +.tiny-popupload__dialog-table .col2 { + width: 20%; +} +.tiny-popupload__dialog-table .col3 { + width: 20%; +} +.tiny-popupload__dialog-table-header { + height: var(--ti-popupload-dialog-table-header-height); + width: 100%; + color: var(--ti-popupload-dialog-table-header-color); + font-weight: 700; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + background: var(--ti-popupload-dialog-table-header-background); + border-bottom: 1px solid var(--ti-popupload-dialog-table-border-color); +} +.tiny-popupload__dialog-table-body { + width: 100%; + height: calc(100% - var(--ti-popupload-dialog-table-header-height)); + overflow-y: auto; + border-bottom: 1px solid var(--ti-popupload-dialog-table-border-color); +} +.tiny-popupload__dialog-table-list { + list-style: none; +} +.tiny-popupload__dialog-table-item { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} +.tiny-popupload__dialog-table-item:nth-child(even) { + background: rgba(51, 51, 51, 0.06); +} +.tiny-popupload__dialog-table-item .delIcon { + height: 17px; + width: 17px; + fill: var(--ti-popupload-dialog-table-icon-color); + cursor: pointer; +} +.tiny-popupload__dialog-table-item .delIcon:hover { + height: 17px; + width: 17px; + fill: var(--ti-popupload-dialog-table-icon-hover-color); +} +.tiny-popupload__modal .tiny-grid-modal__body { + overflow-y: auto; +} +.tiny-popeditor { + --ti-popeditor-border-color: var(--ti-base-color-border); + --ti-popeditor-icon-color: var(--ti-base-color-brand-6); + --ti-popeditor-icon-disabled-color: var(--ti-base-color-placeholder); + --ti-popeditor-icon-hover-color: var(--ti-base-color-brand-5); + --ti-popeditor-tabs-color: var(--ti-base-color-info-normal); + --ti-popeditor-tabs-selected-color: var(--ti-base-color-brand-6); + --ti-popeditor-tabs-li-height: var(--ti-common-size-10x); +} +.tiny-popeditor .tiny-input.tiny-popeditor-readonly .tiny-input__inner:active, +.tiny-popeditor .tiny-input.tiny-popeditor-readonly .tiny-input__inner:focus, +.tiny-popeditor .tiny-input.tiny-popeditor-readonly .tiny-input__inner:hover { + cursor: pointer; + border-color: var(--ti-popeditor-border-color); +} +.tiny-popeditor .tiny-input.is-disabled .tiny-input__inner:active, +.tiny-popeditor .tiny-input.is-disabled .tiny-input__inner:focus, +.tiny-popeditor .tiny-input.is-disabled .tiny-input__inner:hover { + cursor: not-allowed; +} +.tiny-popeditor .tiny-input.is-disabled .tiny-input__inner:active + .tiny-input__suffix .tiny-svg__popeditor, +.tiny-popeditor .tiny-input.is-disabled .tiny-input__inner:focus + .tiny-input__suffix .tiny-svg__popeditor, +.tiny-popeditor .tiny-input.is-disabled .tiny-input__inner:hover + .tiny-input__suffix .tiny-svg__popeditor { + fill: var(--ti-popeditor-icon-disabled-color); +} +.tiny-popeditor .tiny-input.is-disabled .tiny-input__suffix { + cursor: not-allowed; +} +.tiny-popeditor .tiny-input.is-disabled .tiny-input__suffix .tiny-svg__popeditor, +.tiny-popeditor .tiny-input.is-disabled .tiny-input__suffix .tiny-svg__popeditor:hover { + fill: var(--ti-popeditor-icon-disabled-color); + cursor: not-allowed; +} +.tiny-popeditor .tiny-input.suggest .tiny-input__inner { + padding-right: 50px; +} +.tiny-popeditor .tiny-input.suggest .tiny-svg__popeditor.tiny-chevron { + margin-right: 8px; +} +.tiny-popeditor .tiny-input .tiny-input__inner:active + .tiny-input__suffix, +.tiny-popeditor .tiny-input .tiny-input__inner:focus + .tiny-input__suffix, +.tiny-popeditor .tiny-input .tiny-input__inner:hover + .tiny-input__suffix { + cursor: not-allowed; +} +.tiny-popeditor .tiny-input .tiny-input__inner:active + .tiny-input__suffix .tiny-svg__popeditor, +.tiny-popeditor .tiny-input .tiny-input__inner:focus + .tiny-input__suffix .tiny-svg__popeditor, +.tiny-popeditor .tiny-input .tiny-input__inner:hover + .tiny-input__suffix .tiny-svg__popeditor { + fill: var(--ti-popeditor-icon-hover-color); +} +.tiny-popeditor .tiny-input .tiny-input__suffix { + cursor: pointer; +} +.tiny-popeditor .tiny-input .tiny-input__suffix .tiny-svg__popeditor { + height: 30px; + line-height: 30px; + font-size: var(--ti-common-font-size-1); + fill: var(--ti-popeditor-icon-color); + cursor: pointer; +} +.tiny-popeditor .tiny-input .tiny-input__suffix .tiny-svg__popeditor:hover { + fill: var(--ti-popeditor-icon-hover-color); +} +.tiny-popeditor .tiny-dialog-box .tiny-dialog-box__body { + padding: 8px 8px 0; +} +.tiny-popeditor-top .tiny-popeditor__search-lists { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +.tiny-popeditor-top .tiny-popeditor__search-lists .tiny-input { + position: relative; + font-size: var(--ti-common-font-size-base); + display: inline-block; + width: 100%; +} +.tiny-popeditor-top .tiny-popeditor__search-lists .tiny-popeditor__search-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 12px; +} +.tiny-popeditor-top .tiny-popeditor__search-lists .tiny-popeditor__search-item .tiny-popeditor__search-label { + text-align: right; + padding-right: 8px; + font-size: var(--ti-common-font-size-base); +} +.tiny-popeditor-top .tiny-popeditor__search-lists .tiny-popeditor__search-input { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} +.tiny-popeditor-top .tiny-popeditor__search-footer { + width: 100%; + text-align: center; + margin: 12px auto; +} +.tiny-popeditor-body { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.tiny-popeditor-body__left, +.tiny-popeditor-body__right { + width: 50%; + padding: 0 4px; + vertical-align: top; +} +.tiny-popeditor-body__left.tiny-popeditor-body__radio, +.tiny-popeditor-body__right.tiny-popeditor-body__radio { + width: 100%; +} +.tiny-popeditor-body .tiny-popeditor__tabs .tiny-popeditor__tabs-head { + white-space: nowrap; + margin: 0; + padding: 0 10px; + overflow: hidden; + height: 40px; + width: 100%; + position: relative; +} +.tiny-popeditor-body .tiny-popeditor__tabs .tiny-popeditor__tabs-head ul { + height: 40px; + border-bottom: 1px solid var(--ti-popeditor-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-popeditor-body .tiny-popeditor__tabs .tiny-popeditor__tabs-head ul li { + float: left; + margin-right: -1px; + cursor: pointer; + padding: 0 20px; + color: var(--ti-popeditor-tabs-color); + min-width: 90px; + height: var(--ti-popeditor-tabs-li-height); + line-height: var(--ti-popeditor-tabs-li-height); +} +.tiny-popeditor-body .tiny-popeditor__tabs .tiny-popeditor__tabs-head ul li.tiny-popeditor__tabs-selected { + color: var(--ti-popeditor-tabs-selected-color); + border-bottom: 3px solid var(--ti-popeditor-tabs-selected-color); + font-weight: 700; +} +.tiny-popeditor-body .tiny-popeditor__tabs .tiny-popeditor__tabs-body .tabs-body-item { + padding: 12px 12px 0; +} +.tiny-popeditor-body .tiny-popeditor__tabs .tiny-popeditor__tabs-body .tabs-body-item .tiny-pager { + padding-bottom: 0; +} +.tiny-popeditor_filter-input { + margin-bottom: 20px; +} +.tiny-poplist.poplist-user { + min-width: 180px; +} +.tiny-poplist.poplist-user .tiny-icon { + float: right; + margin-left: 5px; +} +.tiny-popover.tiny-popper { + --ti-popover-background: var(--ti-base-color-light); + --ti-popover-color: #606266; + --ti-popover-border-color: #d9d9d9; + --ti-popover-border-radius: var(--ti-common-border-radius-1); + --ti-popover-font-size: var(--ti-common-font-size-1); + --ti-popover-title-color: #303133; + --ti-popover-title-font-size: var(--ti-common-font-size-2); + --ti-popover-arrow-border-width: 6px; + --ti-popover-placement-margin: var(--ti-common-space-3x); + --ti-popover-placement-arrow-after-border-color: var(--ti-base-color-light); + --ti-popover-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + --ti-popover-arrow-border-color: var(--ti-popover-border-color); + --ti-popover-padding: 11px 15px; + position: absolute; + background: var(--ti-popover-background); + color: var(--ti-popover-color); + border-radius: var(--ti-popover-border-radius); + border: 1px solid var(--ti-popover-border-color); + padding: var(--ti-popover-padding); + z-index: 2000; + line-height: 1.4; + text-align: justify; + font-size: var(--ti-popover-font-size); + -webkit-box-shadow: var(--ti-popover-box-shadow); + box-shadow: var(--ti-popover-box-shadow); + word-break: break-all; +} +.tiny-popover.tiny-popper .popper__arrow, +.tiny-popover.tiny-popper .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tiny-popover.tiny-popper .popper__arrow, +.tiny-popover.tiny-popper .tiny-popper .popper__arrow { + border-width: var(--ti-popover-arrow-border-width); + -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); +} +.tiny-popover.tiny-popper .popper__arrow::after { + content: ' '; + border-width: var(--ti-popover-arrow-border-width); +} +.tiny-popover.tiny-popper[x-placement^='top'] { + margin-bottom: var(--ti-popover-placement-margin); +} +.tiny-popover.tiny-popper[x-placement^='top'] .popper__arrow { + bottom: -6px; + left: 50%; + margin-right: 3px; + border-top-color: var(--ti-popover-arrow-border-color); + border-bottom-width: 0; +} +.tiny-popover.tiny-popper[x-placement^='top'] .popper__arrow::after { + bottom: 1px; + margin-left: -6px; + border-top-color: var(--ti-popover-placement-arrow-after-border-color); + border-bottom-width: 0; +} +.tiny-popover.tiny-popper[x-placement^='bottom'] { + margin-top: var(--ti-popover-placement-margin); +} +.tiny-popover.tiny-popper[x-placement^='bottom'] .popper__arrow { + top: -6px; + left: 50%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: var(--ti-popover-arrow-border-color); +} +.tiny-popover.tiny-popper[x-placement^='bottom'] .popper__arrow::after { + top: 1px; + margin-left: -6px; + border-top-width: 0; + border-bottom-color: var(--ti-popover-placement-arrow-after-border-color); +} +.tiny-popover.tiny-popper[x-placement^='right'] { + margin-left: var(--ti-popover-placement-margin); +} +.tiny-popover.tiny-popper[x-placement^='right'] .popper__arrow { + top: 50%; + left: -6px; + margin-bottom: 3px; + border-right-color: var(--ti-popover-arrow-border-color); + border-left-width: 0; +} +.tiny-popover.tiny-popper[x-placement^='right'] .popper__arrow::after { + bottom: -6px; + left: 1px; + border-right-color: var(--ti-popover-placement-arrow-after-border-color); + border-left-width: 0; +} +.tiny-popover.tiny-popper[x-placement^='left'] { + margin-right: var(--ti-popover-placement-margin); +} +.tiny-popover.tiny-popper[x-placement^='left'] .popper__arrow { + top: 50%; + right: -6px; + margin-bottom: 3px; + border-right-width: 0; + border-left-color: var(--ti-popover-arrow-border-color); +} +.tiny-popover.tiny-popper[x-placement^='left'] .popper__arrow::after { + right: 1px; + bottom: -6px; + margin-left: -6px; + border-right-width: 0; + border-left-color: var(--ti-popover-placement-arrow-after-border-color); +} +.tiny-popover.tiny-popper .tiny-popover__plain { + padding: 18px 20px; +} +.tiny-popover.tiny-popper .tiny-popover__title { + color: var(--ti-popover-title-color); + font-size: var(--ti-popover-title-font-size); + line-height: 1; + margin-bottom: 12px; +} +.tiny-popover.tiny-popper .tiny-popover__reference:focus:hover, +.tiny-popover.tiny-popper .tiny-popover__reference:focus:not(.focusing), +.tiny-popover.tiny-popper:focus, +.tiny-popover.tiny-popper:focus:active { + outline-width: 0; +} +.tiny-popover__reference { + display: inline-block; +} +.tiny-progress { + --ti-progress-text-color: var(--ti-base-color-info-normal); + --ti-progress-text-font-size: var(--ti-common-font-size-base); + --ti-progress-bar-border-radius: 100px; + --ti-progress-bar-outer-bgcolor: var(--ti-base-color-selected-background); + --ti-progress-bar-inner-bgcolor: var(--ti-base-color-brand-6); + --ti-progress-bar-inner-text-color: var(--ti-base-color-light); + --ti-progress-success-color: var(--ti-base-color-success-normal); + --ti-progress-warning-color: var(--ti-base-color-warning-normal); + --ti-progress-exception-color: var(--ti-base-color-bg-8); + position: relative; + line-height: 1; +} +.tiny-progress.is-success .tiny-progress-bar__inner { + background-color: var(--ti-progress-success-color); +} +.tiny-progress.is-success .tiny-progress__text svg { + fill: var(--ti-progress-success-color); +} +.tiny-progress.is-warning .tiny-progress-bar__inner { + background-color: var(--ti-progress-warning-color); +} +.tiny-progress.is-warning .tiny-progress__text svg { + fill: var(--ti-progress-warning-color); +} +.tiny-progress.is-exception .tiny-progress-bar__inner { + background-color: var(--ti-progress-exception-color); +} +.tiny-progress.is-exception .tiny-progress__text svg { + fill: var(--ti-progress-exception-color); +} +.tiny-progress__text { + font-size: var(--ti-progress-text-font-size); + color: var(--ti-progress-text-color); + display: inline-block; + vertical-align: middle; + margin-left: 12px; + line-height: 1; +} +.tiny-progress__text i { + vertical-align: middle; + display: inline-block; +} +.tiny-progress--circle, +.tiny-progress--dashboard { + display: inline-block; +} +.tiny-progress--circle .tiny-progress__text, +.tiny-progress--dashboard .tiny-progress__text { + top: 50%; + position: absolute; + width: 100%; + text-align: center; + margin: 0; + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + left: 0; +} +.tiny-progress--circle .tiny-progress__text i, +.tiny-progress--dashboard .tiny-progress__text i { + display: inline-block; + vertical-align: middle; +} +.tiny-progress--without-text .tiny-progress__text { + display: none; +} +.tiny-progress--without-text .tiny-progress-bar { + padding-right: 0; + margin-right: 0; + display: block; +} +.tiny-progress--text-inside .tiny-progress-bar { + padding-right: 0; + margin-right: 0; +} +.tiny-progress-bar { + padding-right: 50px; + width: 100%; + margin-right: -55px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-progress-bar__outer { + height: 6px; + border-radius: var(--ti-progress-bar-border-radius); + background-color: var(--ti-progress-bar-outer-bgcolor); + overflow: hidden; + position: relative; + vertical-align: middle; +} +.tiny-progress-bar__inner { + background-color: var(--ti-progress-bar-inner-bgcolor); + text-align: right; + left: 0; + position: absolute; + top: 0; + height: 100%; + border-radius: var(--ti-progress-bar-border-radius); + line-height: 1; + white-space: nowrap; + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.tiny-progress-bar__inner::after { + content: ''; + height: 100%; +} +.tiny-progress-bar__innerText { + color: var(--ti-progress-bar-inner-text-color); + font-size: var(--ti-progress-text-font-size); + margin: 0 5px; +} +.tiny-progress-bar, +.tiny-progress-bar__inner::after, +.tiny-progress-bar__innerText { + display: inline-block; + vertical-align: middle; +} +@-webkit-keyframes progress { + 0% { + background-position: 0 0; + } + 100% { + background-position: 32px 0; + } +} +@keyframes progress { + 0% { + background-position: 0 0; + } + 100% { + background-position: 32px 0; + } +} +.tiny-slider { + --ti-slider-bgcolor: var(--ti-base-color-brand-2); + --ti-slider-height: var(--ti-common-size-2x); + --ti-slider-radius: 2px; + --ti-slider-range-height: var(--ti-common-size-4x); + --ti-slider-range-radius: 2px; + --ti-slider-range-bgcolor: var(--ti-base-color-brand-6); + --ti-slider-range-hover-bgcolor: var(--ti-base-color-brand-6); + --ti-slider-range-top: calc(-1 * var(--ti-common-space-base)); + --ti-slider-range-margin-top: calc(-1 * var(--ti-common-space-base)); + --ti-slider-handle-width: var(--ti-common-size-5x); + --ti-slider-handle-height: var(--ti-common-size-7x); + --ti-slider-handle-bgcolor: linear-gradient(153deg, var(--ti-base-color-white), var(--ti-base-color-brand-2) 99%); + --ti-slider-handle-border-color: var(--ti-base-color-brand-6); + --ti-slider-handle-radius: 10px; + --ti-slider-handle-color-hover: var(--ti-common-color-bg-hover); + --ti-slider-handle-box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1); + --ti-slider-handle-top: calc(-1 * var(--ti-common-space-base)); + --ti-slider-handle-border-width: 1px; + --ti-slider-handle-icon-display: inline-block; + --ti-slider-handle-icon-fill-color: var(--ti-slider-handle-border-color); + --ti-slider-handle-icon-fill-color-hover: var(--ti-slider-handle-color-hover); + --ti-slider-handle-transform: scale(1); + --ti-slider-handle-margin: -10px -8px 0; + --ti-slider-input-height: var(--ti-base-size-height-minor, 30px); + --ti-slider-input-width: var(--ti-common-size-10x); + --ti-slider-input-border-radius: var(--ti-common-border-radius-normal, 2px); + --ti-slider-input-border-color: var(--ti-base-color-border, #d9d9d9); + --ti-slider-input-color: var(--ti-base-color-info-normal, #333); + --ti-slider-input-bgcolor: var(--ti-base-color-light, #fff); + --ti-slider-tips-bgcolor: var(--ti-base-color-common-6); + --ti-slider-tips-color: var(--ti-base-color-white); + --ti-slider-tips-margin-left: 3px; + --ti-slider-vertical-margin: -8px 0 -8px -6px; + border-radius: var(--ti-slider-radius); + height: var(--ti-slider-height); + position: relative; + margin: 13px 0; + background: var(--ti-slider-bgcolor); + cursor: pointer; + width: calc(100% - 89px); + display: inline-block; +} +.tiny-slider:hover .tiny-slider__range { + background: var(--ti-slider-range-hover-bgcolor); +} +.tiny-slider:hover .tiny-slider__handle { + border-color: var(--ti-slider-range-hover-bgcolor); +} +.tiny-slider.disabled { + cursor: default; +} +.tiny-slider.disabled .tiny-slider__handle { + cursor: not-allowed; +} +.tiny-slider.tiny-slider__vertical { + width: var(--ti-slider-height); + height: 300px; + display: block; + margin: 0 15px; +} +.tiny-slider.tiny-slider__vertical + .tiny-slider__input { + margin-top: 12px; + float: none; + right: 0; +} +.tiny-slider.tiny-slider__vertical .tiny-slider__range { + border-radius: 10px; + position: absolute; + z-index: 1; + width: var(--ti-slider-height); +} +.tiny-slider.tiny-slider__vertical .tiny-slider__up { + top: 0; +} +.tiny-slider.tiny-slider__vertical .tiny-slider__down { + bottom: 0; +} +.tiny-slider.tiny-slider__vertical .tiny-slider__handle { + margin: var(--ti-slider-vertical-margin); +} +.tiny-slider__range { + border-radius: var(--ti-slider-range-radius); + position: absolute; + z-index: 1; + margin-top: var(--ti-slider-range-margin-top); + height: var(--ti-slider-range-height); + background: var(--ti-slider-range-bgcolor); +} +.tiny-slider__left { + left: 0; +} +.tiny-slider__right { + right: 0; +} +.tiny-slider__handle { + border-radius: var(--ti-slider-handle-radius); + height: var(--ti-slider-handle-height); + width: var(--ti-slider-handle-width); + position: absolute; + margin: var(--ti-slider-handle-margin); + z-index: 2; + outline: 0; + background: var(--ti-slider-handle-bgcolor); + border: var(--ti-slider-handle-border-width) solid var(--ti-slider-handle-border-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-shadow: var(--ti-slider-handle-box-shadow); + box-shadow: var(--ti-slider-handle-box-shadow); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: -webkit-grab; + cursor: grab; + text-align: center; +} +.tiny-slider__handle:hover { + color: var(--ti-slider-handle-color-hover); + border-color: var(--ti-slider-handle-color-hover); + -webkit-transform: var(--ti-slider-handle-transform); + transform: var(--ti-slider-handle-transform); +} +.tiny-slider__handle:hover svg { + fill: var(--ti-slider-handle-icon-fill-color-hover); +} +.tiny-slider__handle svg { + display: var(--ti-slider-handle-icon-display); + height: 12px; + margin-left: 4px; + fill: var(--ti-slider-handle-icon-fill-color); +} +.tiny-slider__tips { + text-align: center; + font-size: var(--ti-common-font-size-base); + margin-top: -32px; + margin-left: var(--ti-slider-tips-margin-left); + position: absolute; + padding: 12px 16px; + line-height: 1.5; + z-index: 1010; + word-break: normal; + white-space: nowrap; + background: var(--ti-slider-tips-bgcolor); + border: 1px solid var(--ti-slider-tips-bgcolor); + border-radius: var(--ti-common-border-radius-1); + color: var(--ti-slider-tips-color); +} +.tiny-slider__tips:before { + margin-left: -6px; + bottom: -6px; + content: ''; + left: 50%; + top: auto; + margin-top: 0; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 6px 6px 0 6px; + border-color: var(--ti-slider-tips-bgcolor) transparent; +} +.tiny-slider__tips:after { + margin-left: -4px; + bottom: -4px; + content: ''; + left: 50%; + top: auto; + margin-top: 0; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-slider-tips-bgcolor) transparent; +} +.tiny-slider__input { + display: inline-block; + line-height: var(--ti-slider-input-height); + vertical-align: top; + margin-left: 12px; + font-size: var(--ti-common-font-size-base); +} +.tiny-slider__input input { + width: var(--ti-slider-input-width); + height: var(--ti-slider-input-height); + line-height: var(--ti-slider-input-height); + border: 1px solid var(--ti-slider-input-border-color); + border-radius: var(--ti-slider-input-border-radius); + color: var(--ti-slider-input-color); + background: var(--ti-slider-input-bgcolor); + font-size: inherit; + padding: 0 8px; + outline: 0; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; +} +.tiny-slider__input span { + padding-left: 8px; +} +.tiny-radio { + --ti-radio-color: var(--ti-base-color-info-normal); + --ti-radio-font-size: var(--ti-common-font-size-base); + --ti-radio-bordered-height: var(var(--ti-common-size-10x)); + --ti-radio-bordered-border-radius: var(--ti-common-border-radius-normal); + --ti-radio-bordered-border-color: var(--ti-base-color-common-2); + --ti-radio-input-disabled-border-color: var(--ti-base-color-common-1); + --ti-radio-bordered-checked-border-color: var(--ti-base-color-brand-6); + --ti-radio-bordered-checked-background-color: var(--ti-base-color-light); + --ti-radio-bordered-hover-border-color: var(--ti-base-color-brand-6); + --ti-radio-bordered-checked-hover-border-color: var(--ti-base-color-brand-6); + --ti-radio-bordered-active-border-color: var(--ti-base-color-primary-active); + --ti-radio-input-disabled-bgcolor: var(--ti-base-color-bg-5); + --ti-radio-input-checked-disabled-color: var(--ti-base-color-bg-5); + --ti-radio-input-disabled-color: var(--ti-base-color-placeholder); + --ti-radio-inner-bgcolor: var(--ti-base-color-light); + --ti-radio-inner-checked-bgcolor: var(--ti-base-color-brand-6); + --ti-radio-medium-height: var(--ti-base-size-height-small); + --ti-radio-medium-inner-height: 14px; + --ti-radio-medium-inner-width: 14px; + --ti-radio-small-height: var(--ti-common-size-8x); + --ti-radio-small-inner-height: var(--ti-common-size-3x); + --ti-radio-small-inner-width: var(--ti-common-size-3x); + --ti-radio-mini-height: var(--ti-common-size-7x); + --ti-radio-mini-inner-height: var(--ti-common-size-3x); + --ti-radio-mini-inner-width: var(--ti-common-size-3x); + --ti-radio-inner-size: 8px; + --ti-radio-inner-checked-disabled-bgcolor: var(--ti-base-color-common-2); + color: var(--ti-radio-color); + font-weight: 500; + margin-right: 30px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + cursor: pointer; + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-radio:last-child { + margin-right: 0; +} +.tiny-radio.is-bordered { + padding: 4px 12px; + border-radius: var(--ti-radio-bordered-border-radius); + border: 1px solid var(--ti-radio-bordered-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: var(--ti-radio-bordered-height); +} +.tiny-radio.is-bordered + .tiny-radio.is-bordered { + margin-left: 10px; +} +.tiny-radio.is-bordered.is-checked { + border-color: var(--ti-radio-bordered-checked-border-color); +} +.tiny-radio.is-bordered.is-disabled { + cursor: not-allowed; + border-color: var(--ti-radio-bordered-border-color); +} +.tiny-radio, +.tiny-radio__input { + white-space: nowrap; + line-height: 1; + outline: 0; +} +.tiny-radio__input { + cursor: pointer; + line-height: 1; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-radio__input { + display: inline-block; + } +} +@supports (-ms-ime-align: auto) { + .tiny-radio__input { + display: inline-block; + } +} +.tiny-radio__input.is-disabled .tiny-radio__inner { + border-color: var(--ti-radio-input-disabled-border-color); +} +.tiny-radio__input.is-disabled .tiny-radio__inner, +.tiny-radio__input.is-disabled .tiny-radio__inner::after { + cursor: not-allowed; + background-color: var(--ti-radio-input-disabled-bgcolor); +} +.tiny-radio__input.is-disabled .tiny-radio__inner + .tiny-radio__label { + cursor: not-allowed; +} +.tiny-radio__input.is-disabled.is-checked .tiny-radio__inner { + background-color: var(--ti-radio-input-checked-disabled-color); + border-color: var(--ti-base-color-common-1); +} +.tiny-radio__input.is-disabled.is-checked .tiny-radio__inner::after { + background-color: var(--ti-radio-inner-checked-disabled-bgcolor); +} +.tiny-radio__input.is-disabled + span.tiny-radio__label { + color: var(--ti-radio-input-disabled-color); + cursor: not-allowed; +} +.tiny-radio__input.is-checked .tiny-radio__inner { + border-color: var(--ti-radio-bordered-checked-border-color); + background: var(--ti-radio-bordered-checked-background-color); +} +.tiny-radio__input.is-checked .tiny-radio__inner::after { + -webkit-transform: translate(-50%, -50%) scale(1); + transform: translate(-50%, -50%) scale(1); + background-color: var(--ti-radio-inner-checked-bgcolor); +} +.tiny-radio__input.is-checked:not(.is-disabled) .tiny-radio__inner:hover { + border-color: var(--ti-radio-bordered-checked-hover-border-color); +} +.tiny-radio__inner { + border: 1px solid var(--ti-radio-bordered-border-color); + border-radius: 100%; + width: 16px; + height: 16px; + background-color: var(--ti-radio-inner-bgcolor); + position: relative; + display: inline-block; + cursor: pointer; + -webkit-box-sizing: border-box; + box-sizing: border-box; + outline: 0; +} +.tiny-radio__inner:hover { + border-color: var(--ti-radio-bordered-hover-border-color); +} +.tiny-radio__inner:active { + border-color: var(--ti-radio-bordered-active-border-color); +} +.tiny-radio__inner::after { + width: var(--ti-radio-inner-size); + height: var(--ti-radio-inner-size); + border-radius: 100%; + background-color: var(--ti-radio-inner-bgcolor); + content: ''; + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%) scale(0); + transform: translate(-50%, -50%) scale(0); + -webkit-transition: -webkit-transform 0.15s ease-in; + transition: -webkit-transform 0.15s ease-in; + transition: transform 0.15s ease-in; + transition: transform 0.15s ease-in, -webkit-transform 0.15s ease-in; +} +.tiny-radio__original { + opacity: 0; + outline: 0; + position: absolute; + z-index: -1; + margin: 0; + width: 0; + height: 0; +} +.tiny-radio__label { + font-size: var(--ti-radio-font-size); + padding-left: 8px; + vertical-align: middle; +} +.tiny-radio--medium.is-bordered { + border-radius: var(--ti-radio-bordered-border-radius); + height: var(--ti-radio-medium-height); +} +.tiny-radio--medium.is-bordered .tiny-radio__inner { + height: var(--ti-radio-medium-inner-height); + width: var(--ti-radio-medium-inner-width); +} +.tiny-radio--medium.is-bordered .tiny-radio__label { + font-size: var(--ti-radio-font-size); +} +.tiny-radio--small.is-bordered { + border-radius: var(--ti-radio-bordered-border-radius); + height: var(--ti-radio-small-height); +} +.tiny-radio--small.is-bordered .tiny-radio__inner { + height: var(--ti-radio-small-inner-height); + width: var(--ti-radio-small-inner-width); +} +.tiny-radio--small.is-bordered .tiny-radio__label { + font-size: var(--ti-radio-font-size); +} +.tiny-radio--mini.is-bordered { + padding: 0 8px; + border-radius: var(--ti-radio-bordered-border-radius, 2px); + height: var(--ti-radio-mini-height); + line-height: calc(var(--ti-radio-mini-height) - 2px); +} +.tiny-radio--mini.is-bordered .tiny-radio__inner { + height: var(--ti-radio-mini-inner-height); + width: var(--ti-radio-mini-inner-width); +} +.tiny-radio--mini.is-bordered .tiny-radio__inner::after { + width: 4px; + height: 4px; +} +.tiny-radio--mini.is-bordered .tiny-radio__label { + font-size: var(--ti-radio-font-size); +} +.tiny-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .tiny-radio__inner { + -webkit-box-shadow: 0 0 2px 2px var(--ti-radio-bordered-hover-border-color); + box-shadow: 0 0 2px 2px var(--ti-radio-bordered-hover-border-color); +} +.tiny-radio-button { + --ti-radio-button-color: var(--ti-base-color-info-normal); + --ti-radio-button-hover-color: var(--ti-base-color-light); + --ti-radio-button-border-color: var(--ti-base-color-border); + --ti-radio-button-border-radius: var(--ti-common-border-radius-normal); + --ti-radio-button-font-size: var(--ti-common-font-size-base); + --ti-radio-button-bgcolor: var(--ti-base-color-light); + --ti-radio-button-checked-normal-color: var(--ti-base-color-brand-6); + --ti-radio-button-checked-hover-color: var(--ti-base-color-brand-5); + --ti-radio-button-disabled-color: var(--ti-base-color-placeholder); + --ti-radio-button-disabled-bgcolor: var(--ti-base-color-bg-5); + --ti-radio-button-medium-font-size: var(--ti-common-font-size-1); +} +.tiny-radio-button:first-child .tiny-radio-button__inner { + border-left: 1px solid var(--ti-radio-button-border-color); + border-radius: var(--ti-radio-button-border-radius) 0 0 var(--ti-radio-button-border-radius); +} +.tiny-radio-button:first-child .tiny-radio-button__orig-radio:checked + .tiny-radio-button__inner { + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-radio-button:last-child .tiny-radio-button__inner { + border-radius: 0 var(--ti-radio-button-border-radius) var(--ti-radio-button-border-radius) 0; +} +.tiny-radio-button:first-child:last-child .tiny-radio-button__inner { + border-radius: var(--ti-radio-button-border-radius); +} +.tiny-radio-button, +.tiny-radio-button__inner { + display: inline-block; + position: relative; + outline: 0; +} +.tiny-radio-button__inner { + color: var(--ti-radio-button-color); + font-size: var(--ti-radio-button-font-size); + background: var(--ti-radio-button-bgcolor); + border: 1px solid var(--ti-radio-button-border-color); + padding: 12px 20px; + font-weight: 500; + border-radius: 0; + border-left: 0; + line-height: 1; + white-space: nowrap; + vertical-align: middle; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + cursor: pointer; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-radio-button__inner.is-round { + padding: 12px 20px; +} +.tiny-radio-button__inner:hover { + color: var(--ti-radio-button-hover-color); + background-color: var(--ti-radio-button-checked-hover-color); + border-color: var(--ti-radio-button-checked-hover-color); + outline: 0; +} +.tiny-radio-button__inner [class*='tiny-icon'] { + line-height: 0.9; +} +.tiny-radio-button__inner [class*='tiny-icon'] + span { + margin-left: 5px; +} +.tiny-radio-button__orig-radio { + opacity: 0; + outline: 0; + position: absolute; + z-index: -1; +} +.tiny-radio-button__orig-radio:checked + .tiny-radio-button__inner { + color: #fff; + background-color: var(--ti-radio-button-checked-normal-color); + border-color: var(--ti-radio-button-checked-normal-color); + -webkit-box-shadow: -1px 0 0 0 var(--ti-radio-button-checked-normal-color); + box-shadow: -1px 0 0 0 var(--ti-radio-button-checked-normal-color); +} +.tiny-radio-button__orig-radio:checked + .tiny-radio-button__inner:hover { + background-color: var(--ti-radio-button-checked-hover-color); + border-color: var(--ti-radio-button-checked-hover-color); + -webkit-box-shadow: -1px 0 0 0 var(--ti-radio-button-checked-hover-color); + box-shadow: -1px 0 0 0 var(--ti-radio-button-checked-hover-color); +} +.tiny-radio-button__orig-radio:disabled + .tiny-radio-button__inner { + color: var(--ti-radio-button-disabled-color); + border-color: var(--ti-radio-button-border-color); + background-color: var(--ti-radio-button-disabled-bgcolor); + background-image: none; + -webkit-box-shadow: none; + box-shadow: none; + cursor: not-allowed; +} +.tiny-radio-button__orig-radio:disabled:checked + .tiny-radio-button__inner { + background-color: var(--ti-radio-input-checked-disabled-color); +} +.tiny-radio-button__orig-radio:disabled:checked + .tiny-radio-button__inner, +.tiny-radio-button__orig-radio:disabled:checked + .tiny-radio-button__inner:hover { + border-color: var(--ti-radio-input-checked-disabled-color); +} +.tiny-radio-button--medium .tiny-radio-button__inner { + font-size: var(--ti-radio-button-medium-font-size); + padding: 10px 20px; + border-radius: 0; +} +.tiny-radio-button--medium .tiny-radio-button__inner.is-round { + padding: 10px 20px; +} +.tiny-radio-button--small .tiny-radio-button__inner { + font-size: var(--ti-radio-button-font-size); + padding: 9px 15px; + border-radius: 0; +} +.tiny-radio-button--small .tiny-radio-button__inner.is-round { + padding: 9px 15px; +} +.tiny-radio-button--mini .tiny-radio-button__inner { + font-size: var(--ti-radio-button-font-size); + padding: 7px 15px; + border-radius: 0; +} +.tiny-radio-button--mini .tiny-radio-button__inner.is-round { + padding: 7px 15px; +} +.tiny-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled) { + -webkit-box-shadow: 0 0 2px 2px var(--ti-radio-bordered-hover-border-color); + box-shadow: 0 0 2px 2px var(--ti-radio-bordered-hover-border-color); +} +.tiny-radio-group { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} +.tiny-radio-group.list-inline { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-radio-group.list-inline .tiny-radio { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-right: 0; +} +.tiny-radio-group.list-inline .tiny-radio:not(:last-child) { + margin-bottom: 8px; +} +.tiny-radio-group.list-inline .tiny-radio-button { + display: block; +} +.tiny-radio-group.list-inline .tiny-radio-button:first-child .tiny-radio-button__inner { + border-radius: var(--ti-radio-button-border-radius) var(--ti-radio-button-border-radius) 0 0; + border-top: 1px solid var(--ti-radio-button-border-color); +} +.tiny-radio-group.list-inline .tiny-radio-button:last-child .tiny-radio-button__inner { + border-radius: 0 0 var(--ti-radio-button-border-radius) var(--ti-radio-button-border-radius); +} +.tiny-radio-group.list-inline .tiny-radio-button.is-active .tiny-radio-button__inner { + -webkit-box-shadow: none; + box-shadow: none; + border-color: var(--ti-radio-button-checked-normal-color); +} +.tiny-radio-group.list-inline .tiny-radio-button.is-active.is-disabled .tiny-radio-button__inner { + border-color: var(--ti-radio-input-checked-disabled-color); +} +.tiny-radio-group.list-inline .tiny-radio-button__inner { + border-top: 0; + border-left: 1px solid var(--ti-radio-button-border-color); +} +.tiny-rate { + --ti-rate-bottom-font-size: var(--ti-common-font-size-base); + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + outline: 0; +} +.tiny-rate:active, +.tiny-rate:focus { + outline-width: 0; +} +.tiny-rate .tiny-rate__star { + position: relative; + display: inline-block; + font-size: 0; + vertical-align: middle; + text-align: center; + line-height: 1; +} +.tiny-rate svg { + -webkit-transition: 0.3s; + transition: 0.3s; +} +.tiny-rate svg.hover { + -webkit-transform: scale(1.15); + transform: scale(1.15); +} +.tiny-rate .tiny-rate__decimal { + display: inline-block; + overflow: hidden; + font-size: var(--ti-common-font-size-2); + position: absolute; + top: 0; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} +.tiny-rate .tiny-rate__text { + vertical-align: middle; + margin-left: 8px; +} +.tiny-rate .tiny-rate__bottom-text { + position: relative; + font-size: var(--ti-rate-bottom-font-size); + text-align: center; + text-overflow: clip; + overflow: hidden; + margin-top: 8px; +} +.tiny-roles { + --ti-roles-poplist-item-height: var(--ti-base-size-height-minor); + --ti-roles-poplist-item-color: var(--ti-base-color-info-normal); + --ti-roles-poplist-item-font-size: var(--ti-common-font-size-base); + --ti-roles-poplist-item-hover-background: var(--ti-base-color-hover-background); + --ti-roles-poplist-item-selected-background: var(--ti-base-color-selected-background); + --ti-roles-poplist-item-selected-font-color: var(--ti-base-color-selected-font-color); +} +.tiny-roles svg { + margin-left: 2px; +} +.tiny-roles__selector.tiny-popover.tiny-popper { + padding: 0; +} +.tiny-roles__selector .tiny-roles__poplist-item { + padding: 0 8px; +} +.tiny-roles__selector-body { + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; +} +.tiny-roles__poplist { + min-width: 180px; +} +.tiny-roles__poplist-item { + min-height: var(--ti-roles-poplist-item-height); + line-height: var(--ti-roles-poplist-item-height); + max-width: 100%; + color: var(--ti-roles-poplist-item-color); + font-size: var(--ti-roles-poplist-item-font-size); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; +} +.tiny-roles__poplist-item:hover { + background: var(--ti-roles-poplist-item-hover-background); +} +.tiny-roles__poplist-item.is-selected, +.tiny-roles__poplist-item.is-selected:hover { + background: var(--ti-roles-poplist-item-selected-background); + color: var(--ti-roles-poplist-item-selected-font-color); +} +.tiny-row { + width: 100%; +} +.tiny-row:after, +.tiny-row:before { + content: ''; + display: table; +} +.tiny-row:after { + clear: both; +} +.tiny-row.row-flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-row.row-justify-start { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.tiny-row.row-justify-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} +.tiny-row.row-justify-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-row.row-justify-space-around { + -ms-flex-pack: distribute; + justify-content: space-around; +} +.tiny-row.row-justify-space-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} +.tiny-row.row-align-top { + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} +.tiny-row.row-align-middle { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-row.row-align-bottom { + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; +} +.tiny-scroll-text { + --ti-scroll-text-height: var(--ti-base-size-height-small); + --ti-scroll-text-background: #f1f1f1; + width: 300px; + height: var(--ti-scroll-text-height); + line-height: var(--ti-scroll-text-height); + background: var(--ti-scroll-text-background); + margin: 0 auto; + overflow: hidden; +} +.tiny-scroll-text .tiny-scroll-text__content { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + height: 100%; + padding: 0 8px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + white-space: nowrap; + position: relative; + -webkit-animation: infinite linear; + animation: infinite linear; + -webkit-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-scroll-text .tiny-scroll-text__content { + display: inline-block; + } +} +@supports (-ms-ime-align: auto) { + .tiny-scroll-text .tiny-scroll-text__content { + display: inline-block; + } +} +.tiny-scroll-text .tiny-scroll-text__content.left { + -webkit-animation-name: moveLeft; + animation-name: moveLeft; +} +.tiny-scroll-text .tiny-scroll-text__content.right { + -webkit-animation-name: moveRight; + animation-name: moveRight; +} +.tiny-scroll-text .tiny-scroll-text__content.up { + -webkit-animation-name: moveUp; + animation-name: moveUp; +} +.tiny-scroll-text .tiny-scroll-text__content.down { + -webkit-animation-name: moveDown; + animation-name: moveDown; +} +.tiny-scroll-text .tiny-scroll-text__content.singleUp { + -webkit-animation-name: singleUp; + animation-name: singleUp; +} +.tiny-scroll-text .tiny-scroll-text__content.stop { + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.tiny-scroll-text .tiny-scroll-text__content.down, +.tiny-scroll-text .tiny-scroll-text__content.up { + width: 100%; + white-space: normal; +} +.tiny-scroll-text .tiny-scroll-text__content p { + width: auto; + line-height: 1; + margin: 0; +} +@-webkit-keyframes moveLeft { + 0% { + -webkit-transform: translateX(300px); + transform: translateX(300px); + } + 100% { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } +} +@keyframes moveLeft { + 0% { + -webkit-transform: translateX(300px); + transform: translateX(300px); + } + 100% { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } +} +@-webkit-keyframes moveRight { + 0% { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } + 100% { + -webkit-transform: translateX(300px); + transform: translateX(300px); + } +} +@keyframes moveRight { + 0% { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } + 100% { + -webkit-transform: translateX(300px); + transform: translateX(300px); + } +} +@-webkit-keyframes moveUp { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + } + 100% { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + } +} +@keyframes moveUp { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + } + 100% { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + } +} +@-webkit-keyframes moveDown { + 0% { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + } + 100% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + } +} +@keyframes moveDown { + 0% { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + } + 100% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + } +} +.tiny-scrollbar { + overflow: hidden; + position: relative; +} +.tiny-scrollbar:active > .tiny-scrollbar__bar, +.tiny-scrollbar:focus > .tiny-scrollbar__bar, +.tiny-scrollbar:hover > .tiny-scrollbar__bar { + opacity: 1; + -webkit-transition: opacity 340ms ease-out; + transition: opacity 340ms ease-out; +} +.tiny-scrollbar__wrap { + overflow: scroll; + height: 100%; + max-height: 200px; +} +.tiny-scrollbar__wrap--hidden-default::-webkit-scrollbar { + width: 0; + height: 0; +} +.tiny-scrollbar__thumb { + position: relative; + display: block; + width: 0; + height: 0; + cursor: pointer; + border-radius: inherit; + background-color: rgba(144, 147, 153, 0.3); + -webkit-transition: 0.3s background-color; + transition: 0.3s background-color; +} +.tiny-scrollbar__thumb:hover { + background-color: rgba(144, 147, 153, 0.5); +} +.tiny-scrollbar__bar { + position: absolute; + right: 2px; + bottom: 2px; + z-index: 1; + border-radius: 4px; + opacity: 0; + -webkit-transition: opacity 120ms ease-out; + transition: opacity 120ms ease-out; +} +.tiny-scrollbar__bar.is-vertical { + width: 6px; + top: 2px; +} +.tiny-scrollbar__bar.is-vertical > div { + width: 100%; +} +.tiny-scrollbar__bar.is-horizontal { + height: 6px; + left: 2px; +} +.tiny-scrollbar__bar.is-horizontal > div { + height: 100%; +} +.tiny-transition-search-line-fade-enter, +.tiny-transition-search-line-fade-enter-from, +.tiny-transition-search-line-fade-leave-to { + opacity: 0; +} +.tiny-transition-search-line-fade-enter-to { + opacity: 0; +} +.tiny-transition-search-line-fade-enter-active, +.tiny-transition-search-line-fade-leave-active { + -webkit-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.tiny-search { + --ti-search-font-size: var(--ti-common-font-size-base); + --ti-search-input-height: var(--ti-base-size-height-normal); + --ti-search-inputinner-height: var(--ti-base-size-height-small); + --ti-search-input-color: var(--ti-base-color-info-normal); + --ti-search-input-background: var(--ti-base-color-light); + --ti-search-input-btn-color: var(--ti-base-color-brand-6); + --ti-search-input-btn-hover-color: var(--ti-base-color-brand-5); + --ti-search-input-btn-font-size: var(--ti-common-font-size-1); + --ti-search-input-border-color: var(--ti-base-color-border); + --ti-search-icon-border-color: #dbdbdb; + --ti-search-icon-color: #c4c4c4; + --ti-search-size-height-normal: var(--ti-base-size-height-normal); + --ti-search-size-height-small: var(--ti-base-size-height-small); + --ti-search-selector-color: var(--ti-base-color-info-normal); + --ti-search-line-hover-color: var(--ti-base-color-border-hover); + --ti-search-list-hover-background: var(--ti-base-color-selected-background); + --ti-search-selector-radius: var(--ti-common-border-radius-normal); + --ti-search-selector-background: var(--ti-base-color-light); + --ti-search-selector-list-height: var(--ti-base-size-height-normal); + position: relative; + display: inline-block; + font-size: var(--ti-search-font-size); + width: 100%; +} +.tiny-search .tiny-search__line { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 100%; + height: var(--ti-search-input-height); + border: 1px solid var(--ti-search-input-border-color); + border-radius: var(--ti-common-border-radius-normal); + background-color: var(--ti-search-input-background); + -webkit-transition: 0.4s; + transition: 0.4s; + border-collapse: separate; +} +.tiny-search .tiny-search__line:hover { + border-color: var(--ti-search-line-hover-color); +} +.tiny-search .tiny-search__line.focus, +.tiny-search .tiny-search__line:focus { + border-color: var(--ti-search-input-btn-color); +} +.tiny-search .tiny-search__input { + width: 100%; + height: 100%; + line-height: 1; + color: var(--ti-search-input-color); + padding: 0 0 0 8px; + border: 0; + outline: 0; + background: 0 0; +} +.tiny-search .tiny-search__input::-moz-placeholder { + color: #999; + opacity: 1; +} +.tiny-search .tiny-search__input:-ms-input-placeholder { + color: #999; +} +.tiny-search .tiny-search__input::-webkit-input-placeholder { + color: #999; +} +.tiny-search .tiny-search__input::-ms-input-placeholder { + color: #999; +} +.tiny-search .tiny-search__input::placeholder { + color: #999; +} +.tiny-search .tiny-search__input:focus::-moz-placeholder { + color: #d9d9d9; + opacity: 1; +} +.tiny-search .tiny-search__input:focus:-ms-input-placeholder { + color: #d9d9d9; +} +.tiny-search .tiny-search__input:focus::-webkit-input-placeholder { + color: #d9d9d9; +} +.tiny-search .tiny-search__input:focus::-ms-input-placeholder { + color: #d9d9d9; +} +.tiny-search .tiny-search__input:focus::placeholder { + color: #d9d9d9; +} +.tiny-search .tiny-search__input-btn { + text-align: center; +} +.tiny-search .tiny-search__input-btn a { + text-decoration: none; + display: block; + width: var(--ti-search-inputinner-height); + height: 100%; + line-height: var(--ti-search-inputinner-height); +} +.tiny-search .tiny-search__input-btn svg { + fill: var(--ti-search-input-btn-color); + font-size: var(--ti-search-input-btn-font-size); +} +.tiny-search .tiny-search__input-btn:hover svg { + fill: var(--ti-search-input-btn-hover-color); +} +.tiny-search .tiny-search__present { + color: var(--ti-search-selector-color); + line-height: var(--ti-search-size-height-normal); + padding-left: 8px; + white-space: nowrap; +} +.tiny-search .tiny-search__present .icon-outer { + height: calc(var(--ti-search-size-height-normal) - 12px); + line-height: calc(var(--ti-search-size-height-normal) - 12px); + display: inline-block; + padding: 0 8px 0 4px; + border-right: 1px solid var(--ti-search-input-border-color); + cursor: pointer; +} +.tiny-search .tiny-search__present .icon-outer svg { + font-size: var(--ti-search-input-btn-font-size); + fill: var(--ti-search-icon-color); +} +.tiny-search .tiny-search__selector { + position: absolute; + top: 32px; + left: 0; + overflow: hidden; + min-width: 68px; + border: 1px solid var(--ti-search-input-border-color); + border-radius: var(--ti-search-selector-radius); + font-size: var(--ti-search-font-size); + -webkit-box-shadow: var(--ti-base-box-shadow); + box-shadow: var(--ti-base-box-shadow); + background: var(--ti-search-selector-background); + color: var(--ti-search-selector-color); + margin-top: 2px; +} +.tiny-search .tiny-search__selector-body { + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; +} +.tiny-search .tiny-search__poplist-item { + min-height: var(--ti-search-selector-list-height); + padding: 0 8px; + line-height: var(--ti-search-selector-list-height); + max-width: 100%; + font-size: var(--ti-search-font-size); + overflow: hidden; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-search .tiny-search__poplist-item:hover { + background: var(--ti-search-list-hover-background); + cursor: pointer; +} +.tiny-search .tiny-search__poplist-item span { + font-size: var(--ti-search-font-size); +} +.tiny-search .tiny-search__poplist-item .icon-check { + font-size: var(--ti-common-font-size-2); +} +.tiny-search .tiny-search__poplist-item .icon-check:hover { + color: var(--ti-search-input-btn-hover-color); +} +.tiny-search.mini .tiny-search__line { + border-radius: var(--ti-search-input-height); + width: 100%; + float: right; +} +.tiny-search.mini.collapse .tiny-search__input-btn svg { + fill: var(--ti-search-icon-color); +} +.tiny-search.mini .tiny-search__input { + border-radius: var(--ti-search-input-height); +} +.tiny-search.collapse .tiny-search__input { + padding: 0; + width: var(--ti-search-size-height-normal); + float: right; +} +.tiny-search.mini.collapse .tiny-search__line { + width: 30px; + float: right; + background-color: transparent; + border-collapse: separate; +} +.tiny-search.mini.collapse .tiny-search__input, +.tiny-search.mini.collapse .tiny-search__present { + display: none; +} +.tiny-search .fade-enter-to { + opacity: 0; +} +.tiny-search .fade-enter, +.tiny-search .fade-leave-to { + opacity: 0; +} +.tiny-select { + --ti-select-inner-hover-border-color: var(--ti-base-color-brand-5); + --ti-select-input-color: #666; + --ti-select-input-font-size: var(--ti-common-font-size-base); + --ti-select-input-caret-color: var(--ti-base-color-brand-6); + --ti-select-input-caret-hover-color: var(--ti-base-color-brand-5); + --ti-select-input-caret-font-size: var(--ti-common-font-size-1); + --ti-select-input-caret-close-color: var(--ti-base-color-bg-5); + --ti-select-input-caret-close-hover-color: var(--ti-base-color-placeholder); + --ti-select-input-disabled-caret-color: var(--ti-base-color-border); + --ti-select-input-disabled-inner-hover-border-color: #e4e7ed; + --ti-select-input-mini-height: var(--ti-base-size-height-mini); + --ti-select-input-small-height: var(--ti-base-size-height-small); + --ti-select-input-medium-height: var(--ti-base-size-height-medium); + display: inline-block; + position: relative; + width: 100%; + outline: 0; +} +.tiny-select .tiny-select__tags > span { + display: contents; +} +.tiny-select__input { + border: none; + outline: 0; + padding: 0; + margin-left: 8px; + color: var(--ti-select-input-color); + font-size: var(--ti-select-input-font-size); + height: 28px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; +} +.tiny-select__input.is-mini { + height: var(--ti-select-input-mini-height); +} +.tiny-select__input.is-small { + height: var(--ti-select-input-small-height); +} +.tiny-select__input.is-medium { + height: var(--ti-select-input-medium-height); +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-select.tiny-select__multiple:not(.tiny-select__collapse-tags):not(.tiny-select__filterable) + .tiny-select__tags + > span { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -ms-flex-line-pack: start; + align-content: flex-start; + } +} +@supports (-ms-ime-align: auto) { + .tiny-select.tiny-select__multiple:not(.tiny-select__collapse-tags):not(.tiny-select__filterable) + .tiny-select__tags + > span { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -ms-flex-line-pack: start; + align-content: flex-start; + } +} +.tiny-select.tiny-select__collapse-tags .tiny-select__tags > span { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; +} +.tiny-select.tiny-select__collapse-tags .tiny-select__tags > span > span:not(:only-child):first-child { + max-width: 70%; +} +.tiny-select.tiny-select__collapse-tags.tiny-select__filterable .tiny-select__tags > span { + width: auto; + max-width: 76%; +} +.tiny-select.tiny-select__collapse-tags.tiny-select__filterable .tiny-select__tags > span > span:first-child { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-select.tiny-select__collapse-tags.tiny-select__filterable .tiny-select__tags > span > span:first-child { + -ms-flex-preferred-size: auto; + flex-basis: auto; + } +} +.tiny-select.tiny-select__collapse-tags.tiny-select__filterable + .tiny-select__tags + > span + > span:not(:only-child):first-child, +.tiny-select.tiny-select__collapse-tags.tiny-select__filterable .tiny-select__tags > span > span:only-child { + max-width: 100%; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-select.tiny-select__collapse-tags.tiny-select__filterable + .tiny-select__tags + > span + > span:not(:only-child):not(:first-child) { + -ms-flex-negative: 0; + flex-shrink: 0; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } +} +.tiny-select__tags { + position: absolute; + line-height: normal; + white-space: normal; + padding-left: 4px; + z-index: 1; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +.tiny-select__tags.is-showicon { + padding-left: 24px; +} +.tiny-select__tags .tiny-tag.tiny-tag--info { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-select__tags-text { + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.tiny-select__tags-text + .tiny-tag__close { + -ms-flex-negative: 0; + flex-shrink: 0; +} +.tiny-select-tip .tiny-select-tipcontent { + max-width: 300px; +} +.tiny-select .tiny-input .tiny-select__caret { + fill: var(--ti-select-input-caret-color); + font-size: var(--ti-select-input-caret-font-size); + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s; + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg); + cursor: pointer; +} +.tiny-select .tiny-input .tiny-select__caret:hover { + fill: var(--ti-select-input-caret-hover-color); +} +.tiny-select .tiny-input .tiny-select__caret.is-reverse { + -webkit-transform: rotateZ(0); + transform: rotateZ(0); +} +.tiny-select .tiny-input .tiny-select__caret.is-show-close { + font-size: var(--ti-select-input-font-size); + text-align: center; + -webkit-transform: rotateZ(180deg); + transform: rotateZ(180deg); + border-radius: 100%; + fill: var(--ti-select-input-caret-close-color); + -webkit-transition: fill 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: fill 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-select .tiny-input .tiny-select__caret.is-show-close:hover { + color: var(--ti-select-input-caret-close-hover-color); +} +.tiny-select .tiny-input .tiny-select__copy { + cursor: pointer; +} +.tiny-select .tiny-input.is-disabled .tiny-select__caret { + fill: var(--ti-select-input-disabled-caret-color); + cursor: not-allowed; +} +.tiny-select .tiny-input.is-disabled .tiny-input__inner { + cursor: not-allowed; +} +.tiny-select .tiny-input.is-disabled .tiny-input__inner:hover { + border-color: var(--ti-select-input-disabled-inner-hover-border-color); +} +.tiny-select .tiny-input.is-focus .tiny-input__inner { + border-color: var(--ti-select-inner-hover-border-color); +} +.tiny-select > .tiny-input { + display: block; +} +.tiny-select .tiny-tag { + white-space: nowrap; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-color: transparent; + margin: 2px 0 2px 4px; + background-color: #f0f2f5; +} +.tiny-select-dropdown { + --ti-select-dropdown-border-color: transparent; + --ti-select-dropdown-border-radius: var(--ti-common-border-radius-normal); + --ti-select-dropdown-bgcolor: var(--ti-base-color-light); + --ti-select-dropdown-empty-color: var(--ti-base-color-placeholder); + --ti-select-dropdown-empty-font-size: var(--ti-common-font-size-1); + --ti-select-dropdown-list-padding: 0 0 6px 0; + --ti-select-dropdown-item-padding: 0 8px; + --ti-select-dropdown-item-gap: 0; + position: absolute; + z-index: 1001; + border: 1px solid var(--ti-select-dropdown-border-color); + border-radius: var(--ti-select-dropdown-border-radius); + background-color: var(--ti-select-dropdown-bgcolor); + -webkit-box-shadow: var(--ti-base-box-shadow); + box-shadow: var(--ti-base-box-shadow); + margin-top: var(--ti-base-dropdown-gap); + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-select-dropdown .tiny-tree { + max-height: 300px; + overflow-y: auto; +} +.tiny-select-dropdown.tiny-popper { + margin-top: var(--ti-base-dropdown-gap); +} +.tiny-select-dropdown .tiny-scrollbar.is-empty .tiny-select-dropdown__list { + padding: 0; +} +.tiny-select-dropdown__empty { + padding: 10px 0; + margin: 0; + text-align: center; + color: var(--ti-select-dropdown-empty-color); + font-size: var(--ti-select-dropdown-empty-font-size); +} +.tiny-select-dropdown .tiny-select-dropdown__wrap { + max-height: 197px; + margin-right: -4px; +} +.tiny-select-dropdown .tiny-select-dropdown__list { + list-style: none; + margin: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: var(--ti-select-dropdown-list-padding); + text-align: left; +} +.tiny-select-dropdown .tiny-select-dropdown__item { + white-space: nowrap; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: var(--ti-select-dropdown-item-padding); + margin-top: var(--ti-select-dropdown-item-gap); + border-radius: var(--ti-common-border-radius-normal); +} +.tiny-select-dropdown .tiny-select-dropdown__wrap.virtual { + position: relative; + margin-right: 0 !important; +} +.tiny-select-dropdown .tiny-select-dropdown__wrap.virtual .tiny-select-dropdown__item { + position: absolute; + width: 100%; +} +.tiny-slide-bar { + --ti-slider-progress-box-border-color: var(--ti-base-color-light); + --ti-slider-progress-box-hover-border-color: rgba(153, 153, 153, 0.7); + --ti-slider-progress-box-arrow-normal: #f2f2f2; + --ti-slider-progress-box-arrow-hover: #808080; + --ti-slider-progress-box-middleline-normal: #ebebeb; + padding: 0 32px; + position: relative; +} +.tiny-slide-bar > .tiny-svg { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + font-size: 2em; + cursor: pointer; + fill: var(--ti-slider-progress-box-arrow-normal); +} +.tiny-slide-bar > .tiny-svg:hover { + fill: var(--ti-slider-progress-box-arrow-hover); +} +.tiny-slide-bar > .tiny-svg.tiny-disabled, +.tiny-slide-bar > .tiny-svg.tiny-disabled:hover { + background: 0 0; + fill: #fff; + cursor: default; +} +.tiny-slide-bar > .icon-chevron-left { + left: 0; +} +.tiny-slide-bar > .icon-chevron-right { + right: 0; +} +.tiny-slide-bar li li div { + margin: 15px 0; + font-size: var(--ti-common-font-size-base); + color: #4e5e67; +} +.tiny-slide-bar li li div:nth-child(2) { + border-bottom: 1px solid var(--ti-slider-progress-box-middleline-normal); +} +.tiny-slide-bar li li div svg { + float: right; + margin: -6px 0 0 0; + background: #fff; + fill: var(--ti-slider-progress-box-middleline-normal); +} +.tiny-slide-bar .tiny-slide-bar__content { + width: 100%; + min-height: 170px; + position: relative; + overflow: hidden; +} +.tiny-slide-bar .tiny-slide-bar__list { + position: absolute; + min-height: 170px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-slide-bar .tiny-slide-bar__list > li { + width: 23%; + padding: 20px; + float: left; + margin-left: 2%; + position: relative; + border: 5px solid var(--ti-slider-progress-box-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-slide-bar .tiny-slide-bar__list > li:first-child { + margin-left: 0; +} +.tiny-slide-bar .tiny-slide-bar__list > li:hover { + border-color: var(--ti-slider-progress-box-hover-border-color); +} +.tiny-slide-bar .tiny-slide-bar__list > li > .icon-chevron-down { + position: absolute; + top: 98.8%; + left: 50%; + margin-left: -10px; + font-size: 2em; + width: 22px; + display: none !important; +} +.tiny-slide-bar .tiny-slide-bar__list > li > .icon-chevron-down:before { + content: ''; + position: absolute; + width: 20px; + height: 20px; + border-right: 5px solid var(--ti-slider-progress-box-hover-border-color); + border-bottom: 5px solid var(--ti-slider-progress-box-hover-border-color); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + background: #fff; + top: -5px; +} +.tiny-slide-bar .tiny-slide-bar__list > li > ul { + width: 100%; + list-style: none; +} +.tiny-slide-bar .tiny-slide-bar__list > li.tiny-slide-bar__select { + border-color: var(--ti-slider-progress-box-hover-border-color); +} +.tiny-slide-bar .tiny-slide-bar__list > li.tiny-slide-bar__select > .icon-chevron-down { + display: block !important; +} +.tiny-slide-bar .tiny-slide-bar__list > li.tiny-slide-bar__select li .tiny-icon { + color: var(--ti-slider-progress-box-hover-border-color); +} +.tiny-slide-bar .tiny-slide-bar__list > li.tiny-slide-bar__select li:nth-child(2) { + border-bottom: 1px solid var(--ti-slider-progress-box-hover-border-color); +} +.tiny-split { + --ti-split-border-color: #d9d9d9; + --ti-split-trigger-background: #d9d9d9; + --ti-split-trigger-bar-background: var(--ti-base-color-secondary); + --ti-split-trigger-hover-background: var(--ti-split-trigger-background); + --ti-split-trigger-bar-hover-background: var(--ti-split-trigger-bar-background); + --ti-split-trigger-bar-con-background: var(--ti-base-color-light); + --ti-split-trigger-size: 4px; + --ti-split-trigger-con-col-cursor: e-resize; + --ti-split-trigger-con-row-cursor: n-resize; +} +.tiny-split-wrapper { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; +} +.tiny-split-pane { + position: absolute; +} +.tiny-split-pane.left-pane, +.tiny-split-pane.right-pane { + top: 0; + bottom: 0; + overflow: hidden; +} +.tiny-split-pane.left-pane { + left: 0; +} +.tiny-split-pane.right-pane { + right: 0; +} +.tiny-split-pane.bottom-pane, +.tiny-split-pane.top-pane { + left: 0; + right: 0; + overflow: hidden; +} +.tiny-split-pane.top-pane { + top: 0; +} +.tiny-split-pane.bottom-pane { + bottom: 0; +} +.tiny-split-pane-moving { + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-split-trigger-con { + position: absolute; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: 10; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-split-trigger-con:hover .tiny-split-trigger { + background: var(--ti-split-trigger-hover-background); +} +.tiny-split-trigger-con:hover .tiny-split-trigger-bar { + background: var(--ti-split-trigger-bar-hover-background); +} +.tiny-split-trigger-bar-con { + position: absolute; + overflow: hidden; + background: var(--ti-split-trigger-bar-con-background); +} +.tiny-split-trigger-bar-con.vertical { + top: 50%; + height: calc(var(--ti-split-trigger-size) * 7); + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-split-trigger-bar-con.horizontal { + left: 50%; + width: calc(var(--ti-split-trigger-size) * 7); + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); +} +.tiny-split-trigger-vertical { + width: var(--ti-split-trigger-size); + height: 100%; + background: var(--ti-split-trigger-background); +} +.tiny-split-trigger-vertical .tiny-split-trigger-bar { + width: var(--ti-split-trigger-size); + height: var(--ti-split-trigger-size); + background: var(--ti-split-trigger-bar-background); + float: left; + margin-top: var(--ti-split-trigger-size); + border-radius: 50%; +} +.tiny-split-trigger-horizontal { + height: var(--ti-split-trigger-size); + width: 100%; + background: var(--ti-split-trigger-background); +} +.tiny-split-trigger-horizontal .tiny-split-trigger-bar { + height: var(--ti-split-trigger-size); + width: var(--ti-split-trigger-size); + background: var(--ti-split-trigger-bar-background); + float: left; + margin-left: var(--ti-split-trigger-size); + border-radius: 50%; +} +.tiny-split-horizontal .tiny-split-trigger-con { + top: 50%; + height: 100%; + width: 10px; + cursor: var(--ti-split-trigger-con-col-cursor); +} +.tiny-split-horizontal .tiny-split-vertical .tiny-split-trigger-con { + left: 50%; + height: 10px; + width: 100%; +} +.tiny-split-vertical .tiny-split-trigger-con { + left: 50%; + height: 10px; + width: 100%; + cursor: var(--ti-split-trigger-con-row-cursor); +} +.tiny-split-vertical .tiny-split-horizontal .tiny-split-trigger-con { + top: 50%; + height: 100%; + width: 10px; +} +.tiny-split .no-select { + -ms-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tiny-steps { + --ti-steps-advanced-active-color: var(--ti-base-color-brand-6); + --ti-steps-done-active-color: var(--ti-base-color-brand-6); + --ti-steps-done-icon-fill-color: var(--ti-base-color-brand-6); + --ti-steps-done-icon-color: var(--ti-base-color-light); + --ti-steps-line-background: #dbdbdb; + --ti-steps-done-font-color: var(--ti-base-color-info-normal); + --ti-steps-line-height: var(--ti-common-size-base); + --ti-steps-line-active-color: var(--ti-base-color-brand-6); + --ti-steps-advanced-border-color: var(--ti-base-color-border); + --ti-steps-advanced-text: var(--ti-base-color-placeholder); + --ti-steps-advanced-line-height: 28px; + --ti-steps-advanced-li-color: var(--ti-base-color-light); + --ti-steps-advanced-li-font-color: var(--ti-base-color-light); + --ti-steps-advanced-li-hover-color: var(--ti-base-color-placeholder); + --ti-steps-advanced-li-hover-bgcolor: #f1f1f1; + --ti-steps-advanced-link-font-size: var(--ti-common-font-size-base); + --ti-steps-advanced-dot-height: 12px; + --ti-steps-advanced-dot-width: 12px; + --ti-steps-advanced-dot-done-background: var(--ti-base-color-success-normal); + --ti-steps-advanced-dot-doing-background: #faad14; + --ti-steps-advanced-dot-wait-background: var(--ti-base-color-success-normal); + --ti-steps-advanced-count-bgcolor: var(--ti-base-color-bg-8); + --ti-steps-advanced-count-border-radius: 10px; + --ti-steps-advanced-count-font-size: var(--ti-common-font-size-base); + --ti-steps-advanced-count-height: 18px; + --ti-steps-advanced-border-size: 14px; + --ti-steps-timeline-date-time-font-size: var(--ti-common-font-size-base); + --ti-steps-timeline-name-font-size: var(--ti-common-font-size-1); + --ti-steps-timeline-date-time-color: var(--ti-base-color-placeholder); + --ti-steps-icon-size: var(--ti-common-size-5x); + --ti-steps-font-size-7: var(--ti-common-font-size-7); + --ti-steps-font-size-base: var(--ti-common-font-size-base); + --ti-steps-icon-font-size: var(--ti-common-font-size-base); + --ti-steps-icon-background: #d9d9d9; + --ti-steps-unselected-color: var(--ti-base-color-light); + color: var(--ti-steps-timeline-date-time-color); +} +.tiny-steps .tiny-steps-advanced li { + line-height: var(--ti-steps-advanced-line-height); + display: inline-block; + background: var(--ti-steps-advanced-li-color); + position: relative; +} +.tiny-steps .tiny-steps-advanced li.current a { + background: var(--ti-steps-advanced-active-color); + color: var(--ti-steps-advanced-li-font-color); + font-weight: 700; +} +.tiny-steps .tiny-steps-advanced li.current a::after { + border-left-color: var(--ti-steps-advanced-active-color); +} +.tiny-steps .tiny-steps-advanced li a { + border: solid 1px var(--ti-steps-advanced-border-color); + border-right: none; + display: block; + text-align: center; + position: relative; + text-decoration: none; + color: var(--ti-steps-advanced-text); + font-size: var(--ti-steps-advanced-link-font-size); +} +.tiny-steps .tiny-steps-advanced li a::after { + content: ''; + border-top: 14px solid transparent; + border-bottom: 14px solid transparent; + border-left: 9px solid #fff; + position: absolute; + right: -9px; + top: 0; + z-index: 1; +} +.tiny-steps .tiny-steps-advanced li a::before { + content: ''; + border-top: 14px solid transparent; + border-bottom: 14px solid transparent; + border-left: 9px solid #d7d8da; + position: absolute; + left: 0; + top: 0; +} +.tiny-steps .tiny-steps-advanced li a:hover { + background: var(--ti-steps-advanced-li-hover-bgcolor); + color: var(--ti-steps-advanced-li-hover-color); + text-decoration: none; +} +.tiny-steps .tiny-steps-advanced li a:hover::after { + border-left-color: var(--ti-steps-advanced-li-hover-bgcolor); +} +.tiny-steps .tiny-steps-advanced li:first-child a { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.tiny-steps .tiny-steps-advanced li:first-child a::before { + display: none; +} +.tiny-steps .tiny-steps-advanced li:last-child a { + border-right: solid 1px var(--ti-steps-advanced-border-color); + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.tiny-steps .tiny-steps-advanced li:last-child a::after { + display: none; +} +.tiny-steps .tiny-steps-advanced li .dot { + height: var(--ti-steps-advanced-dot-height); + width: var(--ti-steps-advanced-dot-width); + margin-right: 8px; + padding: 0; + right: 0; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + position: absolute; +} +.tiny-steps .tiny-steps-advanced li .dot svg { + width: 100%; + height: 100%; + fill: var(--ti-steps-advanced-text); +} +.tiny-steps .tiny-steps-advanced li.current .dot svg, +.tiny-steps .tiny-steps-advanced li.current .dot svg:hover { + fill: var(--ti-steps-advanced-li-color); +} +.tiny-steps .tiny-steps-advanced li:hover .dot svg { + fill: var(--ti-steps-advanced-text); +} +.tiny-steps .tiny-steps-advanced .count { + background-color: var(--ti-steps-advanced-count-bgcolor); + border-radius: var(--ti-steps-advanced-count-border-radius); + color: var(--ti-steps-advanced-li-font-color); + display: inline-block; + font-size: var(--ti-steps-advanced-count-font-size); + height: var(--ti-steps-advanced-count-height); + line-height: var(--ti-steps-advanced-count-height); + padding: 0 6px; + text-align: center; + white-space: nowrap; + position: absolute; + top: -10px; + right: 10px; +} +.tiny-steps .line { + background: var(--ti-steps-line-background); +} +.tiny-steps .icon { + width: var(--ti-steps-icon-size); + height: var(--ti-steps-icon-size); + line-height: var(--ti-steps-icon-size); + position: relative; + font-size: var(--ti-steps-icon-font-size); + text-align: center; + left: calc(50% - 10px); + top: 4px; + border-radius: 50%; + background: var(--ti-steps-icon-background); + color: var(--ti-steps-unselected-color); + cursor: pointer; + z-index: 15; +} +.tiny-steps .date-time { + text-align: center; +} +.tiny-steps .node-description { + position: relative; + margin-top: 6px; + overflow: hidden; + text-align: center; +} +.tiny-steps .node-description .name { + font-size: var(--ti-steps-font-size-base); + float: left; + width: 100%; +} +.tiny-steps .node-description .status { + font-size: var(--ti-steps-font-size-base); + float: left; + width: 100%; +} +.tiny-steps .process-done .node-description { + color: var(--ti-steps-done-font-color); +} +.tiny-steps .process-done .icon { + background: var(--ti-steps-done-icon-color); + color: var(--ti-steps-done-icon-fill-color); + width: var(--ti-steps-icon-size); + height: var(--ti-steps-icon-size); + line-height: var(--ti-steps-icon-size); + font-size: var(--ti-steps-icon-size); +} +.tiny-steps .process-done .icon .tiny-svg { + fill: var(--ti-steps-done-icon-fill-color); + vertical-align: baseline; + border: 1px solid var(--ti-steps-done-active-color); + border-radius: 50%; + padding: 2px; +} +.tiny-steps .process-done .line { + background: var(--ti-steps-line-active-color); +} +.tiny-steps .process-current .icon { + background: var(--ti-steps-advanced-active-color); + color: var(--ti-steps-advanced-li-font-color); + font-size: var(--ti-steps-font-size-base); +} +.tiny-steps .reverse .process-current .line { + background: var(--ti-steps-line-active-color); +} +.tiny-steps .tiny-steps-normal { + overflow: hidden; +} +.tiny-steps .tiny-steps-normal .normal { + display: block; + float: left; +} +.tiny-steps .tiny-steps-normal .line { + height: var(--ti-steps-line-height); + left: 50%; + top: -8px; + position: relative; +} +.tiny-steps .tiny-steps-normal .line-end { + width: 0; +} +.tiny-steps .tiny-steps-normal .process-done .line { + background: var(--ti-steps-line-active-color); +} +.tiny-steps .tiny-steps-normal .process-current .name { + color: var(--ti-steps-advanced-active-color); + font-weight: 700; +} +.tiny-steps .tiny-steps-normal .icon span { + display: inline-block; +} +.tiny-steps .tiny-steps-timeline { + overflow: hidden; + font-size: var(--ti-steps-timeline-name-font-size); + color: var(--ti-steps-timeline-date-time-color); +} +.tiny-steps .tiny-steps-timeline .timeline .line { + width: var(--ti-steps-line-height); + float: left; +} +.tiny-steps .tiny-steps-timeline .timeline .line .tiny-svg { + vertical-align: baseline; +} +.tiny-steps .tiny-steps-timeline .timeline .date-time { + width: 100px; + float: left; + padding-right: 20px; + text-align: right; +} +.tiny-steps .tiny-steps-timeline .timeline .date-time .time { + display: block; + line-height: 1; +} +.tiny-steps .tiny-steps-timeline .timeline .date-time .date { + display: block; + line-height: 1; + margin-bottom: 4px; +} +.tiny-steps .tiny-steps-timeline .timeline.process-done { + color: var(--ti-steps-done-font-color); +} +.tiny-steps .tiny-steps-timeline .timeline.process-current { + color: var(--ti-steps-advanced-active-color); +} +.tiny-steps .tiny-steps-timeline .timeline .name { + float: left; + margin-left: 20px; + line-height: 1.45em; +} +.tiny-steps .tiny-steps-timeline .timeline .icon { + top: 0; +} +.tiny-steps.mobile { + padding-left: 10%; +} +.tiny-steps.mobile .tiny-steps-timeline { + overflow: inherit; +} +.tiny-steps.mobile .tiny-steps-timeline .tiny-icon { + font-size: 45px; +} +.tiny-steps.mobile .tiny-steps-timeline .timeline .line .icon { + width: 45px; + line-height: 45px; + height: 45px; + font-size: var(--ti-steps-font-size-7); + position: relative; + left: -20px; +} +.tiny-steps.mobile .tiny-steps-timeline .timeline .name { + margin-left: 30px; + font-size: 26px; +} +.tiny-steps.mobile .tiny-steps-timeline .timeline > div { + margin-left: 20px; +} +.tiny-switch { + --ti-switch-on-bgcolor: var(--ti-base-color-brand-6); + --ti-switch-off-bgcolor: var(--ti-base-color-common-2); + --ti-switch-disabled-bgcolor: var(--ti-base-color-common-1); + --ti-switch-checked-disabled-bgcolor: var(--ti-base-color-brand-3); + --ti-switch-disabled-text-color: var(--ti-base-color-bg-5); + --ti-switch-disabled-dot-color: var(--ti-base-color-bg-5); + --ti-switch-font-color: var(--ti-base-color-light); + --ti-switch-dot-color: var(--ti-base-color-light); + --ti-switch-width: 38px; + --ti-switch-height: 20px; + --ti-switch-border-radius: 24px; + --ti-switch-inner-font-size: var(--ti-common-font-size-base, 12px); + --ti-switch-dot-size: 16px; + --ti-switch-dot-offset: calc(var(--ti-switch-dot-size) + 1px); + --ti-switch-text-width: 45px; + display: inline-block; + width: var(--ti-switch-width); + height: var(--ti-switch-height); + line-height: var(--ti-switch-height); + border-radius: var(--ti-switch-border-radius); + vertical-align: middle; + border: 1px solid var(--ti-switch-off-bgcolor); + background-color: var(--ti-switch-off-bgcolor); + position: relative; + cursor: pointer; + outline: 0; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.tiny-switch .tiny-switch-inner { + color: var(--ti-switch-font-color); + font-size: var(--ti-switch-inner-font-size); + position: absolute; + left: calc(var(--ti-switch-dot-size) + 4px); + top: -1px; +} +.tiny-switch__text { + width: var(--ti-switch-text-width); +} +.tiny-switch__text .tiny-switch-inner { + left: calc(var(--ti-switch-dot-size) + 9px); +} +.tiny-switch.mini { + width: calc(var(--ti-switch-width) - 6px); +} +.tiny-switch.disabled, +.tiny-switch.tiny-switch-checked.disabled { + cursor: not-allowed; + background: var(--ti-switch-disabled-bgcolor); + border-color: var(--ti-switch-disabled-bgcolor); +} +.tiny-switch.disabled::after, +.tiny-switch.tiny-switch-checked.disabled::after { + background: var(--ti-switch-disabled-dot-color); + cursor: not-allowed; +} +.tiny-switch.disabled .tiny-switch-inner, +.tiny-switch.tiny-switch-checked.disabled .tiny-switch-inner { + color: var(--ti-switch-disabled-text-color); +} +.tiny-switch.tiny-switch-checked.disabled { + background: var(--ti-switch-checked-disabled-bgcolor); + border-color: var(--ti-switch-checked-disabled-bgcolor); +} +.tiny-switch::after { + content: ''; + width: var(--ti-switch-dot-size); + height: var(--ti-switch-dot-size); + border-radius: 50%; + background-color: var(--ti-switch-dot-color); + position: absolute; + left: 1px; + top: 1px; + cursor: pointer; + -webkit-transition: left 0.2s ease-in-out, width 0.2s ease-in-out; + transition: left 0.2s ease-in-out, width 0.2s ease-in-out; +} +.tiny-switch.tiny-switch-checked { + border-color: var(--ti-switch-on-bgcolor); + background-color: var(--ti-switch-on-bgcolor); +} +.tiny-switch.tiny-switch-checked .tiny-switch-inner { + left: 8px; + width: calc(100% - var(--ti-switch-dot-size)); + overflow: hidden; +} +.tiny-switch.tiny-switch-checked:after { + left: calc(100% - var(--ti-switch-dot-offset)); +} +.tiny-table { + --ti-table-color: var(--ti-base-color-info-normal); + --ti-table-bgcolor: #fafafa; + --ti-table-odd-bgcolor: var(--ti-base-color-light); + --ti-table-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-table-disabled-color: var(--ti-base-color-placeholder); + --ti-table-disabled-bgcolor: #f1f1f1; + --ti-table-nodata-color: #909399; + --ti-table-td-height: var(--ti-base-size-height-medium); + --ti-table-td-font-size: var(--ti-common-font-size-base); + --ti-table-border-color: var(--ti-base-color-border); + --ti-table-thead-bgcolor: var(--ti-base-color-brand-1); + --ti-table-icon-font-size: var(--ti-common-font-size-2); + --ti-table-icon-check-color: var(--ti-base-color-brand-6); +} +.tiny-table.simple table { + table-layout: fixed; +} +.tiny-table.simple table tr { + display: table-row; + vertical-align: inherit; + border-color: inherit; +} +.tiny-table.simple table tbody { + border-bottom: 1px solid var(--ti-table-border-color); +} +.tiny-table.simple table tbody tr { + color: var(--ti-table-color); + background: var(--ti-table-bgcolor); +} +.tiny-table.simple table tbody tr:nth-child(odd) { + background: var(--ti-table-odd-bgcolor); +} +.tiny-table.simple table tbody tr:hover { + background: var(--ti-table-hover-bgcolor); +} +.tiny-table.simple table tbody tr.is-disabled { + background: var(--ti-table-disabled-bgcolor); + color: var(--ti-table-disabled-color); +} +.tiny-table.simple table tbody .noData { + width: 582px; + height: 360px; + text-align: center; + color: var(--ti-table-nodata-color); + margin-bottom: -1px; + border-bottom: 1px solid var(--ti-table-border-color); + padding-top: 10px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-table.simple table th { + padding: 2px 0 2px 8px; + height: var(--ti-table-td-height); + border-left: none; +} +.tiny-table.simple table td { + padding: 2px 0 2px 8px; + height: var(--ti-table-td-height); + font-size: var(--ti-table-td-font-size); +} +.tiny-table.simple table td .overflow { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-table.simple table thead { + border-bottom: 1px solid var(--ti-table-border-color); + text-align: left; + background: var(--ti-table-thead-bgcolor); + color: var(--ti-table-color); +} +.tiny-table.simple table thead th { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; + font-size: var(--ti-table-td-font-size); + color: var(--ti-table-color); + line-height: 1.7em; +} +.tiny-table.simple table thead th .overflow { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-table.simple .tiny-table-header__line { + float: right; + border-left: 1px solid var(--ti-table-border-color); + height: 20px; +} +.tiny-table.simple .tiny-table-cell .tiny-svg { + font-size: var(--ti-common-font-size-2); + font-size: var(--ti-table-icon-font-size); + fill: var(--ti-table-border-color); +} +.tiny-table.simple .tiny-table-cell .tiny-svg.is-check { + fill: var(--ti-table-icon-check-color); +} +.tiny-tabs { + --ti-tabs-header-font-normal: var(--ti-base-color-common-5); + --ti-tabs-header-font-active: var(--ti-base-color-brand-6); + --ti-tabs-header-color: var(--ti-base-color-brand-6); + --ti-tabs-header-background: #f5f5f5; + --ti-tabs-border-color: var(--ti-common-color-line-dividing); + --ti-tabs-height: var(--ti-common-size-10x); + --ti-tabs-item-disabled-color: #b4bccc; + --ti-tabs-icon-close-hover-color: var(--ti-base-color-light); + --ti-tabs-new-height: 18px; + --ti-tabs-new-width: 18px; + --ti-tabs-new-radius: var(--ti-base-radius-large); + --ti-tabs-new-svg-color: var(--ti-base-color-placeholder); + --ti-tabs-font-base-size: var(--ti-common-font-size-base); + --ti-tabs-more-hover-color: var(--ti-base-color-brand-5); + --ti-tabs-more-item-hover-color: var(--ti-base-color-hover-background); + --ti-tabs-dropdown-font-size: var(--ti-common-font-size-1); + --ti-tabs-dropdown-bgcolor: var(--ti-base-color-light); + --ti-tabs-dropdown-border-radius: var(--ti-common-border-radius-normal); + --ti-tabs-dropdown-li-color: var(--ti-base-color-secondary); + --ti-tabs-dropdown-li-border-color: #e6e6e6; + --ti-tabs-small-height: var(--ti-common-size-9x); + --ti-tab-dark-border-radius: var(--ti-common-border-radius-normal) var(--ti-common-border-radius-normal) 0 0; + --ti-tab-dark-text-color-active: var(--ti-base-color-common-7); + --ti-tab-dark-bg-color-avtive: var(--ti-base-color-bg-6); + --ti-tab-dark-text-color-hover: var(--ti-base-color-white); + --ti-tab-dark-bg-color-hover: var(--ti-base-color-common-4); + --ti-tab-dark-text-color: var(--ti-base-color-common-2); + --ti-tabs-header-dark-background: var(--ti-base-color-common-6); + --ti-tabs-item-margin: var(--ti-common-space-10x); + --ti-tabs-item-horizontal-padding: 0 var(--ti-common-space-3x); + --ti-tabs-item-vertical-padding: 0 var(--ti-common-space-5x); + --ti-tabs-item-active-border: 3px solid var(--ti-tabs-header-font-active); + --ti-tabs-item-border-bottom: 1px solid var(--ti-base-color-white); + --ti-tabs-item-card-active-bgcolor: var(--ti-base-color-white); + --ti-tabs-item-card-border-radius: 0; + --ti-tabs-icon-close-default-bgcolor: transparent; + --ti-tabs-icon-close-default-color: var(--ti-tabs-header-font-normal); + --ti-tabs-icon-close-hover-color: var(--ti-tabs-header-font-active); + --ti-tabs-icon-close-size: var(--ti-common-font-size-1); + --ti-tabs-icon-close-margin: 0 0 0 5px; +} +.tiny-tabs--left, +.tiny-tabs--right, +.tiny-tabs__content, +.tiny-tabs__nav-scroll, +.tiny-tabs__nav-wrap { + overflow: hidden; +} +.tiny-tabs__header { + padding: 0; + position: relative; + margin: 0; +} +.tiny-tabs__header .tiny-tabs__active-bar { + position: absolute; + bottom: 0; + left: 0; + height: 2px; + background-color: var(--ti-tabs-header-color); + z-index: 1; + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), + -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + list-style: none; +} +.tiny-tabs__header .tiny-tabs__new-tab { + float: right; + border: 1px solid var(--ti-tabs-border-color); + height: var(--ti-tabs-new-height); + line-height: var(--ti-tabs-new-height); + width: var(--ti-tabs-new-width); + margin: 12px 0 9px 10px; + border-radius: var(--ti-tabs-new-radius); + font-size: var(--ti-tabs-font-base-size); + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; + -webkit-transition: all 0.15s; + transition: all 0.15s; + outline: 0; +} +.tiny-tabs__header .tiny-tabs__new-tab svg { + fill: var(--ti-tabs-new-svg-color); +} +.tiny-tabs__header .tiny-tabs__new-tab:hover svg { + fill: var(--ti-tabs-header-color); +} +.tiny-tabs__header .tiny-tabs__nav-wrap { + margin-bottom: -1px; + position: relative; +} +.tiny-tabs__header .tiny-tabs__nav-wrap::after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background-color: var(--ti-tabs-border-color); + z-index: 1; +} +.tiny-tabs__header .tiny-tabs__nav-wrap.is-scrollable { + padding: 0 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.tiny-tabs__header .tab-dropdown { + position: absolute; + right: 8px; + z-index: 90; + font-size: var(--ti-tabs-dropdown-font-size); + -webkit-box-shadow: 0 1px 2px 1px rgba(0, 0, 0, 0.18); + box-shadow: 0 1px 2px 1px rgba(0, 0, 0, 0.18); + background: var(--ti-tabs-dropdown-bgcolor); + border-radius: var(--ti-tabs-dropdown-border-radius); +} +.tiny-tabs__header .tab-dropdown:before { + position: absolute; + display: inline-block; + top: -5px; + left: 44%; + width: 0; + height: 0; + content: ''; + border-style: solid; + border-width: 6px; + border-color: #fff #fff transparent transparent; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-box-shadow: 1px -1px 1px #e4e4e4; + box-shadow: 1px -1px 1px #e4e4e4; +} +.tiny-tabs__header .tab-dropdown li { + border-bottom: 1px solid var(--ti-tabs-dropdown-li-border-color); +} +.tiny-tabs__header .tab-dropdown li:last-child { + border-bottom: none; +} +.tiny-tabs__header .tab-dropdown li a { + white-space: nowrap; + color: var(--ti-tabs-dropdown-li-color); + line-height: 26px; + padding: 0 10px; + min-width: 100px; + display: block; + font-size: var(--ti-tabs-font-base-size); +} +.tiny-tabs__header .tab-dropdown li a:hover { + color: var(--ti-tabs-more-hover-color); + text-decoration: none; +} +.tiny-tabs__nav-more { + position: absolute; + cursor: pointer; + height: var(--ti-tabs-height); + line-height: var(--ti-tabs-height); + font-size: var(--ti-common-font-size-1); + right: 45px; + z-index: 99; + color: var(--ti-tabs-header-color); +} +.tiny-tabs__nav-next, +.tiny-tabs__nav-prev { + position: absolute; + cursor: pointer; + line-height: var(--ti-tabs-height); + font-size: var(--ti-common-font-size-base); + color: var(--ti-tabs-header-font-normal); +} +.tiny-tabs__nav-next { + right: 0; +} +.tiny-tabs__nav-prev { + left: 0; +} +.tiny-tabs__nav { + white-space: nowrap; + position: relative; + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s; + float: left; + z-index: 2; +} +.tiny-tabs__nav.is-stretch { + min-width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-tabs__nav.is-stretch > * { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} +.tiny-tabs__nav.is-show-active-bar .tiny-tabs__item { + margin-right: var(--ti-tabs-item-margin); +} +.tiny-tabs__nav.is-show-active-bar .tiny-tabs__item.is-active { + border-bottom: var(--ti-tabs-item-active-border); +} +.tiny-tabs__item { + height: var(--ti-tabs-height); + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: var(--ti-tabs-height); + display: inline-block; + list-style: none; + font-size: var(--ti-tabs-dropdown-font-size); + color: var(--ti-tabs-header-font-normal); + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; +} +.tiny-tabs__item:active, +.tiny-tabs__item:focus { + outline: 0; +} +.tiny-tabs__item.is-active, +.tiny-tabs__item:hover { + color: var(--ti-tabs-header-font-active); + cursor: pointer; +} +.tiny-tabs__item.is-active .tiny-tabs__icon-close svg, +.tiny-tabs__item:hover .tiny-tabs__icon-close svg { + fill: var(--ti-tabs-icon-close-hover-color); +} +.tiny-tabs__item.is-disabled { + color: var(--ti-tabs-item-disabled-color); + cursor: default; +} +.tiny-tabs__item.is-disabled .tiny-tabs__icon-close, +.tiny-tabs__item.is-disabled .tiny-tabs__icon-close:hover { + background-color: transparent; +} +.tiny-tabs__item.is-disabled .tiny-tabs__icon-close svg, +.tiny-tabs__item.is-disabled .tiny-tabs__icon-close:hover svg { + fill: var(--ti-tabs-item-disabled-color); +} +.tiny-tabs__item.is-closable > div { + display: inline-block; +} +.tiny-tabs__item > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-tabs__item .tiny-tabs__icon-close { + border-radius: 50%; + text-align: center; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + margin: var(--ti-tabs-icon-close-margin); + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + vertical-align: middle; + background-color: var(--ti-tabs-icon-close-default-bgcolor); +} +.tiny-tabs__item .tiny-tabs__icon-close svg { + font-size: var(--ti-tabs-font-base-size); + -webkit-transform: scale(0.9); + transform: scale(0.9); + vertical-align: middle; + fill: var(--ti-tabs-icon-close-default-color); +} +.tiny-tabs__item .tiny-tabs__icon-close:hover { + background-color: var(--ti-tabs-icon-close-hover-bgcolor); +} +.tiny-tabs__item .tiny-tabs__icon-close:hover svg { + fill: var(--ti-tabs-icon-close-hover-color); +} +.tiny-tabs__content { + position: relative; + padding: 15px 24px; +} +.tiny-tabs .is-show-more { + padding: 0 48px 0 0; +} +.tiny-tabs__more-container { + position: absolute; + right: 0; + font-size: var(--ti-tabs-font-base-size); + color: var(--ti-tabs-header-font-normal); + line-height: var(--ti-tabs-height); +} +.tiny-tabs__more { + cursor: pointer; + color: var(--ti-tabs-header-color); + font-size: var(--ti-tabs-dropdown-font-size); + outline: 0; +} +.tiny-tabs__more:hover { + color: var(--ti-tabs-more-hover-color); +} +.tiny-tabs__more-popover.tiny-popover.tiny-popper { + padding: 0; + border-radius: var(--ti-tabs-dropdown-border-radius); + -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); +} +.tiny-tabs__more-popover .tiny-tabs__more-item { + cursor: pointer; + padding: 8px 12px; + outline: 0; +} +.tiny-tabs__more-popover .tiny-tabs__more-item:hover { + background: var(--ti-tabs-more-item-hover-color); +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--left .tiny-tabs__nav, +.tiny-tabs.tiny-tabs--card.tiny-tabs--right .tiny-tabs__nav { + width: 120px; +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active { + top: -1px; + border-bottom: var(--ti-tabs-item-border-bottom); + border-top: 1px solid var(--ti-tabs-border-color); + border-left: 1px solid var(--ti-tabs-border-color); + border-right: 1px solid var(--ti-tabs-border-color); + background-color: var(--ti-tabs-item-card-active-bgcolor); + border-radius: var(--ti-tabs-item-card-border-radius); +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active:before { + left: 0; + top: 0; +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active.is-closable { + padding: var(--ti-tabs-item-horizontal-padding); +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item.is-active { + -webkit-box-shadow: 0 -2px 0 0 #fff; + box-shadow: 0 -2px 0 0 #fff; +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item.is-active:before { + left: 0; + bottom: 0; +} +.tiny-tabs.tiny-tabs--card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item.is-active.is-closable { + padding: var(--ti-tabs-item-horizontal-padding); +} +.tiny-tabs.tiny-tabs--card > .tiny-tabs__header { + border-bottom: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item { + border-bottom: 1px solid transparent; + border-left: 1px solid transparent; + border-right: 1px solid transparent; + border-top: 1px solid transparent; + -webkit-transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item:first-child { + border-left: none; +} +.tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__nav { + border-bottom: none; + top: 1px; +} +.tiny-tabs.tiny-tabs--border-card { + background: #fff; + border-top: 1px solid var(--ti-tabs-border-color); + -webkit-box-shadow: none; + box-shadow: none; +} +.tiny-tabs.tiny-tabs--border-card > .tiny-tabs__content { + padding: 0 24px 15px; +} +.tiny-tabs.tiny-tabs--border-card > .tiny-tabs__content .tiny-tabs__content { + padding: 15px 0; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header { + background-color: var(--ti-tabs-header-dark-background); + border: none; + margin: 0; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item { + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + margin: -1px -1px 0; + color: var(--ti-tab-dark-text-color); + padding: 0 24px; + border: none; + height: 37px; + margin: 5px 4px 0 0; + line-height: 37px; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item:nth-child(2) { + padding: 0 12px; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active { + color: var(--ti-tab-dark-text-color-active); + background-color: var(--ti-tab-dark-bg-color-avtive); + border: none; + border-bottom-color: #fff; + border-radius: var(--ti-tab-dark-border-radius); +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active:before { + left: 0; + top: 0; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active.is-closable { + padding: var(--ti-tabs-item-horizontal-padding); +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item:not(.is-active):hover { + color: var(--ti-tab-dark-text-color-hover); + background: var(--ti-tab-dark-bg-color-hover); +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item:first-child { + margin-left: 20px; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__nav-prev { + fill: var(--ti-common-color-icon-white); +} +.tiny-tabs.tiny-tabs--border-card .tiny-tabs--border-card .tiny-tabs--bottom { + border-top: 0; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item.is-active:before, +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active:before, +.tiny-tabs.tiny-tabs--card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item.is-active:before, +.tiny-tabs.tiny-tabs--card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item.is-active:before { + position: absolute; + content: ''; + width: 100%; + height: 0; + background: var(--ti-tabs-header-color); +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item .tiny-tabs__icon-close, +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item .tiny-tabs__icon-close, +.tiny-tabs.tiny-tabs--card.tiny-tabs--bottom > .tiny-tabs__header .tiny-tabs__item .tiny-tabs__icon-close, +.tiny-tabs.tiny-tabs--card.tiny-tabs--top > .tiny-tabs__header .tiny-tabs__item .tiny-tabs__icon-close { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: var(--ti-tabs-icon-close-size); + height: var(--ti-tabs-icon-close-size); + line-height: var(--ti-tabs-icon-close-size); + vertical-align: middle; + overflow: hidden; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; +} +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--bottom .is-scrollable, +.tiny-tabs.tiny-tabs--border-card.tiny-tabs--top .is-scrollable, +.tiny-tabs.tiny-tabs--card.tiny-tabs--bottom .is-scrollable, +.tiny-tabs.tiny-tabs--card.tiny-tabs--top .is-scrollable { + padding: 0 24px; +} +.tiny-tabs.tiny-tabs--border-card > .tiny-tabs__header .tiny-tabs__nav-wrap:after, +.tiny-tabs.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__nav-wrap:after { + content: none; +} +.tiny-tabs.tiny-tabs--small .tiny-tabs__item { + height: var(--ti-tabs-small-height); + line-height: var(--ti-tabs-small-height); +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__header { + float: left; + margin-bottom: 0; + margin-right: 10px; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap { + margin-right: -1px; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__item { + text-align: left; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card .tiny-tabs__item { + padding: var(--ti-tabs-item-vertical-padding); +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item { + border-left: 1px solid var(--ti-tabs-border-color); + border-right: 1px solid var(--ti-tabs-border-color); + border-top: 1px solid var(--ti-tabs-border-color); + background-color: var(--ti-tabs-header-background); +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item:first-child { + border-top: none; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item.is-active { + border-right-color: transparent; + border-left: var(--ti-tabs-item-active-border); + border-bottom: none; + background: 0 0; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item.is-active:first-child { + border-top: none; + border-right-color: transparent; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__item.is-active:last-child { + border-bottom: none; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__nav { + border-right: none; + border-left: none; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--card > .tiny-tabs__header .tiny-tabs__new-tab { + float: none; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__header { + border-right: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__item { + border: 1px solid transparent; + margin: -1px -1px -1px 0; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__item.is-active { + border: 1px solid var(--ti-tabs-border-color); + border-left: none; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs--border-card .tiny-tabs__item { + margin: -1px; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs--border-card .tiny-tabs__item.is-bottom.is-active { + border-left: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__active-bar, +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap::after { + right: auto; + left: 0; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-scroll { + height: 100%; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs__header { + float: right; + margin-bottom: 0; + margin-left: 10px; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs__header.is-left { + margin-left: 0; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap { + margin-left: -1px; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap.is-left { + margin-left: 0; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap:after { + left: 0; + right: auto; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item { + border-top: 1px solid var(--ti-tabs-border-color); + border-bottom: none; + background-color: var(--ti-tabs-header-background); + padding: var(--ti-tabs-item-vertical-padding); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-active { + border-left-color: transparent; + border-right: var(--ti-tabs-item-active-border); + background: 0 0; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-active:first-child { + border-left: none; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-active:last-child { + border-bottom: none; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-active.is-bottom { + border-top: 0; + border-right: 0; + border-left-color: var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-active.is-bottom:first-child { + border-left: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item:first-child { + border-left: 1px solid var(--ti-tabs-border-color); + border-top: none; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-bottom:first-child { + border-top: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-bottom.is-active:first-child { + border-top: none; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-bottom, +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__item.is-top { + background: 0 0; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__nav { + border-bottom: 1px solid var(--ti-tabs-border-color); + border-left: none; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs__nav.is-bottom { + border-top: none; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tab-pane .tiny-tabs--top .tiny-tabs__header { + margin-left: 0; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tab-pane .tiny-tabs--top .tiny-tabs__item { + border-top: none; + border-bottom: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tab-pane .tiny-tabs--top .tiny-tabs__item.is-active { + top: 0; + border-right: 0; + border-left-color: var(--ti-tabs-border-color); + border-bottom: 1px solid #fff; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tab-pane .tiny-tabs--top .tiny-tabs__item.is-active:first-child { + border-left: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__item.is-top { + margin: 0 0 -1px -1px; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__item.is-top.is-active { + border-right: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__item.is-bottom { + margin: -1px; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__item.is-bottom.is-active { + border-right: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__item.is-right { + margin: -1px 0 -1px 0; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__item.is-right.is-active { + border-top: 1px solid var(--ti-tabs-border-color); + border-bottom: 1px solid var(--ti-tabs-border-color); + border-right: 3px solid var(--ti-tabs-header-font-active); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--card .tiny-tabs--border-card .tiny-tabs__nav.is-bottom { + border-bottom: 0; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__header { + border-left: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__item { + border: 1px solid transparent; + margin: -1px -1px -1px 0; +} +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__item.is-active { + border-color: var(--ti-tabs-border-color) transparent; +} +.tiny-tabs.tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__active-bar { + left: auto; + right: 0; +} +.tiny-tabs.tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__active-bar.is-bottom { + left: 0; +} +.tiny-tabs.tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__active-bar.is-left { + left: 0; + right: auto; +} +.tiny-tabs.tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__nav-wrap::after { + left: auto; + right: 0; +} +.tiny-tabs.tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__nav-wrap.is-left::after { + left: 0; + right: auto; +} +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__header.is-bottom { + margin-left: 0; +} +.tiny-tabs.tiny-tabs--right + .tiny-tab-pane + .tiny-tabs--top:not(.tiny-tabs--card):not(.tiny-tabs--border-card) + .tiny-tabs__item { + border-bottom: 0; + background-color: transparent; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs--bottom:not(.tiny-tabs--card) .tiny-tabs__item { + border-top: 0; + background-color: transparent; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs--left.tiny-tabs--card .tiny-tabs__item.is-active:first-child { + border-left: 3px solid var(--ti-tabs-header-font-active); + border-right: 0; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs--left:not(.tiny-tabs--card) .tiny-tabs__nav, +.tiny-tabs.tiny-tabs--right .tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__nav { + border-bottom: 0; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs--left:not(.tiny-tabs--card) .tiny-tabs__item, +.tiny-tabs.tiny-tabs--right .tiny-tabs--right:not(.tiny-tabs--card) .tiny-tabs__item { + border: 0; + background-color: transparent; +} +.tiny-tabs.tiny-tabs--right .tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__item.is-active { + border: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--right .tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__item.is-active.is-left { + border-left: 3px solid var(--ti-tabs-header-font-active); +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__header, +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap, +.tiny-tabs.tiny-tabs--right .tiny-tabs__header, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap { + height: 100%; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__active-bar, +.tiny-tabs.tiny-tabs--right .tiny-tabs__active-bar { + top: 1px; + bottom: auto; + width: 2px; + height: auto; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__active-bar.is-top, +.tiny-tabs.tiny-tabs--right .tiny-tabs__active-bar.is-top { + height: 3px; + bottom: 0; + left: 0; + top: auto; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__active-bar.is-bottom, +.tiny-tabs.tiny-tabs--right .tiny-tabs__active-bar.is-bottom { + top: auto; + bottom: 0; + height: 3px; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap { + margin-bottom: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap.is-scrollable, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap.is-scrollable { + padding: 30px 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap::after, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap::after { + height: 100%; + width: 2px; + bottom: auto; + top: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap.is-top::after, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap.is-top::after { + left: 0; + bottom: 0; + top: auto; + width: 100%; + height: 1px; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-wrap.is-bottom:after, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-wrap.is-bottom:after { + left: 0; + bottom: 0; + top: auto; + width: 100%; + height: 1px; + background-color: #d9d9d9; + z-index: 1; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav { + float: none; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__item, +.tiny-tabs.tiny-tabs--right .tiny-tabs__item { + display: block; + font-size: var(--ti-tabs-font-base-size); +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-prev, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-prev { + height: 30px; + line-height: 30px; + width: 100%; + text-align: center; + cursor: pointer; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-next i, +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-prev i, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-next i, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-prev i { + -webkit-transform: rotateZ(90deg); + transform: rotateZ(90deg); +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-prev, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-prev { + left: auto; + top: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--right .tiny-tabs__nav-next { + right: auto; + bottom: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__header, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__nav-wrap, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__header, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__nav-wrap { + float: inherit; + margin-bottom: -1px; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__header.is-bottom, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__header.is-top, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__nav-wrap.is-bottom, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__nav-wrap.is-top, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__header.is-bottom, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__header.is-top, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__nav-wrap.is-bottom, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__nav-wrap.is-top { + float: none; + margin-right: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__header.is-left, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__nav-wrap.is-left, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__header.is-left, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__nav-wrap.is-left { + float: left; + margin-bottom: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__header.is-right, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__nav-wrap.is-right, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__header.is-right, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__nav-wrap.is-right { + float: right; + margin-bottom: 0; + margin-right: 0; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__item, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__item { + display: inline-block; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__item.is-left, +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__item.is-right, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__item.is-left, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__item.is-right { + display: inherit; +} +.tiny-tabs.tiny-tabs--left .tiny-tab-pane .tiny-tabs__nav, +.tiny-tabs.tiny-tabs--right .tiny-tab-pane .tiny-tabs__nav { + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card { + border-top: 0; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__nav-wrap.is-scrollable, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__nav-wrap.is-scrollable { + padding: 0; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__nav-prev, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__nav-prev { + display: none; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs__header, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs__header { + border: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs--border-card .is-top.tiny-tabs__header, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs--border-card .is-top.tiny-tabs__header { + border-top: 0; + border-left: 0; +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs--border-card .is-top.tiny-tabs__item.is-active, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs--border-card .is-top.tiny-tabs__item.is-active { + border-left: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--left.tiny-tabs--border-card .tiny-tabs--border-card .is-bottom.tiny-tabs__header, +.tiny-tabs.tiny-tabs--right.tiny-tabs--border-card .tiny-tabs--border-card .is-bottom.tiny-tabs__header { + border-left: 0; +} +.tiny-tabs.tiny-tabs--bottom .tiny-tabs__header { + margin-bottom: 0; + margin-top: 10px; +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card { + border-top: 0; +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__header { + background: var(--ti-tabs-header-background); + border-bottom: 1px solid var(--ti-tabs-border-color); + border-right: 1px solid var(--ti-tabs-border-color); + border-top: 1px solid var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__nav-wrap { + margin-top: -1px; + margin-bottom: 0; +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__nav-wrap.is-top { + margin-bottom: -1px; +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__item { + border: 1px solid transparent; + margin: 0 -1px -1px; +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__item.is-active { + background-color: var(--ti-tabs-dropdown-bgcolor); + border-right-color: var(--ti-tabs-border-color); + border-left-color: var(--ti-tabs-border-color); +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__item.is-active:before { + left: 0; + bottom: 0; +} +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs--border-card { + border-top: 0; +} +.tiny-tabs.tiny-tabs--bottom .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) .tiny-tabs__header { + background: 0 0; + border: 0; +} +.tiny-tabs.tiny-tabs--bottom + .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) + .tiny-tabs__header.is-left + .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--bottom + .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) + .tiny-tabs__header.is-left + .tiny-tabs__nav-prev, +.tiny-tabs.tiny-tabs--bottom + .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) + .tiny-tabs__header.is-right + .tiny-tabs__nav-next, +.tiny-tabs.tiny-tabs--bottom + .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) + .tiny-tabs__header.is-right + .tiny-tabs__nav-prev { + display: none; +} +.tiny-tabs.tiny-tabs--bottom + .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) + .tiny-tabs__header.is-left + .tiny-tabs__nav-wrap, +.tiny-tabs.tiny-tabs--bottom + .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) + .tiny-tabs__header.is-right + .tiny-tabs__nav-wrap { + padding: 0; +} +.tiny-tabs.tiny-tabs--bottom .tiny-tabs:not(.tiny-tabs--border-card):not(.tiny-tabs--card) .tiny-tabs__item.is-active { + background-color: transparent; + border: none; +} +.tiny-tabs.tiny-tabs--bottom .tiny-tabs--left .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--bottom .tiny-tabs--right .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--border-card .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--bottom.tiny-tabs--card .tiny-tabs__item, +.tiny-tabs.tiny-tabs--top .tiny-tabs--left .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--top .tiny-tabs--right .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--top.tiny-tabs--border-card .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--top.tiny-tabs--card .tiny-tabs__item { + padding: var(--ti-tabs-item-horizontal-padding); +} +.tiny-tabs.tiny-tabs--bottom:not(.tiny-tabs--card):not(.tiny-tabs--border-card) .tiny-tabs__item, +.tiny-tabs.tiny-tabs--top:not(.tiny-tabs--card):not(.tiny-tabs--border-card) .tiny-tabs__item { + padding-left: 0; +} +.tiny-tabs.tiny-tabs--bottom:not(.tiny-tabs--card):not(.tiny-tabs--border-card) .tiny-tabs__item.is-left, +.tiny-tabs.tiny-tabs--top:not(.tiny-tabs--card):not(.tiny-tabs--border-card) .tiny-tabs__item.is-left { + padding: 0 24px; +} +.tiny-tabs.tiny-tabs--bottom:not(.tiny-tabs--card):not(.tiny-tabs--border-card) .tiny-tabs__item:nth-child(2), +.tiny-tabs.tiny-tabs--top:not(.tiny-tabs--card):not(.tiny-tabs--border-card) .tiny-tabs__item:nth-child(2) { + padding-left: 0; +} +.tiny-tabs .slideInLeft-transition, +.tiny-tabs .slideInRight-transition { + display: inline-block; +} +.tiny-tabs .slideInRight-enter { + -webkit-animation: slideInRight-enter 0.3s; + animation: slideInRight-enter 0.3s; +} +.tiny-tabs .slideInRight-leave { + position: absolute; + left: 0; + right: 0; + -webkit-animation: slideInRight-leave 0.3s; + animation: slideInRight-leave 0.3s; +} +.tiny-tabs .slideInLeft-enter { + -webkit-animation: slideInLeft-enter 0.3s; + animation: slideInLeft-enter 0.3s; +} +.tiny-tabs .slideInLeft-leave { + position: absolute; + left: 0; + right: 0; + -webkit-animation: slideInLeft-leave 0.3s; + animation: slideInLeft-leave 0.3s; +} +@-webkit-keyframes slideInRight-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideInRight-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes slideInRight-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0; + } +} +@keyframes slideInRight-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0; + } +} +@-webkit-keyframes slideInLeft-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideInLeft-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes slideInLeft-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } +} +@keyframes slideInLeft-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } +} +.tiny-tag { + --ti-tag-height: 22px; + --ti-tag-medium-height: var(--ti-common-size-6x); + --ti-tag-small-height: var(--ti-common-size-5x); + --ti-tag-mini-height: var(--ti-common-size-4x); + --ti-tag-border-color: var(--ti-base-color-border); + --ti-tag-border-radius: var(--ti-base-radius-medium); + --ti-tag-font-size: var(--ti-base-font-size); + --ti-tag-close-font-size: var(--ti-common-font-size-1); + --ti-tag-primary-color: var(--ti-base-color-common-5); + --ti-tag-primary-border-color: var(--ti-base-color-bg-6); + --ti-tag-primary-background-color: var(--ti-base-color-bg-6); + --ti-tag-warning-color: var(--ti-common-color-warn-text); + --ti-tag-warning-border-color: var(--ti-common-color-warn-border); + --ti-tag-warning-background-color: var(--ti-common-color-warn-bg); + --ti-tag-danger-color: var(--ti-common-color-error-text); + --ti-tag-danger-border-color: var(--ti-common-color-error-border-secondary); + --ti-tag-danger-background-color: var(--ti-common-color-error-bg); + --ti-tag-success-color: var(--ti-common-color-text-success); + --ti-tag-success-border-color: var(--ti-common-color-success-border); + --ti-tag-success-background-color: var(--ti-common-color-success-bg); + --ti-tag-info-color: var(--ti-common-color-info-text); + --ti-tag-info-border-color: var(--ti-common-color-info-border); + --ti-tag-info-background-color: var(--ti-common-color-info-bg); + --ti-tag-dark-color: var(--ti-base-color-light); + --ti-tag-dark-bgcolor: var(--ti-common-color-prompt); + --ti-tag-dark-success-bgcolor: var(--ti-common-color-success); + --ti-tag-dark-warning-bgcolor: var(--ti-common-color-warn); + --ti-tag-dark-danger-bgcolor: var(--ti-common-color-error); + --ti-tag-dark-info-bgcolor: var(--ti-common-color-info); + --ti-tag-plain-color: var(--ti-common-color-prompt); + --ti-tag-plain-border-color: var(--ti-common-color-prompt-border); + --ti-tag-plain-background-color: var(--ti-base-color-light); + --ti-tag-plain-info-color: var(--ti-common-color-info); + --ti-tag-plain-info-border-color: var(--ti-common-color-info-border); + --ti-tag-plain-success-color: var(--ti-common-color-success); + --ti-tag-plain-success-border-color: var(--ti-common-color-success-border); + --ti-tag-plain-warning-color: var(--ti-common-color-warn); + --ti-tag-plain-warning-border-color: var(--ti-common-color-warn-border); + --ti-tag-plain-danger-color: var(--ti-common-color-error); + --ti-tag-plain-danger-border-color: var(--ti-common-color-error-border-secondary); + height: var(--ti-tag-height); + line-height: var(--ti-tag-height); + padding: 0 8px; + font-size: var(--ti-tag-font-size); + border-width: 1px; + border-radius: var(--ti-tag-border-radius); + border-style: solid; + -webkit-box-sizing: border-box; + box-sizing: border-box; + white-space: nowrap; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: var(--ti-tag-primary-color); + border-color: var(--ti-tag-primary-border-color); + background-color: var(--ti-tag-primary-background-color); +} +.tiny-tag.is-hit { + border-color: var(--ti-tag-primary-color); +} +.tiny-tag .tiny-tag__close { + fill: var(--ti-tag-primary-color); + opacity: 0.5; +} +.tiny-tag .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag .tiny-tag__text:hover { + cursor: pointer; + color: #526ecc; +} +.tiny-tag .tiny-tag__close { + font-size: var(--ti-tag-close-font-size); + margin-left: 6px; +} +.tiny-tag .tiny-tag__close:hover { + cursor: pointer; + fill: #5e7ce0; +} +.tiny-tag.tiny-tag--info { + color: var(--ti-tag-info-color); + border-color: var(--ti-tag-info-border-color); + background-color: var(--ti-tag-info-background-color); +} +.tiny-tag.tiny-tag--info.is-hit { + border-color: var(--ti-tag-info-color); +} +.tiny-tag.tiny-tag--info .tiny-tag__close { + fill: var(--ti-tag-info-color); + opacity: 0.5; +} +.tiny-tag.tiny-tag--info .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag.tiny-tag--success { + color: var(--ti-tag-success-color); + border-color: var(--ti-tag-success-border-color); + background-color: var(--ti-tag-success-background-color); +} +.tiny-tag.tiny-tag--success.is-hit { + border-color: var(--ti-tag-success-color); +} +.tiny-tag.tiny-tag--success .tiny-tag__close { + fill: var(--ti-tag-success-color); + opacity: 0.5; +} +.tiny-tag.tiny-tag--success .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag.tiny-tag--warning { + color: var(--ti-tag-warning-color); + border-color: var(--ti-tag-warning-border-color); + background-color: var(--ti-tag-warning-background-color); +} +.tiny-tag.tiny-tag--warning.is-hit { + border-color: var(--ti-tag-warning-color); +} +.tiny-tag.tiny-tag--warning .tiny-tag__close { + fill: var(--ti-tag-warning-color); + opacity: 0.5; +} +.tiny-tag.tiny-tag--warning .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag.tiny-tag--danger { + color: var(--ti-tag-danger-color); + border-color: var(--ti-tag-danger-border-color); + background-color: var(--ti-tag-danger-background-color); +} +.tiny-tag.tiny-tag--danger.is-hit { + border-color: var(--ti-tag-danger-color); +} +.tiny-tag.tiny-tag--danger .tiny-tag__close { + fill: var(--ti-tag-danger-color); + opacity: 0.5; +} +.tiny-tag.tiny-tag--danger .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--dark { + color: var(--ti-tag-dark-color); + border-color: var(--ti-tag-dark-bgcolor); + background-color: var(--ti-tag-dark-bgcolor); +} +.tiny-tag--dark.is-hit { + border-color: var(--ti-tag-dark-bgcolor); +} +.tiny-tag--dark .tiny-tag__close { + fill: var(--ti-tag-dark-color); + opacity: 0.5; +} +.tiny-tag--dark .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--dark.tiny-tag--info { + color: var(--ti-tag-dark-color); + border-color: var(--ti-tag-dark-info-bgcolor); + background-color: var(--ti-tag-dark-info-bgcolor); +} +.tiny-tag--dark.tiny-tag--info.is-hit { + border-color: var(--ti-tag-dark-info-bgcolor); +} +.tiny-tag--dark.tiny-tag--info .tiny-tag__close { + fill: var(--ti-tag-dark-color); + opacity: 0.5; +} +.tiny-tag--dark.tiny-tag--info .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--dark.tiny-tag--success { + color: var(--ti-tag-dark-color); + border-color: var(--ti-tag-dark-success-bgcolor); + background-color: var(--ti-tag-dark-success-bgcolor); +} +.tiny-tag--dark.tiny-tag--success.is-hit { + border-color: var(--ti-tag-dark-success-bgcolor); +} +.tiny-tag--dark.tiny-tag--success .tiny-tag__close { + fill: var(--ti-tag-dark-color); + opacity: 0.5; +} +.tiny-tag--dark.tiny-tag--success .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--dark.tiny-tag--warning { + color: var(--ti-tag-dark-color); + border-color: var(--ti-tag-dark-warning-bgcolor); + background-color: var(--ti-tag-dark-warning-bgcolor); +} +.tiny-tag--dark.tiny-tag--warning.is-hit { + border-color: var(--ti-tag-dark-warning-bgcolor); +} +.tiny-tag--dark.tiny-tag--warning .tiny-tag__close { + fill: var(--ti-tag-dark-color); + opacity: 0.5; +} +.tiny-tag--dark.tiny-tag--warning .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--dark.tiny-tag--danger { + color: var(--ti-tag-dark-color); + border-color: var(--ti-tag-dark-danger-bgcolor); + background-color: var(--ti-tag-dark-danger-bgcolor); +} +.tiny-tag--dark.tiny-tag--danger.is-hit { + border-color: var(--ti-tag-dark-danger-bgcolor); +} +.tiny-tag--dark.tiny-tag--danger .tiny-tag__close { + fill: var(--ti-tag-dark-color); + opacity: 0.5; +} +.tiny-tag--dark.tiny-tag--danger .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--plain { + color: var(--ti-tag-plain-color); + border-color: var(--ti-tag-plain-border-color); + background-color: var(--ti-tag-plain-background-color); +} +.tiny-tag--plain.is-hit { + border-color: var(--ti-tag-plain-color); +} +.tiny-tag--plain .tiny-tag__close { + fill: var(--ti-tag-plain-color); + opacity: 0.5; +} +.tiny-tag--plain .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--plain.tiny-tag--info { + color: var(--ti-tag-plain-info-color); + border-color: var(--ti-tag-plain-info-border-color); + background-color: var(--ti-tag-plain-background-color); +} +.tiny-tag--plain.tiny-tag--info.is-hit { + border-color: var(--ti-tag-plain-info-color); +} +.tiny-tag--plain.tiny-tag--info .tiny-tag__close { + fill: var(--ti-tag-plain-info-color); + opacity: 0.5; +} +.tiny-tag--plain.tiny-tag--info .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--plain.tiny-tag--success { + color: var(--ti-tag-plain-success-color); + border-color: var(--ti-tag-plain-success-border-color); + background-color: var(--ti-tag-plain-background-color); +} +.tiny-tag--plain.tiny-tag--success.is-hit { + border-color: var(--ti-tag-plain-success-color); +} +.tiny-tag--plain.tiny-tag--success .tiny-tag__close { + fill: var(--ti-tag-plain-success-color); + opacity: 0.5; +} +.tiny-tag--plain.tiny-tag--success .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--plain.tiny-tag--warning { + color: var(--ti-tag-plain-warning-color); + border-color: var(--ti-tag-plain-warning-border-color); + background-color: var(--ti-tag-plain-background-color); +} +.tiny-tag--plain.tiny-tag--warning.is-hit { + border-color: var(--ti-tag-plain-warning-color); +} +.tiny-tag--plain.tiny-tag--warning .tiny-tag__close { + fill: var(--ti-tag-plain-warning-color); + opacity: 0.5; +} +.tiny-tag--plain.tiny-tag--warning .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--plain.tiny-tag--danger { + color: var(--ti-tag-plain-danger-color); + border-color: var(--ti-tag-plain-danger-border-color); + background-color: var(--ti-tag-plain-background-color); +} +.tiny-tag--plain.tiny-tag--danger.is-hit { + border-color: var(--ti-tag-plain-danger-color); +} +.tiny-tag--plain.tiny-tag--danger .tiny-tag__close { + fill: var(--ti-tag-plain-danger-color); + opacity: 0.5; +} +.tiny-tag--plain.tiny-tag--danger .tiny-tag__close:hover { + opacity: 1; +} +.tiny-tag--medium { + height: var(--ti-tag-medium-height); + line-height: calc(var(--ti-tag-medium-height) - 2px); +} +.tiny-tag--small { + height: var(--ti-tag-small-height); + line-height: calc(var(--ti-tag-small-height) - 2px); +} +.tiny-tag--mini { + height: var(--ti-tag-mini-height); + line-height: calc(var(--ti-tag-mini-height) - 2px); +} +.tiny-tall-storage { + --ti-tall-storage-bgcolor: var(--ti-base-color-light); + --ti-tall-storage-border-radius: var(--ti-common-border-radius-normal); + --ti-tall-storage-item-height: var(--ti-base-size-height-minor); + --ti-tall-storage-item-bgcolor: var(--ti-base-color-hover-background); + position: relative; + margin-top: 2px; +} +.tiny-tall-storage .tiny-storage-list-style { + position: absolute; + background-color: var(--ti-tall-storage-bgcolor); + -webkit-box-shadow: var(--ti-base-box-shadow); + box-shadow: var(--ti-base-box-shadow); + border-radius: var(--ti-tall-storage-border-radius); + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + z-index: 10; +} +.tiny-tall-storage .tiny-storage-list-style .tiny-storage-list { + padding: 0; + list-style: none; +} +.tiny-tall-storage .tiny-storage-list-style .tiny-storage-list .tiny-storage-item { + height: var(--ti-tall-storage-item-height); + line-height: var(--ti-tall-storage-item-height); + padding: 0 8px; + white-space: nowrap; +} +.tiny-tall-storage .tiny-storage-list-style .tiny-storage-list .tiny-storage-item.item-hover, +.tiny-tall-storage .tiny-storage-list-style .tiny-storage-list .tiny-storage-item:hover { + cursor: pointer; + background-color: var(--ti-tall-storage-item-bgcolor); +} +.tiny-text-popup { + --ti-text-popup-radius: var(--ti-common-border-radius-normal); + --ti-text-popup-border-color: var(--ti-base-color-border); + --ti-text-popup-hover-border-color: var(--ti-base-color-brand-6); + display: inline-block; +} +.tiny-text-popup .area { + padding: 6px; + width: 100%; + border-radius: var(--ti-text-popup-radius, 2px); + outline: 0; +} +.tiny-text-popup .text { + border: 1px solid var(--ti-text-popup-border-color); + line-height: 1; +} +.tiny-text-popup .text:hover { + border-color: var(--ti-text-popup-hover-border-color); +} +.tiny-text-popup .popup { + resize: none; + -webkit-box-shadow: 0 0 1px 1px rgba(175, 175, 175, 0.3); + box-shadow: 0 0 1px 1px rgba(175, 175, 175, 0.3); + border: 1px solid var(--ti-text-popup-border-color); +} +.tiny-tips { + --ti-tips-normal-color: var(--ti-base-color-secondary); + --ti-tips-normal-font-color: var(--ti-base-color-light); + --ti-tips-error-color: #ff7875; + --ti-tips-error-font-color: var(--ti-base-color-light); + --ti-tips-succeed-color: var(--ti-base-color-success-normal); + --ti-tips-succeed-font-color: var(--ti-base-color-light); + --ti-tips-warning-color: #fa8c16; + --ti-tips-warning-font-color: var(--ti-base-color-light); + --ti-tips-infor-color: var(--ti-base-color-border); + --ti-tips-infor-font-color: var(--ti-base-color-info-normal); + --ti-tips-bgcolor: #ff7875; + --ti-tips-radius: var(--ti-common-border-radius-normal); + --ti-tips-height: 26px; + z-index: 900; + position: absolute; + padding: var(--ti-tips-padding); + background: var(--ti-tips-bgcolor); + border-radius: var(--ti-tips-radius); + color: var(--ti-tips-color-infor); + min-height: var(--ti-tips-height); + text-align: center; + line-height: var(--ti-tips-height); +} +.tiny-tips .tiny-icon { + color: var(--ti-tips-color-infor); + line-height: 36px; +} +.tiny-tips > span { + float: left; + top: -5px; +} +.tiny-tips:before { + content: ''; + left: -4px; + top: 50%; + margin-top: -4px; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-tips-bgcolor); +} +.tiny-tips span + p { + max-width: 300px; + max-height: 100px; + word-break: break-all; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: auto; +} +.tiny-tips .tiny-small-close { + position: absolute; + cursor: pointer; + right: 8px; + top: -5px; +} +.tiny-tips .icon-remove + p, +.tiny-tips .icon-successful + p { + margin-left: 0; +} +.tiny-tips.tips-bottom { + top: -5px; + left: 0; +} +.tiny-tips.tips-bottom:before { + content: ''; + left: 50%; + top: -4px; + margin-top: 0; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-bgcolor) transparent; + margin-left: -6px; +} +.tiny-tips.tips-left:before { + content: ''; + left: auto; + top: 50%; + margin-top: -4px; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 0 4px 4px; + border-color: transparent var(--ti-tips-bgcolor); + right: -4px; +} +.tiny-tips.tips-top { + top: -5px; + left: 0; +} +.tiny-tips.tips-top:before { + content: ''; + left: 50%; + top: auto; + margin-top: auto; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-bgcolor) transparent; + margin-left: -6px; + bottom: -4px; + margin-bottom: 0; +} +.tiny-tips.tips-top-left { + top: -5px; + left: 0; +} +.tiny-tips.tips-top-left:before { + content: ''; + left: 0; + top: auto; + margin-top: auto; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-bgcolor) transparent; + margin-left: 10px; + bottom: -4px; + margin-bottom: 0; +} +.tiny-tips.tips-top-right { + top: -5px; + left: 0; +} +.tiny-tips.tips-top-right:before { + content: ''; + left: 100%; + top: auto; + margin-top: auto; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-bgcolor) transparent; + margin-left: -16px; + bottom: -4px; + margin-bottom: 0; +} +.tiny-tips.tips-bottom-left { + top: -5px; + left: 0; +} +.tiny-tips.tips-bottom-left:before { + content: ''; + left: 0; + top: -4px; + margin-top: 0; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-bgcolor) transparent; + margin-left: 10px; +} +.tiny-tips.tips-bottom-right { + top: -5px; + left: 0; +} +.tiny-tips.tips-bottom-right:before { + content: ''; + left: 100%; + top: -4px; + margin-top: 0; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-bgcolor) transparent; + margin-left: -16px; +} +.tiny-tips.tips-error { + background: var(--ti-tips-error-color); + color: var(--ti-tips-error-font-color); + border-radius: var(--ti-tips-radius-large, 3px); + -webkit-box-shadow: 0 0 4px var(--ti-tips-error-color); + box-shadow: 0 0 4px var(--ti-tips-error-color); + margin-top: 0; +} +.tiny-tips.tips-error:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-tips-error-color); +} +.tiny-tips.tips-error.tips-bottom:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-error-color) transparent; +} +.tiny-tips.tips-error.tips-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 0 4px 4px; + border-color: transparent var(--ti-tips-error-color); +} +.tiny-tips.tips-error.tips-top:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-error-color) transparent; +} +.tiny-tips.tips-error.tips-bottom-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-error-color) transparent; +} +.tiny-tips.tips-error.tips-bottom-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-error-color) transparent; +} +.tiny-tips.tips-error.tips-top-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-error-color) transparent; +} +.tiny-tips.tips-error.tips-top-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-error-color) transparent; +} +.tiny-tips.tips-warning { + background: var(--ti-tips-warning-color); + color: var(--ti-tips-warning-font-color); + border-radius: var(--ti-tips-radius-large, 3px); + -webkit-box-shadow: 0 0 4px var(--ti-tips-warning-color); + box-shadow: 0 0 4px var(--ti-tips-warning-color); + margin-top: 0; +} +.tiny-tips.tips-warning:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-tips-warning-color); +} +.tiny-tips.tips-warning.tips-bottom:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-warning-color) transparent; +} +.tiny-tips.tips-warning.tips-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 0 4px 4px; + border-color: transparent var(--ti-tips-warning-color); +} +.tiny-tips.tips-warning.tips-top:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-warning-color) transparent; +} +.tiny-tips.tips-warning.tips-bottom-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-warning-color) transparent; +} +.tiny-tips.tips-warning.tips-bottom-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-warning-color) transparent; +} +.tiny-tips.tips-warning.tips-top-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-warning-color) transparent; +} +.tiny-tips.tips-warning.tips-top-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-warning-color) transparent; +} +.tiny-tips.tips-succeed { + background: var(--ti-tips-succeed-color); + color: var(--ti-tips-succeed-font-color); + border-radius: var(--ti-tips-radius-large, 3px); + -webkit-box-shadow: 0 0 4px var(--ti-tips-succeed-color); + box-shadow: 0 0 4px var(--ti-tips-succeed-color); + margin-top: 0; +} +.tiny-tips.tips-succeed:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-tips-succeed-color); +} +.tiny-tips.tips-succeed.tips-bottom:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-succeed-color) transparent; +} +.tiny-tips.tips-succeed.tips-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 0 4px 4px; + border-color: transparent var(--ti-tips-succeed-color); +} +.tiny-tips.tips-succeed.tips-top:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-succeed-color) transparent; +} +.tiny-tips.tips-succeed.tips-bottom-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-succeed-color) transparent; +} +.tiny-tips.tips-succeed.tips-bottom-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-succeed-color) transparent; +} +.tiny-tips.tips-succeed.tips-top-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-succeed-color) transparent; +} +.tiny-tips.tips-succeed.tips-top-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-succeed-color) transparent; +} +.tiny-tips.tips-infor { + background: var(--ti-tips-infor-color); + color: var(--ti-tips-infor-font-color); + border-radius: var(--ti-tips-radius-large, 3px); + -webkit-box-shadow: 0 0 4px var(--ti-tips-infor-color); + box-shadow: 0 0 4px var(--ti-tips-infor-color); + margin-top: 0; +} +.tiny-tips.tips-infor:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-tips-infor-color); +} +.tiny-tips.tips-infor.tips-bottom:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-infor-color) transparent; +} +.tiny-tips.tips-infor.tips-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 0 4px 4px; + border-color: transparent var(--ti-tips-infor-color); +} +.tiny-tips.tips-infor.tips-top:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-infor-color) transparent; +} +.tiny-tips.tips-infor.tips-bottom-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-infor-color) transparent; +} +.tiny-tips.tips-infor.tips-bottom-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-infor-color) transparent; +} +.tiny-tips.tips-infor.tips-top-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-infor-color) transparent; +} +.tiny-tips.tips-infor.tips-top-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-infor-color) transparent; +} +.tiny-tips.tips-normal { + background: var(--ti-tips-normal-color); + color: var(--ti-tips-normal-font-color); + border-radius: var(--ti-tips-radius-large, 3px); + -webkit-box-shadow: 0 0 4px var(--ti-tips-normal-color); + box-shadow: 0 0 4px var(--ti-tips-normal-color); + margin-top: 0; +} +.tiny-tips.tips-normal:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-tips-normal-color); +} +.tiny-tips.tips-normal.tips-bottom:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-normal-color) transparent; +} +.tiny-tips.tips-normal.tips-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 0 4px 4px; + border-color: transparent var(--ti-tips-normal-color); +} +.tiny-tips.tips-normal.tips-top:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-normal-color) transparent; +} +.tiny-tips.tips-normal.tips-bottom-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-normal-color) transparent; +} +.tiny-tips.tips-normal.tips-bottom-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 0 4px 4px 4px; + border-color: var(--ti-tips-normal-color) transparent; +} +.tiny-tips.tips-normal.tips-top-left:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-normal-color) transparent; +} +.tiny-tips.tips-normal.tips-top-right:before { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 4px 4px 0 4px; + border-color: var(--ti-tips-normal-color) transparent; +} +.tiny-tips .grid-innercell .grid-simplesort { + display: none; +} +.tiny-toggle-menu { + --ti-toggle-menu-width: 210px; + --ti-toggle-menu-font-size: var(--ti-common-font-size-base); + --ti-toggle-menu-name-color: var(--ti-base-color-info-normal); + --ti-toggle-menu-tree-node-height: var(--ti-common-size-7x); + --ti-toggle-menu-filter-search-size: 30px; + --ti-toggle-menu-filter-search-font-size: var(--ti-common-font-size-2); + --ti-toggle-menu-filter-search-icon-color: var(--ti-base-color-brand-6); + --ti-toggle-menu-toggle-icon-color: var(--ti-base-color-brand-6); + --ti-toggle-menu-toggle-icon-hover-color: var(--ti-base-color-brand-5); + --ti-toggle-menu-toggle-bgcolor: var(--ti-base-color-border); + width: var(--ti-toggle-menu-width); + position: relative; +} +.tiny-toggle-menu .tiny-toggle-menu__body { + cursor: pointer; + line-height: 1; + padding-left: 4px; + width: 100%; +} +.tiny-toggle-menu .tiny-toggle-menu__body, +.tiny-toggle-menu .tiny-toggle-menu__body:hover { + text-decoration: none; +} +.tiny-toggle-menu .tiny-toggle-menu__name { + color: var(--ti-toggle-menu-name-color); + font-size: var(--ti-toggle-menu-font-size); +} +.tiny-toggle-menu .tiny-toggle-menu__tree { + position: relative; +} +.tiny-toggle-menu .tiny-toggle-menu__filter { + position: relative; + margin-bottom: 4px; + width: calc(100% - 16px); +} +.tiny-toggle-menu .tiny-toggle-menu__filter-search { + width: var(--ti-toggle-menu-filter-search-size); + height: var(--ti-toggle-menu-filter-search-size); + line-height: var(--ti-toggle-menu-filter-search-size); + display: block; + text-align: center; + position: absolute; + right: 0; + top: 0; +} +.tiny-toggle-menu .tiny-toggle-menu__filter-search .tiny-svg { + fill: var(--ti-toggle-menu-filter-search-icon-color); + font-size: var(--ti-toggle-menu-filter-search-font-size); +} +.tiny-toggle-menu .tiny-toggle-menu__toggle { + position: absolute; + top: 0; + left: calc(100% - 14px); + z-index: 2; + width: 14px; + height: var(--ti-toggle-menu-filter-search-size); + line-height: var(--ti-toggle-menu-filter-search-size); + background: var(--ti-toggle-menu-toggle-bgcolor); + cursor: pointer; + -webkit-transition: 0.2s linear; + transition: 0.2s linear; +} +.tiny-toggle-menu .tiny-toggle-menu__toggle .tiny-svg { + fill: var(--ti-toggle-menu-toggle-icon-color); +} +.tiny-toggle-menu .tiny-toggle-menu__toggle:hover .tiny-svg { + fill: var(--ti-toggle-menu-toggle-icon-hover-color); +} +.tiny-toggle-menu .tiny-toggle-menu__link { + width: 100%; +} +.tiny-toggle-menu.is-toggle-right { + width: 80px; +} +.tiny-toggle-menu.is-toggle-right .tiny-tree-node.is-current .tiny-tree-node__content { + background: 0 0; +} +.tiny-toggle-menu.is-toggle-right .tiny-tree-node__content:hover { + background: 0 0; +} +.tiny-toggle-menu.is-toggle-right .tiny-tree-node__content:hover .tiny-svg { + fill: var(--ti-toggle-menu-toggle-icon-hover-color); +} +.tiny-toggle-menu.is-toggle-right .tiny-toggle-menu__toggle { + position: relative; + left: 0; +} +.tiny-toggle-menu.is-toggle-right .tiny-toggle-menu__filter { + display: none; +} +.tiny-toggle-menu .tiny-tree.is-wrap .tiny-tree-node__content { + height: auto; +} +.tiny-toggle-menu .tiny-tree.is-wrap .tiny-toggle-menu__name { + display: inline-block; + white-space: normal; + line-height: normal; + word-break: break-word; +} +.tiny-toggle-menu .tiny-tree.is-overflow .tiny-toggle-menu__name { + width: calc(100% - 18px); + vertical-align: middle; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-toggle-menu .tiny-tree.is-node-hide .tiny-toggle-menu__body, +.tiny-toggle-menu .tiny-tree.is-node-hide .tiny-tree-node__children { + display: none; +} +.tiny-toggle-menu .tiny-input__inner { + font-size: var(--ti-toggle-menu-font-size); + padding-right: 30px; + border-radius: 0; + border-top: 0; + border-left: 0; + border-right: 0; +} +.tiny-toggle-menu .tiny-tree-node__content { + height: var(--ti-toggle-menu-tree-node-height); + line-height: var(--ti-toggle-menu-tree-node-height); + font-size: var(--ti-toggle-menu-font-size); + padding-left: 0; + margin-left: 0; +} +.tiny-tooltip { + --ti-tooltip-popper-border-radius: var(--ti-common-border-radius-1); + --ti-tooltip-popper-font-size: var(--ti-common-font-size-base); + --ti-tooltip-popper-border-color: var(--ti-base-color-common-6); + --ti-tooltip-popper-normal-background: var(--ti-base-color-secondary); + --ti-tooltip-popper-normal-color: var(--ti-base-color-light); + --ti-tooltip-popper-normal-border-color: var(--ti-base-color-secondary); + --ti-tooltip-popper-info-background: #69c0ff; + --ti-tooltip-popper-info-color: var(--ti-base-color-light); + --ti-tooltip-popper-info-border-color: #69c0ff; + --ti-tooltip-popper-error-background: var(--ti-base-color-common-6); + --ti-tooltip-popper-error-color: var(--ti-base-color-light); + --ti-tooltip-popper-error-border-color: var(--ti-base-color-common-6); + --ti-tooltip-popper-warning-background: #ffd666; + --ti-tooltip-popper-warning-color: var(--ti-base-color-light); + --ti-tooltip-popper-warning-border-color: #ffd666; + --ti-tooltip-popper-success-background: #95de64; + --ti-tooltip-popper-success-color: var(--ti-base-color-light); + --ti-tooltip-popper-success-border-color: #95de64; + --ti-tooltip-popper-dark-background: var(--ti-base-color-common-6); + --ti-tooltip-popper-dark-color: var(--ti-base-color-light); + --ti-tooltip-popper-light-background: var(--ti-base-color-light); + --ti-tooltip-popper-light-color: var(--ti-base-color-common-6); + --ti-tooltip-popper-light-border-color: var(--ti-base-color-common-6); + --ti-tooltip-box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.2); + --ti-tooltip-padding: 11px 15px; +} +.tiny-tooltip:focus:hover, +.tiny-tooltip:focus:not(.focusing) { + outline-width: 0; +} +.tiny-tooltip.tiny-tooltip__popper { + position: absolute; + left: -9999px; + border-radius: var(--ti-tooltip-popper-border-radius); + padding: var(--ti-tooltip-padding); + font-size: var(--ti-tooltip-popper-font-size); + line-height: 1.2; + min-width: 10px; + max-width: 450px; + z-index: 2000; + word-wrap: break-word; + -webkit-box-shadow: var(--ti-tooltip-box-shadow); + box-shadow: var(--ti-tooltip-box-shadow); +} +.tiny-tooltip.tiny-tooltip__popper .popper__arrow, +.tiny-tooltip.tiny-tooltip__popper .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tiny-tooltip.tiny-tooltip__popper .popper__arrow { + border-width: 6px; +} +.tiny-tooltip.tiny-tooltip__popper .popper__arrow::after { + content: ' '; + border-width: 5px; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='top'] { + margin-bottom: 12px; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='top'] .popper__arrow { + bottom: -6px; + border-top-color: var(--ti-tooltip-popper-border-color); + border-bottom-width: 0; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='top'] .popper__arrow::after { + bottom: 1px; + margin-left: -5px; + border-top-color: var(--ti-tooltip-popper-border-color); + border-bottom-width: 0; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='bottom'] { + margin-top: 12px; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='bottom'] .popper__arrow { + top: -6px; + border-top-width: 0; + border-bottom-color: var(--ti-tooltip-popper-border-color); +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='bottom'] .popper__arrow::after { + top: 1px; + margin-left: -5px; + border-top-width: 0; + border-bottom-color: var(--ti-tooltip-popper-border-color); +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='right'] { + margin-left: 12px; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='right'] .popper__arrow { + left: -6px; + border-right-color: var(--ti-tooltip-popper-border-color); + border-left-width: 0; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='right'] .popper__arrow::after { + bottom: -5px; + left: 1px; + border-right-color: var(--ti-tooltip-popper-border-color); + border-left-width: 0; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='left'] { + margin-right: 12px; +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='left'] .popper__arrow { + right: -6px; + border-right-width: 0; + border-left-color: var(--ti-tooltip-popper-border-color); +} +.tiny-tooltip.tiny-tooltip__popper[x-placement^='left'] .popper__arrow::after { + right: 1px; + bottom: -5px; + margin-left: -5px; + border-right-width: 0; + border-left-color: var(--ti-tooltip-popper-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal { + background: var(--ti-tooltip-popper-normal-background); + color: var(--ti-tooltip-popper-normal-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='top'] .popper__arrow { + border-top-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='top'] .popper__arrow::after { + border-top-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='bottom'] .popper__arrow::after { + border-bottom-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='left'] .popper__arrow { + border-left-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='left'] .popper__arrow::after { + border-left-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='right'] .popper__arrow { + border-right-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-normal[x-placement^='right'] .popper__arrow::after { + border-right-color: var(--ti-tooltip-popper-normal-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info { + background: var(--ti-tooltip-popper-info-background); + color: var(--ti-tooltip-popper-info-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='top'] .popper__arrow { + border-top-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='top'] .popper__arrow::after { + border-top-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='bottom'] .popper__arrow::after { + border-bottom-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='left'] .popper__arrow { + border-left-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='left'] .popper__arrow::after { + border-left-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='right'] .popper__arrow { + border-right-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-info[x-placement^='right'] .popper__arrow::after { + border-right-color: var(--ti-tooltip-popper-info-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error { + background: var(--ti-tooltip-popper-error-background); + color: var(--ti-tooltip-popper-error-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='top'] .popper__arrow { + border-top-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='top'] .popper__arrow::after { + border-top-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='bottom'] .popper__arrow::after { + border-bottom-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='left'] .popper__arrow { + border-left-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='left'] .popper__arrow::after { + border-left-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='right'] .popper__arrow { + border-right-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-error[x-placement^='right'] .popper__arrow::after { + border-right-color: var(--ti-tooltip-popper-error-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning { + background: var(--ti-tooltip-popper-warning-background); + color: var(--ti-tooltip-popper-warning-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='top'] .popper__arrow { + border-top-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='top'] .popper__arrow::after { + border-top-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='bottom'] .popper__arrow::after { + border-bottom-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='left'] .popper__arrow { + border-left-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='left'] .popper__arrow::after { + border-left-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='right'] .popper__arrow { + border-right-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-warning[x-placement^='right'] .popper__arrow::after { + border-right-color: var(--ti-tooltip-popper-warning-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success { + background: var(--ti-tooltip-popper-success-background); + color: var(--ti-tooltip-popper-success-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='top'] .popper__arrow { + border-top-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='top'] .popper__arrow::after { + border-top-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='bottom'] .popper__arrow::after { + border-bottom-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='left'] .popper__arrow { + border-left-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='left'] .popper__arrow::after { + border-left-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='right'] .popper__arrow { + border-right-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-success[x-placement^='right'] .popper__arrow::after { + border-right-color: var(--ti-tooltip-popper-success-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-dark { + background: var(--ti-tooltip-popper-dark-background); + color: var(--ti-tooltip-popper-dark-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-light { + background: var(--ti-tooltip-popper-light-background); + color: var(--ti-tooltip-popper-light-color); + border: 1px solid var(--ti-tooltip-popper-light-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='top'] .popper__arrow { + border-top-color: var(--ti-tooltip-popper-light-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='top'] .popper__arrow::after { + border-top-color: var(--ti-tooltip-popper-light-background); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var(--ti-tooltip-popper-light-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='bottom'] .popper__arrow::after { + border-bottom-color: var(--ti-tooltip-popper-light-background); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='left'] .popper__arrow { + border-left-color: var(--ti-tooltip-popper-light-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='left'] .popper__arrow::after { + border-left-color: var(--ti-tooltip-popper-light-background); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='right'] .popper__arrow { + border-right-color: var(--ti-tooltip-popper-light-border-color); +} +.tiny-tooltip.tiny-tooltip__popper.is-light[x-placement^='right'] .popper__arrow::after { + border-right-color: var(--ti-tooltip-popper-light-background); +} +.tiny-tooltip.tiny-tooltip__popper.is-blank-content { + display: none; +} +.tiny-fade-in-linear-enter-active, +.tiny-fade-in-linear-leave-active { + -webkit-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.tiny-fade-in-linear-enter, +.tiny-fade-in-linear-enter-from, +.tiny-fade-in-linear-leave, +.tiny-fade-in-linear-leave-active, +.tiny-fade-in-linear-leave-from { + opacity: 0; +} +.tiny-fade-in-enter-active, +.tiny-fade-in-leave-active { + -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.tiny-fade-in-enter, +.tiny-fade-in-enter-from, +.tiny-fade-in-leave-active { + opacity: 0; +} +.tiny-top-box { + --ti-top-box-background: var(--ti-base-color-light); + --ti-top-box-icon-font-size: var(--ti-common-font-size-5); + --ti-top-box-success-icon-color: var(--ti-base-color-success-normal); + --ti-top-box-error-icon-color: var(--ti-base-color-bg-8); + --ti-top-box-warning-icon-color: var(--ti-base-color-warning-normal); + --ti-top-box-help-icon-color: var(--ti-base-color-brand-6); + --ti-top-box-info-icon-color: var(--ti-base-color-info-normal); + position: fixed; + top: 20px; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + width: 400px; + max-height: 600px; + background: var(--ti-top-box-background); + padding: 24px; + -webkit-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.2); + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.2); + -webkit-transition: opacity 0.3s, top 0.4s, -webkit-transform 0.4s; + transition: opacity 0.3s, top 0.4s, -webkit-transform 0.4s; + transition: opacity 0.3s, transform 0.4s, top 0.4s; + transition: opacity 0.3s, transform 0.4s, top 0.4s, -webkit-transform 0.4s; +} +.tiny-top-box .tiny-top-box__icon { + font-size: var(--ti-top-box-icon-font-size, 24px); + vertical-align: middle; +} +.tiny-top-box .tiny-top-box__content { + display: inline-block; + padding: 0 16px; + vertical-align: middle; +} +.tiny-top-box .tiny-top-box__closeBtn { + position: absolute; + top: 14px; + right: 12px; + cursor: pointer; + fill: rgba(51, 51, 51, 0.5); + display: none; +} +.tiny-top-box .tiny-top-box__closeBtn:hover { + fill: #333; +} +.tiny-top-box .tiny-top-box__toolbar { + float: right; + margin-top: 24px; +} +.tiny-top-box.is-closable .tiny-top-box__closeBtn { + display: inline-block; +} +.tiny-top-box.is-center { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-top-box--success .tiny-top-box__icon { + fill: var(--ti-top-box-success-icon-color); +} +.tiny-top-box--error .tiny-top-box__icon { + fill: var(--ti-top-box-error-icon-color); +} +.tiny-top-box--warning .tiny-top-box__icon { + fill: var(--ti-top-box-warning-icon-color); +} +.tiny-top-box--help .tiny-top-box__icon { + fill: var(--ti-top-box-help-icon-color); +} +.tiny-top-box--info .tiny-top-box__icon { + fill: var(--ti-top-box-info-icon-color); +} +.tiny-top-box-fade-enter, +.tiny-top-box-fade-leave-active { + opacity: 0; + -webkit-transform: translate(-50%, -100%); + transform: translate(-50%, -100%); +} +.tiny-transition-transfer-fade-enter-active, +.tiny-transition-transfer-fade-leave-active { + -webkit-transition: all 0.3s; + transition: all 0.3s; +} +.tiny-transition-transfer-fade-leave-active { + position: absolute; +} +.tiny-transition-transfer-fade-enter, +.tiny-transition-transfer-fade-enter-from, +.tiny-transition-transfer-fade-leave-to { + opacity: 0; + -webkit-transform: translateX(30px); + transform: translateX(30px); +} +.tiny-transfer { + --ti-transfer-font-size: var(--ti-common-font-size-1); + --ti-transfer-button-bgcolor: var(--ti-base-color-brand-6); + --ti-transfer-button-border-radius: var(--ti-common-border-radius-normal); + --ti-transfer-button-disabled-color: var(--ti-base-color-placeholder); + --ti-transfer-button-disabled-border-color: var(--ti-base-color-border); + --ti-transfer-button-disabled-bgcolor: var(--ti-common-color-bg-disabled); + --ti-transfer-panel-background: var(--ti-base-color-light); + --ti-transfer-panel-body-height: 260px; + --ti-transfer-panel-border-color: var(--ti-base-color-border); + --ti-transfer-panel-border-radius: var(--ti-common-border-radius-normal); + --ti-transfer-panel-item-height: var(--ti-base-size-height-minor); + --ti-transfer-panel-item-color: var(--ti-base-color-info-normal); + --ti-transfer-panel-item-hover-font-color: var(--ti-base-color-brand-6); + --ti-transfer-panel-item-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-transfer-panel-filter-height: var(--ti-base-size-height-minor); + --ti-transfer-panel-filter-font-size: var(--ti-common-font-size-base); + --ti-transfer-panel-filter-border-radius: var(--ti-common-border-radius-normal); + --ti-transfer-panel-body-filter-height: 216px; + --ti-transfer-panel-width: 200px; + --ti-transfer-header-height: 40px; + --ti-transfer-header-background: var(--ti-base-color-hover-background); + --ti-transfer-header-border-color: var(--ti-base-color-border); + --ti-transfer-header-color: var(--ti-base-color-info-normal); + --ti-transfer-header-span-color: var(--ti-base-color-info-normal); + --ti-transfer-header-font-size: var(--ti-common-font-size-base); + --ti-transfer-header-sort-width: var(--ti-common-size-5x); + --ti-transfer-header-sort-color: var(--ti-base-color-brand-6); + --ti-transfer-footer-height: var(--ti-common-size-10x); + --ti-transfer-footer-background: var(--ti-base-color-light); + --ti-transfer-footer-border-color: var(--ti-base-color-border); + --ti-transfer-footer-color: #606266; + --ti-transfer-empty-height: var(--ti-base-size-height-minor); + --ti-transfer-empty-color: #909399; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: var(--ti-transfer-font-size); +} +.tiny-transfer__buttons { + padding: 0 16px; +} +.tiny-transfer__buttons .defaultButton { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +.tiny-transfer__buttons .defaultButton .tiny-button + .tiny-button { + margin-left: 0; +} +.tiny-transfer__buttons .defaultButton + .tiny-button { + margin: 12px 0 0; +} +.tiny-transfer__buttons .tiny-button { + min-width: auto; + margin: 0 0 8px 0; +} +.tiny-transfer__button { + display: block; + margin: 0 auto; + border-color: var(--ti-transfer-button-bgcolor); + background-color: var(--ti-transfer-button-bgcolor); + min-width: 30px; + min-height: 30px; + border-radius: var(--ti-transfer-button-border-radius); + line-height: normal; + padding: 8px; +} +.tiny-transfer__button.is-with-texts { + border-radius: var(--ti-transfer-button-border-radius); + min-width: 60px; +} +.tiny-transfer__button.tiny-button:not(.is-circle) .tiny-svg { + margin-right: 0; +} +.tiny-transfer__button:first-child { + margin-bottom: 12px; +} +.tiny-transfer__button:nth-child(2) { + margin: 0; +} +.tiny-transfer__button i, +.tiny-transfer__button span { + font-size: var(--ti-transfer-font-size); +} +.tiny-transfer__button [class*='tiny-icon'] + span { + margin-left: 0; +} +.tiny-transfer .tiny-transfer__button.is-disabled, +.tiny-transfer .tiny-transfer__button.is-disabled:hover { + border: 1px solid var(--ti-transfer-button-disabled-border-color); + background-color: var(--ti-transfer-button-disabled-bgcolor); + color: var(--ti-transfer-button-disabled-color); + line-height: 1; +} +.tiny-transfer .tiny-transfer__button.is-disabled .tiny-svg, +.tiny-transfer .tiny-transfer__button.is-disabled:hover .tiny-svg { + fill: var(--ti-transfer-button-disabled-color); +} +.tiny-transfer-panel { + border: 1px solid var(--ti-transfer-panel-border-color); + border-radius: var(--ti-transfer-panel-border-radius); + overflow: hidden; + background: var(--ti-transfer-panel-background); + width: var(--ti-transfer-panel-width); + max-height: 100%; + vertical-align: middle; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; +} +.tiny-transfer-panel__body { + position: relative; + height: var(--ti-transfer-panel-body-height); + text-align: left; + padding-right: 2px; +} +.tiny-transfer-panel__body.is-with-footer { + padding-bottom: 40px; + height: calc(100% - 40px); +} +.tiny-transfer-panel__body .tiny-tree { + height: 100%; + padding: 0 8px 8px; + overflow: auto; +} +.tiny-transfer-panel__body .tiny-tree::-webkit-scrollbar { + width: 8px; + height: 8px; +} +.tiny-transfer-panel__body .tiny-tree::-webkit-scrollbar-track-piece { + background: #fafafa; +} +.tiny-transfer-panel__body .tiny-tree::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: calc(8px / 2); +} +.tiny-transfer-panel__body .tiny-tree::-webkit-scrollbar-thumb:hover { + background: #999; +} +.tiny-transfer-panel__body .tiny-tree::-webkit-scrollbar-thumb:active { + background: #999; +} +.tiny-transfer-panel__body .tiny-transfer-panel__filter ~ .tiny-tree { + height: calc(100% - 46px); +} +.tiny-transfer-panel__list { + margin: 0; + padding: 6px 0; + list-style: none; + height: var(--ti-transfer-panel-body-height); + overflow: auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: block; +} +.tiny-transfer-panel__list.tiny-checkbox-group { + display: block; +} +.tiny-transfer-panel__list.is-filterable { + height: var(--ti-transfer-panel-body-filter-height); + padding-top: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-transfer-panel__list.is-filterable .tiny-transfer-panel__item { + -ms-flex-negative: 0; + flex-shrink: 0; + } +} +.tiny-transfer-panel .tiny-transfer-panel__list::-webkit-scrollbar { + width: 8px; + height: 8px; +} +.tiny-transfer-panel .tiny-transfer-panel__list::-webkit-scrollbar-track-piece { + background: #fafafa; +} +.tiny-transfer-panel .tiny-transfer-panel__list::-webkit-scrollbar-thumb { + background: #bfbfbf; + border-radius: calc(8px / 2); +} +.tiny-transfer-panel .tiny-transfer-panel__list::-webkit-scrollbar-thumb:hover { + background: #999; +} +.tiny-transfer-panel .tiny-transfer-panel__list::-webkit-scrollbar-thumb:active { + background: #999; +} +.tiny-transfer-panel__item { + line-height: var(--ti-transfer-panel-item-height); + padding-left: 8px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-transition: all 0.5s; + transition: all 0.5s; +} +.tiny-transfer-panel__item + .tiny-transfer-panel__item { + margin-left: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-transfer-panel__item.tiny-checkbox { + color: var(--ti-transfer-panel-item-color); + line-height: var(--ti-transfer-panel-item-height); + margin: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.tiny-transfer-panel__item.tiny-checkbox.tiny-checkbox__label { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: 22px; + line-height: var(--ti-transfer-panel-item-height); +} +.tiny-transfer-panel__item.tiny-checkbox .tiny-checkbox__input { + line-height: 1; +} +.tiny-transfer-panel__item:hover { + background: var(--ti-transfer-panel-item-hover-bgcolor); + color: var(--ti-transfer-panel-item-hover-font-color); +} +.tiny-transfer-panel__item.is-disabled:hover { + background: 0; +} +.tiny-transfer-panel__item.tiny-checkbox__input { + position: absolute; + top: 7px; +} +.tiny-transfer-panel__filter { + text-align: center; + padding: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: block; + width: auto; +} +.tiny-transfer-panel__filter .tiny-input__inner { + height: var(--ti-transfer-panel-filter-height); + line-height: var(--ti-transfer-panel-filter-height); + width: 100%; + font-size: var(--ti-transfer-panel-filter-font-size); + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: var(--ti-transfer-panel-filter-border-radius); + padding-right: 30px; + padding-left: 8px; +} +.tiny-transfer-panel__filter .tiny-input__icon { + margin-left: 5px; +} +.tiny-transfer-panel__filter .tiny-icon-circle-close { + cursor: pointer; +} +.tiny-transfer-panel .tiny-transfer-panel__header { + height: var(--ti-transfer-header-height); + line-height: var(--ti-transfer-header-height); + background: var(--ti-transfer-header-background); + margin: 0; + padding: 0 8px; + border-bottom: 1px solid var(--ti-transfer-header-border-color); + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: var(--ti-transfer-header-color); + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-transfer-panel .tiny-transfer-panel__header .tiny-checkbox { + width: 100%; + line-height: 1; + text-align: left; +} +.tiny-transfer-panel .tiny-transfer-panel__header .tiny-checkbox .tiny-checkbox__label { + font-size: var(--ti-transfer-header-font-size); + color: var(--ti-transfer-header-color); + font-weight: 400; + width: calc(100% - 38px); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-transfer-panel .tiny-transfer-panel__header .tiny-checkbox .tiny-checkbox__label span { + position: absolute; + right: 0; + color: var(--ti-transfer-header-span-color); + font-size: var(--ti-transfer-header-font-size); + font-weight: 400; +} +.tiny-transfer-panel .tiny-transfer-panel__header .headSort { + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.tiny-transfer-panel .tiny-transfer-panel__header .headSort div { + width: var(--ti-transfer-header-sort-width); + height: var(--ti-transfer-header-sort-width); + line-height: var(--ti-transfer-header-sort-width); + margin-right: 8px; + text-align: center; + border: 1px solid; + border-radius: 50%; + color: var(--ti-transfer-header-sort-color); + display: inline-block; + cursor: pointer; +} +.tiny-transfer-panel .tiny-transfer-panel__header .headSort div i { + width: calc(var(--ti-transfer-header-sort-width) - 2px); + height: calc(var(--ti-transfer-header-sort-width) - 2px); + display: block; +} +.tiny-transfer-panel .tiny-transfer-panel__footer { + height: var(--ti-transfer-footer-height); + background: var(--ti-transfer-footer-background); + margin: 0; + padding: 0; + border-top: 1px solid var(--ti-transfer-footer-border-color); + position: absolute; + bottom: 0; + left: 0; + width: 100%; + z-index: 1; +} +.tiny-transfer-panel .tiny-transfer-panel__footer::after { + display: inline-block; + content: ''; + height: 100%; + vertical-align: middle; +} +.tiny-transfer-panel .tiny-transfer-panel__footer .tiny-checkbox { + padding-left: 20px; + color: var(--ti-transfer-footer-color); +} +.tiny-transfer-panel .tiny-transfer-panel__empty { + position: absolute; + width: 100%; + top: calc(50% - 33px); + margin: 0; + height: var(--ti-transfer-empty-height); + line-height: var(--ti-transfer-empty-height); + padding: 6px 15px 0; + color: var(--ti-transfer-empty-color); + text-align: center; +} +.tiny-transfer-panel.transferGrid { + width: 600px; +} +.tiny-transfer-panel.transferGrid .tiny-transfer-panel__body { + height: 100%; +} +.tiny-transfer-panel.transferGrid .tiny-table.simple { + width: 100%; + padding: 0 8px; + height: 400px; + overflow-y: auto; +} +.tiny-transfer-panel.transferGrid .tiny-table.simple table { + width: 100%; +} +.tiny-transfer-panel.transferGrid .tiny-pager { + padding: 10px; +} +.tiny-transfer-panel .tiny-checkbox__label { + padding-left: 8px; +} +.tiny-tree { + --ti-tree-color: var(--ti-base-color-info-normal); + --ti-tree-bgcolor: var(--ti-base-color-light); + --ti-tree-empty-text-color: #909399; + --ti-tree-node-content-current-bgcolor: var(--ti-base-color-brand-2); + --ti-tree-node-content-hover-bgcolor: var(--ti-base-color-hover-background); + --ti-tree-node-label-font-size: var(--ti-common-font-size-1); + --ti-tree-node-label-margin-left: var(--ti-common-space-base); + --ti-tree-node-label-bgcolor: var(--ti-base-color-brand-5); + --ti-tree-node-label-font-color: var(--ti-base-color-light); + --ti-tree-node-icon-font-size: var(--ti-common-font-size-1); + --ti-tree-node-icon-loading-color: #1890ff; + --ti-tree-node-icon-expand-color: var(--ti-base-color-info-normal); + --ti-tree-node-checked-icon-color: var(--ti-base-color-brand-6); + position: relative; + cursor: default; + background: var(--ti-tree-bgcolor); + color: var(--ti-tree-color); +} +.tiny-tree__empty-block { + position: relative; + min-height: 60px; + text-align: center; + width: 100%; + height: 100%; +} +.tiny-tree__empty-text { + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + color: var(--ti-tree-empty-text-color); +} +.tiny-tree__drop-indicator { + position: absolute; + left: 0; + right: 0; + height: 1px; + background-color: #40a9ff; +} +.tiny-tree.is-dragging .tiny-tree-node__content { + cursor: move; +} +.tiny-tree.is-dragging .tiny-tree-node__content * { + pointer-events: none; +} +.tiny-tree.is-dragging.is-drop-not-allow .tiny-tree-node__content { + cursor: not-allowed; +} +.tiny-tree--highlight-current .tiny-tree-node.is-current > .tiny-tree-node__content { + background-color: #f0f7ff; +} +.tiny-tree-node { + white-space: nowrap; + outline: 0; +} +.tiny-tree-node:focus > .tiny-tree-node__content { + background-color: var(--ti-tree-node-content-hover-bgcolor); +} +.tiny-tree-node.is-current > .tiny-tree-node__content { + background-color: var(--ti-tree-node-content-current-bgcolor); +} +.tiny-tree-node.is-drop-inner > .tiny-tree-node__content .tiny-tree-node__label { + background-color: var(--ti-tree-node-label-bgcolor); + color: var(--ti-tree-node-label-font-color); +} +.tiny-tree-node.is-checked .tiny-tree-node__expand-icon, +.tiny-tree-node.is-expanded .tiny-tree-node__expand-icon, +.tiny-tree-node.is-indeterminate .tiny-tree-node__expand-icon { + fill: var(--ti-tree-node-checked-icon-color); +} +.tiny-tree-node__content { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: 30px; + cursor: pointer; + border-radius: var(--ti-common-border-radius-normal); +} +.tiny-tree-node__content:hover { + background-color: var(--ti-tree-node-content-hover-bgcolor); +} +.tiny-tree-node__content > label.tiny-checkbox { + margin-left: var(--ti-tree-node-label-margin-left); +} +.tiny-tree-node__expand-icon { + cursor: pointer; + fill: var(--ti-tree-node-icon-expand-color); + font-size: var(--ti-tree-node-icon-font-size); + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transition: -webkit-transform 0.3s ease-in-out; + transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.tiny-tree-node__expand-icon.expanded { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.tiny-tree-node__expand-icon.is-leaf { + visibility: hidden; +} +.tiny-tree-node__label { + font-size: var(--ti-tree-node-label-font-size); + margin-left: var(--ti-tree-node-label-margin-left); +} +.tiny-tree-node__loading.circular { + margin-right: 4px; + margin-left: var(--ti-tree-node-label-margin-left); + font-size: var(--ti-tree-node-icon-font-size); + fill: var(--ti-tree-node-icon-loading-color); + -webkit-animation: loading-rotate 2s linear infinite; + animation: loading-rotate 2s linear infinite; +} +.tiny-tree-node__loading.circular .path { + -webkit-animation: loading-dash 1.5s ease-in-out infinite; + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: #1890ff; + stroke-linecap: round; +} +.tiny-tree-node > .tiny-tree-node__children { + overflow: hidden; + background-color: transparent; +} +.tiny-tree-node.is-expanded > .tiny-tree-node__children { + display: block; +} +.tiny-tree-node__menu { + position: absolute; + top: 0; + left: 0; + z-index: 5000; + font-size: var(--ti-common-font-size-base); + -webkit-box-shadow: 2px 2px 4px -2px #000; + box-shadow: 2px 2px 4px -2px #000; + padding: 0 1px; + color: #606266; + font-family: Helvetica, Arial, 'Microsoft YaHei', sans-serif; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tiny-tree-node .tiny-radio { + margin-right: 0; +} +.tiny-tree-node .tiny-radio .tiny-radio__label { + display: none; +} +.tiny-tree-node .collapse-transition { + -webkit-transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out; + transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out; +} +@keyframes loading-rotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px; + } +} +.tiny-tree-menu { + --ti-tree-menu-width: 210px; + --ti-tree-menu-font-size: var(--ti-common-font-size-base); + --ti-tree-menu-border-color: #d9d9d9; + --ti-tree-menu-node-height: var(--ti-common-size-10x); + --ti-tree-menu-node-hover-bgcolor: var(--ti-base-color-white); + --ti-tree-menu-node-current-color: var(--ti-base-color-brand-6); + --ti-tree-menu-node-body-color: var(--ti-base-color-info-normal); + --ti-tree-minus-square-color: var(--ti-base-color-brand-6); + width: var(--ti-tree-menu-width); + position: relative; + font-size: var(--ti-tree-menu-font-size); +} +.tiny-tree-menu:before { + content: ''; + border-right: 1px solid var(--ti-tree-menu-border-color); + position: absolute; + top: 0; + right: 0; + height: 100%; + z-index: 1; +} +.tiny-tree-menu .tiny-input .tiny-input__inner { + border: none; + border-bottom: 1px solid var(--ti-tree-menu-border-color); +} +.tiny-tree-menu .tiny-tree .tiny-tree-node .tiny-tree-node__content { + height: var(--ti-tree-menu-node-height); + line-height: var(--ti-tree-menu-node-height); + overflow: hidden; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node .tiny-tree-node__content .tree-node-icon { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + margin-right: 8px; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node .tiny-tree-node__content .tree-node { + width: 100%; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node .tiny-tree-node__content .tree-node-name { + padding: 0 24px; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node.is-current > .tiny-tree-node__content { + background-color: var(--ti-tree-menu-node-hover-bgcolor); + position: relative; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node.is-current > .tiny-tree-node__content .tree-node-name { + border-left: 2px solid var(--ti-tree-minus-square-color); +} +.tiny-tree-menu .tiny-tree .tiny-tree-node.is-current > .tiny-tree-node__content .tree-node-body { + color: var(--ti-tree-menu-node-current-color); +} +.tiny-tree-menu .tiny-tree .tiny-tree-node .tree-node-body { + color: var(--ti-tree-menu-node-body-color); + display: block; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node .tree-node-body, +.tiny-tree-menu .tiny-tree .tiny-tree-node .tree-node-body:hover { + text-decoration: none; +} +.tiny-tree-menu .tiny-tree .tiny-tree-node.is-loading .tiny-tree-node__content .tree-node-name { + padding-left: 0; +} +.tiny-tree-menu .tiny-tree-menu__overflow.tiny-tree .tiny-tree-node .tiny-tree-node__content .tree-node-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; + padding-right: 0; +} +.tiny-tree-menu .tiny-tree-menu__overflow.tiny-tree .tiny-tree-node .tiny-tree-node__content .tree-node { + width: calc(100% - 24px); +} +.tiny-tree-menu .tiny-tree-menu__wrap.tiny-tree .tiny-tree-node__content { + min-height: var(--ti-tree-menu-node-height); + height: auto; +} +.tiny-tree-menu .tiny-tree-menu__wrap.tiny-tree .tree-node-body { + min-height: 40px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .tiny-tree-menu .tiny-tree-menu__wrap.tiny-tree .tiny-tree-node__label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} +.tiny-tree-menu .tiny-tree-menu__wrap.tiny-tree .tree-node-name { + white-space: normal; + line-height: normal; + display: block; + word-break: break-all; +} +.tiny-upload { + --ti-upload-tip-font-size: var(--ti-common-font-size-base); + --ti-upload-tip-color: #666; + --ti-upload-picture-card-bgcolor: #fbfdff; + --ti-upload-picture-card-border-color: #c0ccda; + --ti-upload-picture-card-border-radius: 6px; + --ti-upload-picture-card-hover-color: var(--ti-base-color-brand-5); + --ti-upload-picture-card-icon-font-size: 28px; + --ti-upload-picture-card-icon-color: #8c939d; + display: inline-block; + text-align: center; + cursor: pointer; + outline: 0; +} +.tiny-upload__input { + display: none; +} +.tiny-upload__tip { + font-size: var(--ti-upload-tip-font-size); + color: var(--ti-upload-tip-color); + margin-top: 8px; +} +.tiny-upload--picture-card { + width: 148px; + height: 148px; + line-height: 146px; + background-color: var(--ti-upload-picture-card-bgcolor); + border: 1px dashed var(--ti-upload-picture-card-border-color); + border-radius: var(--ti-upload-picture-card-border-radius); + -webkit-box-sizing: border-box; + box-sizing: border-box; + vertical-align: top; +} +.tiny-upload--picture-card svg { + font-size: var(--ti-upload-picture-card-icon-font-size); + fill: var(--ti-upload-picture-card-icon-color); +} +.tiny-upload--picture-card:hover, +.tiny-upload:focus { + border-color: var(--ti-upload-picture-card-hover-color); + color: var(--ti-upload-picture-card-hover-color); +} +.tiny-upload:focus .tiny-upload-dragger { + border-color: var(--ti-upload-picture-card-hover-color); +} +.tiny-upload-cover__title, +.tiny-upload-list__item-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tiny-upload--picture-card, +.tiny-upload-dragger { + -webkit-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; +} +.tiny-upload iframe { + position: absolute; + z-index: -1; + top: 0; + left: 0; + opacity: 0; +} +.tiny-upload input[type='file'] { + display: none; +} +.tiny-upload-cover { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 10; + cursor: default; +} +.tiny-upload-cover::after { + display: inline-block; + content: ''; + height: 100%; + vertical-align: middle; +} +.tiny-upload-cover img { + display: block; + width: 100%; + height: 100%; +} +.tiny-upload-cover__label { + position: absolute; + right: -15px; + top: -6px; + width: 40px; + height: 24px; + background: #13ce66; + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2); +} +.tiny-upload-cover__label i { + color: #fff; + font-size: var(--ti-common-font-size-base); + margin-top: 11px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.tiny-upload-cover__progress { + display: inline-block; + vertical-align: middle; + position: static; + width: 243px; +} +.tiny-upload-cover__progress + .tiny-upload__inner { + opacity: 0; +} +.tiny-upload-cover__content { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.tiny-upload-cover__interact { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.72); + text-align: center; +} +.tiny-upload-cover__interact .btn { + display: inline-block; + color: #fff; + font-size: var(--ti-common-font-size-1); + cursor: pointer; + vertical-align: middle; + -webkit-transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); + margin-top: 60px; +} +.tiny-upload-cover__interact .btn span { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.tiny-upload-cover__interact .btn i { + color: #fff; + display: block; + font-size: var(--ti-common-font-size-5); + line-height: inherit; + margin: 0 auto 5px; +} +.tiny-upload-cover__interact .btn:not(:first-child) { + margin-left: 35px; +} +.tiny-upload-cover__interact .btn:hover { + -webkit-transform: translateY(-13px); + transform: translateY(-13px); +} +.tiny-upload-cover__interact .btn:hover span { + opacity: 1; +} +.tiny-upload-cover__title { + position: absolute; + bottom: 0; + left: 0; + background-color: #fff; + width: 100%; + height: 36px; + line-height: 36px; + font-weight: 400; + padding: 0 10px; + margin: 0; + font-size: var(--ti-common-font-size-1); + color: #303133; + text-align: left; +} +.tiny-upload-cover + .tiny-upload__inner { + opacity: 0; + position: relative; + z-index: 1; +} +.tiny-upload-dragger { + --ti-upload-dragger-width: 360px; + --ti-upload-dragger-height: 180px; + --ti-upload-dragger-bgcolor: #fafafa; + --ti-upload-dragger-border-color: var(--ti-base-color-border); + --ti-upload-dragger-border-radius: var(--ti-common-border-radius-normal); + --ti-upload-dragger-hover-color: var(--ti-base-color-brand-5); + --ti-upload-dragger-dragover-bgcolor: rgba(32, 159, 255, 0.06); + --ti-upload-dragger-icon-color: var(--ti-base-color-placeholder); + --ti-upload-dragger-icon-font-size: var(--ti-common-font-size-7); + --ti-upload-dragger-text-color: var(--ti-base-color-secondary); + --ti-upload-dragger-text-font-size: var(--ti-common-font-size-base); + --ti-upload-dragger-files-border-color: #dcdfe6; + width: var(--ti-upload-dragger-width); + height: var(--ti-upload-dragger-height); + background-color: var(--ti-upload-dragger-bgcolor); + border: 1px dashed var(--ti-upload-dragger-border-color); + border-radius: var(--ti-upload-dragger-border-radius); + -webkit-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + overflow: hidden; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-upload-dragger:hover { + border-color: var(--ti-upload-dragger-hover-color); +} +.tiny-upload-dragger.is-dragover { + background-color: var(--ti-upload-dragger-dragover-bgcolor, rgba(32, 159, 255, 0.06)); + border: 2px dashed var(--ti-upload-dragger-hover-color); +} +.tiny-upload-dragger .icon-fileupload { + font-size: var(--ti-upload-dragger-icon-font-size); + fill: var(--ti-upload-dragger-icon-color); +} +.tiny-upload-dragger .tiny-upload__text { + color: var(--ti-upload-dragger-text-color); + font-size: var(--ti-upload-dragger-text-font-size); + text-align: center; +} +.tiny-upload-dragger .tiny-upload__text em { + color: var(--ti-upload-dragger-hover-color); + font-style: normal; +} +.tiny-upload-dragger + .tiny-upload__tip { + text-align: center; +} +.tiny-upload-dragger ~ .tiny-upload__files { + border-top: 1px solid var(--ti-upload-dragger-files-border-color); + margin-top: 7px; + padding-top: 5px; +} +.tiny-upload-list { + --ti-upload-list-item-font-size: var(--ti-common-font-size-1); + --ti-upload-list-item-color: var(--ti-base-color-info-normal); + --ti-upload-list-item-border-radius: var(--ti-common-border-radius-normal); + --ti-upload-list-item-hover-background-color: #f5f7fa; + --ti-upload-list-item-hover-color: var(--ti-base-color-brand-5); + --ti-upload-list-item-name-icon-color: #909399; + --ti-upload-list-item-name-icon-font-size: var(--ti-common-font-size-2); + --ti-upload-list-svg-icon-close-color: #606266; + --ti-upload-list-svg-icon-font-size: var(--ti-common-font-size-base); + --ti-upload-list-successful-icon-font-size: var(--ti-common-font-size-1); + --ti-upload-list-picture-card-item-border-color: var(--ti-base-color-border); + --ti-upload-list-picture-card-item-bgcolor: var(--ti-base-color-light); + --ti-upload-list-successful-status-color: var(--ti-base-color-success-normal); + margin: 0; + padding: 0; + list-style: none; +} +.tiny-upload-list__item { + -webkit-transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1); + transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1); + font-size: var(--ti-upload-list-item-font-size); + color: var(--ti-upload-list-item-color); + line-height: 1.8; + margin-top: 8px; + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: var(--ti-upload-list-item-border-radius); + width: 100%; + outline: 0; +} +.tiny-upload-list__item:hover { + background-color: var(--ti-upload-list-item-hover-background-color); +} +.tiny-upload-list__item:hover .tiny-svg.icon-close, +.tiny-upload-list__item:hover .tiny-svg.icon-refres { + display: inline-block; +} +.tiny-upload-list__item:hover .tiny-progress__text { + display: none; +} +.tiny-upload-list__item.is-success .tiny-upload-list__item-status-label { + display: block; +} +.tiny-upload-list__item.is-success .tiny-upload-list__item-name:focus, +.tiny-upload-list__item.is-success .tiny-upload-list__item-name:hover { + color: var(--ti-upload-list-item-hover-color); + cursor: pointer; + text-decoration: none; +} +.tiny-upload-list__item.is-success:focus:not(:hover) .tiny-icon-close-tip { + display: inline-block; +} +.tiny-upload-list__item.is-success:active, +.tiny-upload-list__item.is-success:not(.focusing):focus { + outline-width: 0; +} +.tiny-upload-list__item.is-success:active .tiny-icon-close-tip, +.tiny-upload-list__item.is-success:focus .tiny-upload-list__item-status-label, +.tiny-upload-list__item.is-success:hover .tiny-upload-list__item-status-label, +.tiny-upload-list__item.is-success:not(.focusing):focus .tiny-icon-close-tip { + display: none; +} +.tiny-upload-list__item.is-disabled .tiny-upload-list__item:hover .tiny-upload-list__item-status-label { + display: block; +} +.tiny-upload-list__item.isEdm .tiny-upload-list__item-name { + display: inline-block; +} +.tiny-upload-list__item.isEdm .tiny-upload-list__item-name.isFail { + color: red; +} +.tiny-upload-list__item.isEdm .tiny-upload-list__item-edminfo { + margin-right: 46px; +} +.tiny-upload-list__item.isEdm .tiny-upload-list__item-status-label { + right: 16px; +} +.tiny-upload-list__item.isEdm:not(.showUpdate) .icon-refres { + display: none; +} +.tiny-upload-list__item.isEdm:not(.showDel) .icon-close { + display: none; +} +.tiny-upload-list__item.isEdm.showUpdate .icon-refres { + right: 16px; +} +.tiny-upload-list__item.isEdm.showDel .icon-close { + right: 16px; +} +.tiny-upload-list__item.isEdm.showUpdate.showDel .icon-refres { + right: 28px; +} +.tiny-upload-list__item.isEdm.showUpdate.showDel .icon-close { + right: 8px; +} +.tiny-upload-list__item.isEdm:not(.showUpdate):not(.showDel) .tiny-upload-list__item-status-label { + display: block; +} +.tiny-upload-list__item .tiny-progress { + position: absolute; + top: 20px; + width: 100%; +} +.tiny-upload-list__item .tiny-progress__text { + position: absolute; + right: 0; + top: -13px; +} +.tiny-upload-list__item .tiny-progress-bar { + margin-right: 0; + padding-right: 0; +} +.tiny-upload-list__item .tiny-svg.icon-successful { + font-size: var(--ti-upload-list-successful-icon-font-size); + fill: var(--ti-upload-list-successful-status-color); +} +.tiny-upload-list__item .tiny-svg.icon-close { + display: none; + position: absolute; + top: 50%; + right: 8px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + fill: var(--ti-upload-list-svg-icon-close-color); + font-size: var(--ti-upload-list-svg-icon-font-size); + opacity: 0.75; + cursor: pointer; +} +.tiny-upload-list__item .tiny-svg.icon-close:hover { + opacity: 1; +} +.tiny-upload-list__item .tiny-svg.icon-refres { + display: none; + position: absolute; + top: 50%; + right: 28px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + fill: #606266; + font-size: var(--ti-common-font-size-base); + opacity: 0.75; + cursor: pointer; +} +.tiny-upload-list__item .tiny-svg.icon-refres:hover { + opacity: 1; +} +.tiny-upload-list__item .tiny-icon-close-tip { + display: none; + position: absolute; + top: 5px; + right: 5px; + font-size: var(--ti-upload-list-svg-icon-font-size); + cursor: pointer; + opacity: 1; + color: var(--ti-upload-list-item-hover-color); +} +.tiny-upload-list__item-edminfo, +.tiny-upload-list__item-folder { + display: inline-block; + vertical-align: top; +} +.tiny-upload-list__item-edminfo { + margin-right: 20px; +} +.tiny-upload-list__item-edminfo span { + display: inline-block; + margin-right: 10px; +} +.tiny-upload-list__item-edminfo.isFail span { + color: #f5222d; +} +.tiny-upload-list__item-name { + color: var(--ti-upload-list-item-color); + display: block; + margin-right: 40px; + padding-left: 4px; + -webkit-transition: color 0.3s; + transition: color 0.3s; +} +.tiny-upload-list__item-name .tiny-svg { + font-size: var(--ti-upload-list-item-name-icon-font-size); + margin-right: 4px; + fill: var(--ti-upload-list-item-name-icon-color); +} +.tiny-upload-list__item-status-label { + position: absolute; + right: 5px; + top: 0; + line-height: inherit; + display: none; +} +.tiny-upload-list__item-delete { + position: absolute; + right: 10px; + top: 0; + font-size: var(--ti-upload-list-svg-icon-font-size); + color: var(--ti-upload-list-svg-icon-close-color); + display: none; +} +.tiny-upload-list__item-delete:hover { + color: var(--ti-upload-list-item-hover-color); +} +.tiny-upload-list--picture-card { + margin: 0; + display: inline; + vertical-align: top; +} +.tiny-upload-list--picture-card .tiny-upload-list__item { + overflow: hidden; + background-color: var(--ti-upload-list-picture-card-item-bgcolor); + border: 1px solid var(--ti-upload-list-picture-card-item-border-color); + border-radius: var(--ti-upload-list-item-border-radius); + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 148px; + height: 148px; + margin: 0 8px 8px 0; + display: inline-block; +} +.tiny-upload-list--picture-card .tiny-upload-list__item .tiny-icon-check { + fill: var(--ti-upload-list-picture-card-item-bgcolor); +} +.tiny-upload-list--picture-card .tiny-upload-list__item .tiny-svg.icon-close, +.tiny-upload-list--picture-card .tiny-upload-list__item .tiny-svg.icon-refres, +.tiny-upload-list--picture-card .tiny-upload-list__item:hover .tiny-upload-list__item-status-label { + display: none; +} +.tiny-upload-list--picture-card .tiny-upload-list__item:hover .tiny-progress__text { + display: block; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-name { + display: none; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-thumbnail { + width: 100%; + height: 100%; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-status-label { + position: absolute; + right: -15px; + top: -6px; + width: 40px; + height: 24px; + background: var(--ti-upload-list-successful-status-color); + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2); +} +.tiny-upload-list--picture-card .tiny-upload-list__item-status-label .tiny-svg { + font-size: var(--ti-upload-list-svg-icon-font-size, 12px); + margin-top: 11px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + cursor: default; + text-align: center; + color: var(--ti-upload-list-picture-card-item-bgcolor); + opacity: 0; + font-size: var(--ti-common-font-size-4); + background-color: rgba(0, 0, 0, 0.5); + -webkit-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions::after { + display: inline-block; + content: ''; + height: 100%; + vertical-align: middle; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions:hover { + opacity: 1; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions:hover span { + display: inline-block; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions span { + display: none; + cursor: pointer; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions span + span { + margin-left: 15px; +} +.tiny-upload-list--picture-card .tiny-upload-list__item-actions .tiny-upload-list__item-delete, +.tiny-upload-list--picture-card .tiny-upload-list__item-actions .tiny-upload-list__item-refres { + position: static; + font-size: inherit; + color: inherit; +} +.tiny-upload-list--picture-card .tiny-progress { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + bottom: auto; + width: 126px; +} +.tiny-upload-list--picture-card .tiny-progress .tiny-progress__text { + top: 50%; +} +.tiny-upload-list--picture .tiny-upload-list__item { + overflow: hidden; + z-index: 0; + background-color: var(--ti-upload-list-picture-card-item-bgcolor); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin-top: 8px; + outline: 0; +} +.tiny-upload-list--picture .tiny-upload-list__item .tiny-icon-check { + fill: var(--ti-upload-list-picture-card-item-bgcolor); +} +.tiny-upload-list--picture .tiny-upload-list__item:hover .tiny-upload-list__item-status-label { + background: 0 0; + -webkit-box-shadow: none; + box-shadow: none; + top: -2px; + right: -12px; +} +.tiny-upload-list--picture .tiny-upload-list__item:hover .tiny-progress__text { + display: block; +} +.tiny-upload-list--picture .tiny-upload-list__item.is-success .tiny-upload-list__item-name { + line-height: 56px; + margin-top: 0; +} +.tiny-upload-list--picture .tiny-upload-list__item.is-success .tiny-upload-list__item-name .tiny-svg { + display: none; +} +.tiny-upload-list--picture .tiny-upload-list__item-thumbnail { + width: 56px; + height: 56px; + border: 1px solid var(--ti-upload-list-picture-card-item-border-color); + border-radius: var(--ti-upload-list-item-border-radius); + float: left; + position: relative; + z-index: 1; + vertical-align: middle; + margin-right: 12px; +} +.tiny-upload-list--picture .tiny-upload-list__item-name { + display: block; + line-height: 56px; +} +.tiny-upload-list--picture .tiny-upload-list__item-name .tiny-svg { + font-size: var(--ti-common-font-size-1); +} +.tiny-upload-list--picture .tiny-upload-list__item-status-label { + position: absolute; + right: -17px; + top: -7px; + width: 46px; + height: 26px; + background: var(--ti-upload-list-successful-status-color); + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 1px 1px #ccc; + box-shadow: 0 1px 1px #ccc; +} +.tiny-upload-list--picture .tiny-upload-list__item-status-label .tiny-svg { + font-size: var(--ti-upload-list-svg-icon-font-size); + margin-top: 12px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.tiny-upload-list--picture .tiny-progress { + position: relative; + top: -7px; +} +.tiny-user { + --ti-user-font-size: var(--ti-common-font-size-base); + --ti-user-tag-background: var(--ti-base-color-hover-background); + --ti-user-svg-color: var(--ti-base-color-brand-6); +} +.tiny-user.mini { + height: 30px; +} +.tiny-user .tiny-user__select { + width: 100%; +} +.tiny-user .tiny-user__select .tiny-input .tiny-svg { + fill: var(--ti-user-svg-color); +} +.tiny-user .tiny-user__select .tiny-input.is-disabled .tiny-svg { + fill: var(--ti-input-normal-disabled-color); +} +.tiny-user .tiny-user__select .tiny-select__input { + height: 20px; +} +.tiny-user .tiny-user__ghost.tiny-tag { + background: var(--ti-user-tag-background); +} +.tiny-user_select { + max-width: 50%; + width: auto; + font-size: var(--ti-user-font-size); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.tiny-user_select.left { + float: left; + margin-right: 4px; +} +.tiny-user_select.right { + float: right; + margin-left: 4px; +} +.tiny-user__select-dropdown { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-user-contact { + --ti-user-account-padding: 0 var(--ti-common-space-2x); + --ti-user-account-line-height: 36px; +} +.tiny-user-contact__main .user-account-pop { + padding: var(--ti-user-account-padding); +} +.tiny-user-contact__main .user-account-custom { + line-height: var(--ti-user-account-line-height); +} +.tiny-user-contact__main .tiny-logout { + line-height: var(--ti-user-account-line-height); +} +.tiny-card { + --ti-usercard-border-color: var(--ti-base-color-border); + --ti-usercard-image-radius: var(--ti-base-radius-large); + --ti-usercard-state-online: #33cc00; + --ti-usercard-state-busy: #ff3300; + --ti-usercard-state-goaway: #ffae00; + --ti-usercard-state-offline: #aeaeae; + border: 1px solid var(--ti-usercard-border-color); + -webkit-box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); + box-shadow: 2px 3px 7px rgba(0, 0, 0, 0.15); +} +.tiny-card .dialog-foot { + display: block; +} +.tiny-card .dialog-foot > div { + width: 100%; + text-align: center; +} +.tiny-card h5, +.tiny-card p { + margin: 5px 0; +} +.tiny-card .card-top { + margin-bottom: 10px; +} +.tiny-card .card-top img { + width: 80px; + height: 80px; + border-radius: var(--ti-usercard-image-radius, 3px); +} +.tiny-card .card-top .card-top-text { + padding: 5px 10px; + overflow: hidden; +} +.tiny-card .card-top .card-top-img, +.tiny-card .card-top .card-top-text { + display: inline-block; + vertical-align: middle; +} +.tiny-card .card-bottom { + text-align: center; + display: block; + height: 20px; + margin: 0 -20px -20px; +} +.tiny-card .espace-online { + color: var(--ti-usercard-state-online); +} +.tiny-card .espace-busy { + color: var(--ti-usercard-state-busy); + font-size: 23px; + vertical-align: middle; + margin-top: -5px; +} +.tiny-card .espace-goaway { + color: var(--ti-usercard-state-goaway); + background: #fff; + border-radius: 50%; + font-size: 13px; +} +.tiny-card .espace-offline { + color: var(--ti-usercard-state-offline); + font-size: 23px; + vertical-align: middle; + margin-top: -5px; +} +.tiny-user-contact { + --ti-user-contact-roleInfo-color: var(--ti-base-color-info-normal); + --ti-user-contact-roleInfo-font-size: var(--ti-common-font-size-base); + --ti-user-contact-card-message-color: var(--ti-base-color-placeholder); + --ti-user-contact-card-border-color: #ddd; + --ti-user-contact-card-header-background: #3f4251; + --ti-user-contact-card-header-role-color: var(--ti-base-color-light); + --ti-user-contact-card-header-role-font-size: var(--ti-common-font-size-2); + --ti-user-contact-card-header-roleNumber-color: #b9babc; + --ti-user-contact-card-espace-color: var(--ti-base-color-placeholder); + position: relative; + display: inline-block; + font-size: 0; +} +.tiny-user-contact .tiny-user-contact__main { + width: 300px; + overflow: visible; + font-size: var(--ti-user-contact-roleInfo-font-size); +} +.tiny-user-contact .tiny-user-contact__main .tiny-user-head { + height: 100%; + width: 86px; + float: left; +} +.tiny-user-contact .tiny-user-contact__main .tiny-user-head__portrait { + margin-top: 16px; + width: 54px; + height: 54px; + line-height: 54px; + margin-left: 20px; +} +.tiny-user-contact .tiny-user-contact__main .tiny-user-contact__role { + height: 100%; + width: auto; + float: left; + margin-left: 0; +} +.tiny-user-contact .tiny-user-contact__main .tiny-user-contact__role-name { + display: block; + width: 100%; + color: var(--ti-user-contact-card-header-role-color); + margin: 16px 0 6px; + height: 24px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: var(--ti-user-contact-card-header-role-font-size); + text-align: left; +} +.tiny-user-contact .tiny-user-contact__main .tiny-user-contact__role-number { + display: block; + color: var(--ti-user-contact-card-header-roleNumber-color); +} +.tiny-user-contact .tiny-user-contact__main .tiny-espace svg { + fill: var(--ti-user-contact-card-message-left-color); +} +.tiny-user-contact .tiny-user-contact__main .card-tools { + display: none; +} +.tiny-user-contact .tiny-user-contact__header { + line-height: 1.42857143; + border: 1px solid var(--ti-user-contact-card-border-color); + height: 86px; + background: var(--ti-user-contact-card-header-background); + opacity: 0.9; +} +.tiny-user-contact .tiny-user-contact__title { + display: block; + height: 100%; + font-size: var(--ti-user-contact-roleInfo-font-size); + font-weight: 400; + line-height: 46px; +} +.tiny-user-contact .tiny-user-contact__role { + display: inline-block; + color: var(--ti-user-contact-roleInfo-color); + margin-left: 8px; + vertical-align: middle; + font-size: var(--ti-user-contact-roleInfo-font-size); + line-height: 1.5; +} +.tiny-user-contact .tiny-user-contact__arrow { + margin-left: 4px; + font-size: var(--ti-user-contact-roleInfo-font-size); + vertical-align: middle; + fill: var(--ti-user-contact-roleInfo-color); +} +.tiny-user-contact .tiny-user-contact__message { + padding: 10px 20px; +} +.tiny-user-contact .tiny-user-contact__state { + text-align: left; + margin-bottom: 0; +} +.tiny-user-contact .tiny-user-contact__state:nth-of-type(2) { + margin-top: 3px; +} +.tiny-user-contact .tiny-user-contact__state:nth-of-type(3) { + margin-top: 3px; +} +.tiny-user-contact .tiny-user-contact__state-left { + color: var(--ti-user-contact-card-message-color); + opacity: 1; + font-size: var(--ti-common-font-size-base); + font-family: MicrosoftYaHei; + line-height: 16px; + text-align: left; + width: auto; + margin-right: 0; +} +.tiny-user-contact .tiny-user-contact__state-right { + color: var(--ti-user-contact-card-message-color); + opacity: 1; + font-size: var(--ti-common-font-size-base); + font-family: MicrosoftYaHei; + line-height: 16px; +} +.tiny-user-contact.tiny-popover.tiny-popper { + padding: 0; + border: 0; + border-radius: 0; +} +.tiny-user-contact .tiny-card-template__header.is-line { + height: auto; + border-bottom: 0; + padding: 0; +} +.tiny-user-contact .tiny-card-template__body { + padding: 0; + border: 1px solid var(--ti-user-contact-card-border-color); +} +.tiny-user-contact .tiny-user-head { + position: relative; + display: inline-block; + vertical-align: middle; +} +.tiny-user-contact .tiny-espace { + padding: 0 20px 10px; +} +.tiny-user-contact .tiny-espace .item-call, +.tiny-user-contact .tiny-espace .item-email, +.tiny-user-contact .tiny-espace .item-talk { + color: var(--ti-user-contact-card-espace-color); +} +.tiny-user-contact.show-arrow .tiny-user-contact__main { + width: auto; +} +.tiny-user-contact.show-arrow .tiny-user-contact__main .user-account-custom { + line-height: 30px; +} +.tiny-user-contact.show-arrow .tiny-user-contact__main .tiny-logout { + line-height: 30px; +} +.tiny-user-contact.show-arrow .tiny-card-template__body { + min-width: 180px; + border-radius: 4px; +} +.tiny-user-head { + --ti-userhead-head-size-normal: var(--ti-common-size-18x); + --ti-userhead-head-size-small: 30px; + --ti-userhead-head-icon-normal: var(--ti-common-size-10x); + --ti-userhead-head-icon-small: 14px; + --ti-userhead-head-radius: var(--ti-common-border-radius-1); + display: inline-block; + position: relative; +} +.tiny-user-head__portrait { + overflow: hidden; + width: var(--ti-userhead-head-size-normal); + height: var(--ti-userhead-head-size-normal); + line-height: var(--ti-userhead-head-size-normal); + text-align: center; + border-radius: var(--ti-userhead-head-radius); + background-position: center center; + background-repeat: no-repeat; + background-size: cover; +} +.tiny-user-head__portrait.round { + border-radius: 50%; +} +.tiny-user-head__portrait.min { + width: var(--ti-userhead-head-size-small); + height: var(--ti-userhead-head-size-small); + line-height: var(--ti-userhead-head-size-small); +} +.tiny-user-head__portrait.icon { + font-size: var(--ti-userhead-head-icon-normal); +} +.tiny-user-head__portrait.icon.min { + font-size: var(--ti-userhead-head-icon-small); +} +.tiny-user-head__portrait.icon svg { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.tiny-user-head__portrait.label > span { + overflow: hidden; + width: calc(100% - 6px); + display: block; + margin: 0 3px; +} +.tiny-user-head__message { + position: absolute; + top: -9px; + left: 63px; + height: 18px; + line-height: 16px; + min-width: 18px; + width: auto; + border-radius: 9px; + background: red; + color: #fff; + text-align: center; + padding: 0 2px; + border: 2px solid #fff; + font-size: var(--ti-common-font-size-base); + word-break: initial; +} +.tiny-user-head__message.round { + top: 0; + left: 54px; +} +.tiny-user-head__message.min { + top: -9px; + left: 21px; +} +.tiny-user-head__message.basic { + top: -4px; + left: 68px; + height: 8px; + width: 8px; + min-width: 8px; + line-height: 0; + border-radius: 4px; +} +.tiny-user-head__message.basic.round { + top: 10px; + left: 64px; +} +.tiny-user-head__message.basic.min { + top: -4px; + left: 26px; +} +.tiny-user-head__message.basic.min.round { + top: 0; +} +.tiny-userlink { + --ti-user-link-font-size: var(--ti-common-font-size-base); + --ti-user-link-color: var(--ti-base-color-info-normal); + --ti-user-link-font-weight: var(--ti-common-font-weight-7); + --ti-user-link-border-radius: var(--ti-base-radius-large); +} +.tiny-userlink li { + float: left; + list-style: none; +} +.tiny-userlink li .tiny-popover__reference { + font-size: var(--ti-common-font-size-base); + color: #1890ff; +} +.tiny-userlink li .tiny-popover__reference:hover { + color: #40a9ff; + text-decoration: none; + cursor: pointer; +} +.tiny-userlink .tiny-user-card { + width: 600px; +} +.tiny-user-card .card-box { + font-size: var(--ti-user-link-font-size); + color: var(--ti-user-link-color); + font-weight: var(--ti-user-link-font-weight); +} +.tiny-user-card .card-box .card-box__body .card-top-img, +.tiny-user-card .card-box .card-box__body .card-top-text { + display: inline-block; + vertical-align: middle; +} +.tiny-user-card .card-box .card-box__body .card-top-img { + width: 80px; + border-radius: var(--ti-user-link-border-radius); +} +.tiny-user-card .card-box .card-box__body .card-top-img img { + width: 100%; +} +.tiny-user-card .card-box .card-box__body .card-top-text { + padding: 5px 10px; + overflow: hidden; +} +.tiny-user-card .card-box .card-box__body .card-center { + margin-top: 10px; +} +.tiny-user-card .card-box .box__footer { + text-align: center; + cursor: pointer; +} +.tiny-user-card .card-box p { + margin: 5px 0; +} +.tiny-user-card.tiny-popover.tiny-popper { + padding: 24px; +} +.tiny-wizard { + --ti-wizard-font-size: var(--ti-common-font-size-base); + --ti-wizard-color: var(--ti-base-color-info-normal); + --ti-wizard-icon-color: var(--ti-base-color-light); + --ti-wizard-icon-bgcolor: var(--ti-base-color-brand-6); + --ti-wizard-detail-border-radius: var(--ti-common-border-radius-normal); + --ti-wizard-detail-background: var(--ti-base-color-warning-normal); + --ti-wizard-chart-icon-bgcolor: #d9d9d9; +} +.tiny-wizard .tiny-wizard__nomarl .tiny-wizard__steps { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-wizard .tiny-wizard__nomarl .tiny-wizard__chart span { + display: inline-block; +} +.tiny-wizard .tiny-wizard__nomarl .tiny-wizard__name { + margin-top: 6px; + overflow: hidden; + text-align: center; +} +.tiny-wizard .tiny-wizard__nomarl .tiny-wizard__name .name { + font-size: var(--ti-wizard-font-size); + width: 100%; +} +.tiny-wizard .tiny-wizard__nomarl .tiny-wizard__button { + margin-top: 10px; + text-align: right; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__steps-item.is-doing .tiny-wizard__chart-icon { + color: var(--ti-wizard-icon-color); + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__steps-item.is-doing .tiny-wizard__chart-icon .tiny-wizard__chart-line, +.tiny-wizard + .tiny-wizard__vertical + .tiny-wizard__steps-item.is-doing + .tiny-wizard__chart-icon + .tiny-wizard__chart-line.is-time-line { + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__steps-item:last-child > ul .tiny-wizard__chart-line { + background: 0 0; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__chart-line { + height: 88px; + width: 4px; + top: 0; + position: relative; + display: inline-block; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__chart-name { + font-size: var(--ti-common-font-size-1); + margin-left: 15px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + position: relative; + top: -5px; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__chart-icon { + position: relative; + left: 50%; + top: -14px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__time-wrapper { + position: relative; + left: 50%; + top: -14px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + fill: var(--ti-wizard-icon-bgcolor); + font-size: var(--ti-common-font-size-5); + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 24px; + height: 24px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + border-radius: 50%; + text-align: center; + background: var(--ti-wizard-icon-color); + border: 2px solid var(--ti-wizard-icon-bgcolor); + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__time-wrapper .tiny-svg { + width: 16px; + height: 20px; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__chart-children { + position: relative; +} +.tiny-wizard .tiny-wizard__vertical .tiny-wizard__chart-children .children-name { + position: absolute; + margin-left: 15px; +} +.tiny-wizard .tiny-wizard__date { + min-width: 100px; + width: auto; + color: var(--ti-wizard-color); + font-size: var(--ti-wizard-font-size); + line-height: 1.2em; + display: inline-block; + text-align: right; + position: relative; + top: -24px; + right: 15px; +} +.tiny-wizard .tiny-wizard__date .date-icon { + margin-left: 4px; +} +.tiny-wizard .tiny-wizard__date span { + vertical-align: middle; +} +.tiny-wizard .tiny-wizard__date.time-line-text { + top: -14px; +} +.tiny-wizard .tiny-wizard__steps-item.is-ready .name { + color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__steps-item.is-ready .tiny-wizard__chart-icon { + color: var(--ti-wizard-icon-color); + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__steps-item.is-ready .tiny-wizard__chart-line { + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__steps-item ul { + list-style: none; +} +.tiny-wizard .tiny-wizard__chart { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.tiny-wizard .tiny-wizard__chart > .tiny-wizard__chart-svg > .tiny-svg { + font-size: var(--ti-common-font-size-4); + fill: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__chart-children.is-doing .tiny-wizard__chart-icon, +.tiny-wizard .tiny-wizard__chart-children.is-ready .tiny-wizard__chart-icon, +.tiny-wizard .tiny-wizard__steps-item.is-doing .tiny-wizard__chart-icon, +.tiny-wizard .tiny-wizard__steps-item.is-ready .tiny-wizard__chart-icon { + color: var(--ti-wizard-icon-color); + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__chart-children.is-doing .tiny-wizard__chart-line, +.tiny-wizard .tiny-wizard__steps-item.is-doing .tiny-wizard__chart-line { + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__chart-children.is-ready .tiny-wizard__chart-line, +.tiny-wizard .tiny-wizard__chart-line.is-time-line { + background: var(--ti-wizard-icon-bgcolor); + border-color: var(--ti-wizard-icon-bgcolor); +} +.tiny-wizard .tiny-wizard__chart-detail { + padding: 4px 8px; + border-radius: 2px; + border-radius: var(--ti-wizard-detail-border-radius, 2px); + min-height: 26px; + height: auto; + line-height: 1; + margin-left: 12px; + text-align: center; + display: inline-block; + position: absolute; + top: -14px; +} +.tiny-wizard .tiny-wizard__chart-detail:hover { + background: var(--ti-wizard-detail-background); +} +.tiny-wizard .tiny-wizard__chart-detail:hover::before { + content: ''; + width: 0; + height: 0; + margin-top: -4px; + border-style: solid; + border-width: 4px 4px 4px 0; + border-color: transparent var(--ti-wizard-detail-background); + position: absolute; + left: -4px; + top: 10px; +} +.tiny-wizard .tiny-wizard__chart-detail:hover .detail-title, +.tiny-wizard .tiny-wizard__chart-detail:hover .tiny-user-contact__role { + color: var(--ti-wizard-icon-color); +} +.tiny-wizard .tiny-wizard__chart-detail .detail-title { + color: var(--ti-wizard-color); + font-size: var(--ti-common-font-size-1); + font-weight: 700; + margin-bottom: 8px; +} +.tiny-wizard .tiny-wizard__chart-icon { + width: 20px; + height: 20px; + line-height: 20px; + border-radius: 50%; + font-size: var(--ti-common-font-size-base); + text-align: center; + background: var(--ti-wizard-chart-icon-bgcolor); + color: var(--ti-wizard-icon-color); + -webkit-box-sizing: content-box; + box-sizing: content-box; + display: inline-block; +} +.tiny-wizard .tiny-wizard__chart-icon.time-line-icon { + width: 10px; + height: 10px; + line-height: 10px; +} +.tiny-wizard .tiny-svg, +.tiny-wizard .tiny-wizard__chart-icon, +.tiny-wizard .tiny-wizard__chart-name, +.tiny-wizard .tiny-wizard__date { + cursor: pointer; +} +.tiny-wizard .tiny-wizard__chart-line { + height: 4px; + background: #c2c4c7; + width: 50px; +} +.tiny-wizard .tiny-wizard__chart-line .tiny-wizard__chart-icon-time { + font-size: var(--ti-common-font-size-4); + fill: var(--ti-wizard-icon-bgcolor); + background: var(--ti-wizard-icon-color); +} +.tiny-wizard .tiny-user-contact .dropdown-part .tiny-user-head, +.tiny-wizard .tiny-user-contact .tiny-svg { + display: none; +} +.tiny-wizard .tiny-user-contact .tiny-user-contact__role span { + display: inline-block; +} diff --git a/dl-flow-frontend/mockServer/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg b/dl-flow-frontend/mockServer/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg new file mode 100644 index 0000000..f5ef058 Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg differ diff --git a/dl-flow-frontend/mockServer/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png b/dl-flow-frontend/mockServer/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png new file mode 100644 index 0000000..8c3fd36 Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png differ diff --git a/dl-flow-frontend/mockServer/assets/images/120.jpg b/dl-flow-frontend/mockServer/assets/images/120.jpg new file mode 100644 index 0000000..cf9b61d Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/120.jpg differ diff --git a/dl-flow-frontend/mockServer/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png b/dl-flow-frontend/mockServer/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png new file mode 100644 index 0000000..3290557 Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png differ diff --git a/dl-flow-frontend/mockServer/assets/images/27f7f9d26edd98f6bb1ed8d594d408d9_100x100.jpg b/dl-flow-frontend/mockServer/assets/images/27f7f9d26edd98f6bb1ed8d594d408d9_100x100.jpg new file mode 100644 index 0000000..157b258 Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/27f7f9d26edd98f6bb1ed8d594d408d9_100x100.jpg differ diff --git a/dl-flow-frontend/mockServer/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg b/dl-flow-frontend/mockServer/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg new file mode 100644 index 0000000..8280a90 Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg differ diff --git a/dl-flow-frontend/mockServer/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg b/dl-flow-frontend/mockServer/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg new file mode 100644 index 0000000..c7bf5fa Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg differ diff --git a/dl-flow-frontend/mockServer/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png b/dl-flow-frontend/mockServer/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png new file mode 100644 index 0000000..5fca3ce Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png differ diff --git a/dl-flow-frontend/mockServer/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png b/dl-flow-frontend/mockServer/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png new file mode 100644 index 0000000..8c3fd36 Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png differ diff --git a/dl-flow-frontend/mockServer/assets/images/f750dc319828b039af713c643aad02bd_222x134.png b/dl-flow-frontend/mockServer/assets/images/f750dc319828b039af713c643aad02bd_222x134.png new file mode 100644 index 0000000..32659ba Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/f750dc319828b039af713c643aad02bd_222x134.png differ diff --git a/dl-flow-frontend/mockServer/assets/images/logo.png b/dl-flow-frontend/mockServer/assets/images/logo.png new file mode 100644 index 0000000..6271b2d Binary files /dev/null and b/dl-flow-frontend/mockServer/assets/images/logo.png differ diff --git a/dl-flow-frontend/mockServer/assets/js/1005web-components.es.js b/dl-flow-frontend/mockServer/assets/js/1005web-components.es.js new file mode 100644 index 0000000..689d20a --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/1005web-components.es.js @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineCustomElement } from '@opentiny/tiny-engine-webcomponent-core' +import * as vue from 'vue' +import { resolveComponent, openBlock, createElementBlock, createElementVNode, createVNode, toDisplayString } from 'vue' +import { I18nInjectionKey } from 'vue-i18n' +import { IconChevronLeft } from '@opentiny/vue-icon' +Object.freeze({}) +Object.freeze([]) +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null) + return (str) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + } +} +const hyphenateRE = /\B([A-Z])/g +const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase()) +const _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc + for (const [key, val] of props) { + target[key] = val + } + return target +} +const _sfc_main = { + components: { + TinyIconChevronLeft: IconChevronLeft() + }, + props: { + blockName: { type: String, default: 'MT0526-React 1.0' } + }, + setup(props, context) { + const { t, lowcodeWrap } = vue.inject(I18nInjectionKey).lowcode() + const wrap = lowcodeWrap(props, context, t) + const state = vue.reactive({}) + const attrs = wrap({ + state + }) + return attrs + } +} +const _hoisted_1 = { + style: { 'font-size': '18px', height: '40px', 'border-bottom': '1px solid rgb(223, 225, 230)', 'margin-top': '20px' } +} +const _hoisted_2 = /* @__PURE__ */ createElementVNode( + 'span', + { style: { 'margin-left': '10px', 'font-weight': 'bold' } }, + '\u7F16\u8F91\u7269\u6599\u8D44\u4EA7\u5305 | ', + -1 +) +const _hoisted_3 = { style: { 'margin-left': '10px', 'font-weight': 'bold' } } +function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { + const _component_tiny_icon_chevron_left = resolveComponent('tiny-icon-chevron-left') + return ( + openBlock(), + createElementBlock('div', null, [ + createElementVNode('div', _hoisted_1, [ + createVNode(_component_tiny_icon_chevron_left), + _hoisted_2, + createElementVNode('span', _hoisted_3, toDisplayString($props.blockName), 1) + ]) + ]) + ) +} +const block = /* @__PURE__ */ _export_sfc(_sfc_main, [ + ['render', _sfc_render], + ['__file', 'D:/tmp/buildground/buildground_1673597935715/src/block/generated/components/PortalBlock.vue'] +]) +window.TinyLowcodeResource = window.TinyLowcodeResource || {} +const blockName = hyphenate('PortalBlock') +block.blockId = 1005 +block.blockVersion = '1.0.0' +if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } +} else { + block.links = { + VUE_APP_UI_LIB_FULL_STYLE_FILE_URL: ['//localhost:9090/assets/css/0.1.20/index.css'] + }.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, defineCustomElement(block)) +} +export { block as default } diff --git a/dl-flow-frontend/mockServer/assets/js/1005web-components.umd.js b/dl-flow-frontend/mockServer/assets/js/1005web-components.umd.js new file mode 100644 index 0000000..049e296 --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/1005web-components.umd.js @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +;(function (global, factory) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = factory( + require('@opentiny/tiny-engine-webcomponent-core'), + require('vue'), + require('vue-i18n'), + require('@opentiny/vue-icon') + ) + } else if (typeof define === 'function' && define.amd) { + define(['@opentiny/tiny-engine-webcomponent-core', 'vue', 'vue-i18n', '@opentiny/vue-icon'], factory) + } else { + ;(global = typeof globalThis !== 'undefined' ? globalThis : global || self), + (global.TinyVueBlock = factory(global.TinyWebcomponentCore, global.Vue, global.VueI18n, global.TinyVueIcon)) + } +})(this, (tinyWebcomponentCore, vue, vueI18n, tinyVue3Icon) => { + function _interopNamespace(e) { + if (e && e.__esModule) return e + const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }) + if (e) { + Object.keys(e).forEach((k) => { + if (k !== 'default') { + const d = Object.getOwnPropertyDescriptor(e, k) + Object.defineProperty( + n, + k, + d.get + ? d + : { + enumerable: true, + get: function () { + return e[k] + } + } + ) + } + }) + } + n.default = e + return Object.freeze(n) + } + const vue__namespace = /* @__PURE__ */ _interopNamespace(vue) + Object.freeze({}) + Object.freeze([]) + const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null) + return (str) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + } + } + const hyphenateRE = /\B([A-Z])/g + const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase()) + const _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc + for (const [key, val] of props) { + target[key] = val + } + return target + } + const _sfc_main = { + components: { + TinyIconChevronLeft: tinyVue3Icon.IconChevronLeft() + }, + props: { + blockName: { type: String, default: 'MT0526-React 1.0' } + }, + setup(props, context) { + const { t, lowcodeWrap } = vue__namespace.inject(vueI18n.I18nInjectionKey).lowcode() + const wrap = lowcodeWrap(props, context, t) + const state = vue__namespace.reactive({}) + const attrs = wrap({ + state + }) + return attrs + } + } + const _hoisted_1 = { + style: { + 'font-size': '18px', + height: '40px', + 'border-bottom': '1px solid rgb(223, 225, 230)', + 'margin-top': '20px' + } + } + const _hoisted_2 = /* @__PURE__ */ vue.createElementVNode( + 'span', + { style: { 'margin-left': '10px', 'font-weight': 'bold' } }, + '\u7F16\u8F91\u7269\u6599\u8D44\u4EA7\u5305 | ', + -1 + ) + const _hoisted_3 = { style: { 'margin-left': '10px', 'font-weight': 'bold' } } + function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { + const _component_tiny_icon_chevron_left = vue.resolveComponent('tiny-icon-chevron-left') + return ( + vue.openBlock(), + vue.createElementBlock('div', null, [ + vue.createElementVNode('div', _hoisted_1, [ + vue.createVNode(_component_tiny_icon_chevron_left), + _hoisted_2, + vue.createElementVNode('span', _hoisted_3, vue.toDisplayString($props.blockName), 1) + ]) + ]) + ) + } + const block = /* @__PURE__ */ _export_sfc(_sfc_main, [ + ['render', _sfc_render], + ['__file', 'D:/tmp/buildground/buildground_1673597935715/src/block/generated/components/PortalBlock.vue'] + ]) + window.TinyLowcodeResource = window.TinyLowcodeResource || {} + const blockName = hyphenate('PortalBlock') + block.blockId = 1005 + block.blockVersion = '1.0.0' + if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } + } else { + block.links = { + VUE_APP_UI_LIB_FULL_STYLE_FILE_URL: ['//localhost:9090/assets/css/0.1.20/index.css'] + }.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, tinyWebcomponentCore.defineCustomElement(block)) + } + return block +}) diff --git a/dl-flow-frontend/mockServer/assets/js/1505web-components.es.js b/dl-flow-frontend/mockServer/assets/js/1505web-components.es.js new file mode 100644 index 0000000..1d33e4e --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/1505web-components.es.js @@ -0,0 +1,81 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { + CarouselItem, + CheckboxButton, + Tree, + Popover, + Tooltip, + Col, + DropdownItem, + Pager, + Search, + Row, + FormItem, + Alert, + Input, + Tabs, + DropdownMenu, + DialogBox, + Switch, + TimeLine, + TabItem, + Radio, + Form, + Grid, + Numeric, + CheckboxGroup, + Select, + ButtonGroup, + Carousel, + Popeditor, + DatePicker, + Dropdown, + ChartHistogram +} from '@opentiny/vue' +const Mapper = { + TinyCarouselItem: CarouselItem, + TinyCheckboxButton: CheckboxButton, + TinyTree: Tree, + TinyPopover: Popover, + TinyTooltip: Tooltip, + TinyCol: Col, + TinyDropdownItem: DropdownItem, + TinyPager: Pager, + TinySearch: Search, + TinyRow: Row, + TinyFormItem: FormItem, + TinyAlert: Alert, + TinyInput: Input, + TinyTabs: Tabs, + TinyDropdownMenu: DropdownMenu, + TinyDialogBox: DialogBox, + TinySwitch: Switch, + TinyTimeLine: TimeLine, + TinyTabItem: TabItem, + TinyRadio: Radio, + TinyForm: Form, + TinyGrid: Grid, + TinyNumeric: Numeric, + TinyCheckboxGroup: CheckboxGroup, + TinySelect: Select, + TinyButtonGroup: ButtonGroup, + TinyCarousel: Carousel, + TinyPopeditor: Popeditor, + TinyDatePicker: DatePicker, + TinyDropdown: Dropdown, + TinyChartHistogram: ChartHistogram +} +Mapper.TinyTabs.isGroup = true +Mapper.TinyGrid.isGroup = true +export { Mapper as default } diff --git a/dl-flow-frontend/mockServer/assets/js/1505web-components.umd.js b/dl-flow-frontend/mockServer/assets/js/1505web-components.umd.js new file mode 100644 index 0000000..baf6863 --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/1505web-components.umd.js @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +;(function (global, factory) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = factory(require('@opentiny/vue')) + } else if (typeof define === 'function' && define.amd) { + define(['@opentiny/vue'], factory) + } else { + ;(global = typeof globalThis !== 'undefined' ? globalThis : global || self), + (global.TinyLowcodeComponent = factory(global.TinyVue)) + } +})(this, (tinyVue3) => { + 'use strict' + const Mapper = { + TinyCarouselItem: tinyVue3.CarouselItem, + TinyCheckboxButton: tinyVue3.CheckboxButton, + TinyTree: tinyVue3.Tree, + TinyPopover: tinyVue3.Popover, + TinyTooltip: tinyVue3.Tooltip, + TinyCol: tinyVue3.Col, + TinyDropdownItem: tinyVue3.DropdownItem, + TinyPager: tinyVue3.Pager, + TinySearch: tinyVue3.Search, + TinyRow: tinyVue3.Row, + TinyFormItem: tinyVue3.FormItem, + TinyAlert: tinyVue3.Alert, + TinyInput: tinyVue3.Input, + TinyTabs: tinyVue3.Tabs, + TinyDropdownMenu: tinyVue3.DropdownMenu, + TinyDialogBox: tinyVue3.DialogBox, + TinySwitch: tinyVue3.Switch, + TinyTimeLine: tinyVue3.TimeLine, + TinyTabItem: tinyVue3.TabItem, + TinyRadio: tinyVue3.Radio, + TinyForm: tinyVue3.Form, + TinyGrid: tinyVue3.Grid, + TinyNumeric: tinyVue3.Numeric, + TinyCheckboxGroup: tinyVue3.CheckboxGroup, + TinySelect: tinyVue3.Select, + TinyButtonGroup: tinyVue3.ButtonGroup, + TinyCarousel: tinyVue3.Carousel, + TinyPopeditor: tinyVue3.Popeditor, + TinyDatePicker: tinyVue3.DatePicker, + TinyDropdown: tinyVue3.Dropdown, + TinyChartHistogram: tinyVue3.ChartHistogram + } + Mapper.TinyTabs.isGroup = true + Mapper.TinyGrid.isGroup = true + return Mapper +}) diff --git a/dl-flow-frontend/mockServer/assets/js/989web-components.es.js b/dl-flow-frontend/mockServer/assets/js/989web-components.es.js new file mode 100644 index 0000000..338fa19 --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/989web-components.es.js @@ -0,0 +1,246 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineCustomElement } from '@opentiny/tiny-engine-webcomponent-core' +import * as vue from 'vue' +import { + resolveComponent, + openBlock, + createElementBlock, + createElementVNode, + createVNode, + withCtx, + pushScopeId, + popScopeId +} from 'vue' +import { I18nInjectionKey } from 'vue-i18n' +import { Button, Col, Row } from '@opentiny/vue' +Object.freeze({}) +Object.freeze([]) +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null) + return (str) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + } +} +const hyphenateRE = /\B([A-Z])/g +const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase()) +var _style_0 = + '\n.home-content[data-v-5d023d19] {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n text-align: center;\r\n height: calc(100vh - 262px);\n}\n.home-content .btn[data-v-5d023d19] {\r\n margin-top: 24px;\n}\n.home-content .btn button[data-v-5d023d19] {\r\n border: none;\r\n border-radius: 30px;\r\n background: #5e7ce0;\r\n \r\n font-size: 14px;\r\n color: #fff;\r\n \r\n cursor: pointer;\n}\n.home-content .text[data-v-5d023d19] {\r\n font-size: 18px;\n}\n.home-content .account[data-v-5d023d19] {\r\n margin-top: 16px;\n}\n.home-content .account .sub-text[data-v-5d023d19] {\r\n color: #575d6c;\n}\n.home-content .account .login[data-v-5d023d19] {\r\n color: #1890ff;\r\n cursor: pointer;\n}\n.home-content .logo img[data-v-5d023d19]{\r\n border-radius: 50%;\r\n overflow: hidden;\n}\n' +var _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc + for (const [key, val] of props) { + target[key] = val + } + return target +} +const _sfc_main = { + components: { + TinyButton: Button, + TinyCol: Col, + TinyRow: Row + }, + props: {}, + emits: ['goto-home'], + setup(props, context) { + const { t, lowcodeWrap } = vue.inject(I18nInjectionKey).lowcode() + const wrap = lowcodeWrap(props, context, t) + const state = vue.reactive({ + logoUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAF8CAYAAADM5wDKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OEVGOTU4RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI5OEVGOTU5RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Mjk4RUY5NTZFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Mjk4RUY5NTdFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4dZkpJAAAvNElEQVR42uyd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', + loginImgUrl: + 'data:image/png;base64,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' + }) + const handleClick = wrap(function (event) { + this.emit('goto-home', event) + }) + const attrs = wrap({ + state, + handleClick + }) + return attrs + } +} +const _withScopeId = (n) => (pushScopeId('data-v-5d023d19'), (n = n()), popScopeId(), n) +const _hoisted_1 = { + class: 'home', + style: { height: '100vh', display: 'flex' } +} +const _hoisted_2 = { style: { width: '90%', height: '50%' } } +const _hoisted_3 = ['src'] +const _hoisted_4 = { + class: 'home-content', + style: { 'font-size': '14px' } +} +const _hoisted_5 = { class: 'text' } +const _hoisted_6 = { style: { 'font-size': '16px' } } +const _hoisted_7 = { class: 'logo' } +const _hoisted_8 = ['src'] +const _hoisted_9 = { + style: { + display: 'block', + 'font-size': '28px', + 'margin-top': '12px', + 'margin-bottom': '12px', + 'font-weight': 'bold' + }, + ref: '', + class: 'title' +} +const _hoisted_10 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode( + 'span', + { style: { display: 'block', 'margin-bottom': '12px' } }, + '\u81F4\u529B\u4E8E\u901A\u8FC7\u53CB\u597D\u7684\u7528\u6237\u4EA4\u4E92\u63D0\u5347\u4E1A\u52A1\u7684\u5F00\u53D1\u6548\u7387', + -1 + ) +) +const _hoisted_11 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode( + 'span', + { style: { 'margin-top': '12px' } }, + '\u6B22\u8FCE\u4E00\u8D77\u6765\u89E3\u9501~~', + -1 + ) +) +const _hoisted_12 = { class: 'btn' } +const _hoisted_13 = { class: 'account' } +const _hoisted_14 = { style: { 'font-size': '14px', 'margin-top': '4px' } } +const _hoisted_15 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode('span', { style: { color: '#777777' } }, '\u5DF2\u6709\u56E2\u961F\uFF1F', -1) +) +function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { + const _component_tiny_col = resolveComponent('tiny-col') + const _component_tiny_button = resolveComponent('tiny-button') + const _component_tiny_row = resolveComponent('tiny-row') + return ( + openBlock(), + createElementBlock('div', null, [ + createElementVNode('div', _hoisted_1, [ + createVNode( + _component_tiny_row, + { + align: 'middle', + flex: true, + style: {} + }, + { + default: withCtx(() => [ + createVNode( + _component_tiny_col, + { + span: 6, + style: { 'text-align': 'center', display: 'flex', 'justify-content': 'center' } + }, + { + default: withCtx(() => [ + createElementVNode('div', _hoisted_2, [ + createElementVNode( + 'img', + { + style: { width: '100%', height: '100%' }, + src: _ctx.state.loginImgUrl + }, + null, + 8, + _hoisted_3 + ) + ]) + ]), + _: 1 + } + ), + createVNode( + _component_tiny_col, + { + span: '6', + style: { 'text-align': 'center' } + }, + { + default: withCtx(() => [ + createElementVNode('div', _hoisted_4, [ + createElementVNode('div', _hoisted_5, [ + createElementVNode('div', _hoisted_6, [ + createElementVNode('div', _hoisted_7, [ + createElementVNode( + 'img', + { + style: { width: '105px', height: '105px', 'border-radius': '100px' }, + src: _ctx.state.logoUrl + }, + null, + 8, + _hoisted_8 + ) + ]), + createElementVNode('span', _hoisted_9, 'TinyLowCode \u4F4E\u4EE3\u7801\u5E73\u53F0', 512), + _hoisted_10, + _hoisted_11 + ]), + createElementVNode('div', _hoisted_12, [ + createVNode(_component_tiny_button, { + text: '\u7ACB\u5373\u4F53\u9A8C', + round: true, + type: 'primary', + style: { 'margin-top': '40px' } + }), + createElementVNode('div', _hoisted_13, [ + createElementVNode('div', _hoisted_14, [ + _hoisted_15, + createElementVNode( + 'span', + { + style: { color: '#5e7ce0' }, + onClick: _cache[0] || (_cache[0] = ($event) => _ctx.handleClick(_ctx.event)) + }, + '\u7ACB\u5373\u8FDB\u5165' + ) + ]) + ]) + ]) + ]) + ]) + ]), + _: 1 + } + ) + ]), + _: 1 + } + ) + ]) + ]) + ) +} +var block = /* @__PURE__ */ _export_sfc(_sfc_main, [ + ['render', _sfc_render], + ['styles', [_style_0]], + ['__scopeId', 'data-v-5d023d19'], + ['__file', 'D:/tmp/buildground/buildground_1673597486053/src/block/generated/components/PortalHome.vue'] +]) +window.TinyLowcodeResource = window.TinyLowcodeResource || {} +const blockName = hyphenate('PortalHome') +block.blockId = 989 +block.blockVersion = '1.0.0' +if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } +} else { + block.links = { + VUE_APP_UI_LIB_FULL_STYLE_FILE_URL: ['//localhost:9090/assets/css/0.1.20/index.css'] + }.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, defineCustomElement(block)) +} +export { block as default } diff --git a/dl-flow-frontend/mockServer/assets/js/989web-components.umd.js b/dl-flow-frontend/mockServer/assets/js/989web-components.umd.js new file mode 100644 index 0000000..b98d7d8 --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/989web-components.umd.js @@ -0,0 +1,283 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + ? (module.exports = factory( + require('@opentiny/tiny-engine-webcomponent-core'), + require('vue'), + require('vue-i18n'), + require('@opentiny/vue') + )) + : typeof define === 'function' && define.amd + ? define(['@opentiny/tiny-engine-webcomponent-core', 'vue', 'vue-i18n', '@opentiny/vue'], factory) + : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), + (global.TinyVueBlock = factory(global.TinyWebcomponentCore, global.Vue, global.VueI18n, global.TinyVue))) +})(this, function (tinyWebcomponentCore, vue, vueI18n, tinyVue3) { + 'use strict' + function _interopNamespace(e) { + if (e && e.__esModule) return e + var n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }) + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k) + Object.defineProperty( + n, + k, + d.get + ? d + : { + enumerable: true, + get: function () { + return e[k] + } + } + ) + } + }) + } + n['default'] = e + return Object.freeze(n) + } + var vue__namespace = /* @__PURE__ */ _interopNamespace(vue) + Object.freeze({}) + Object.freeze([]) + const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null) + return (str) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + } + } + const hyphenateRE = /\B([A-Z])/g + const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase()) + var _style_0 = + '\n.home-content[data-v-5d023d19] {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n text-align: center;\r\n height: calc(100vh - 262px);\n}\n.home-content .btn[data-v-5d023d19] {\r\n margin-top: 24px;\n}\n.home-content .btn button[data-v-5d023d19] {\r\n border: none;\r\n border-radius: 30px;\r\n background: #5e7ce0;\r\n \r\n font-size: 14px;\r\n color: #fff;\r\n \r\n cursor: pointer;\n}\n.home-content .text[data-v-5d023d19] {\r\n font-size: 18px;\n}\n.home-content .account[data-v-5d023d19] {\r\n margin-top: 16px;\n}\n.home-content .account .sub-text[data-v-5d023d19] {\r\n color: #575d6c;\n}\n.home-content .account .login[data-v-5d023d19] {\r\n color: #1890ff;\r\n cursor: pointer;\n}\n.home-content .logo img[data-v-5d023d19]{\r\n border-radius: 50%;\r\n overflow: hidden;\n}\n' + var _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc + for (const [key, val] of props) { + target[key] = val + } + return target + } + const _sfc_main = { + components: { + TinyButton: tinyVue3.Button, + TinyCol: tinyVue3.Col, + TinyRow: tinyVue3.Row + }, + props: {}, + emits: ['goto-home'], + setup(props, context) { + const { t, lowcodeWrap } = vue__namespace.inject(vueI18n.I18nInjectionKey).lowcode() + const wrap = lowcodeWrap(props, context, t) + const state = vue__namespace.reactive({ + logoUrl: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAF8CAYAAADM5wDKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OEVGOTU4RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI5OEVGOTU5RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Mjk4RUY5NTZFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Mjk4RUY5NTdFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4dZkpJAAAvNElEQVR42uyd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', + loginImgUrl: + 'data:image/png;base64,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' + }) + const handleClick = wrap(function (event) { + this.emit('goto-home', event) + }) + const attrs = wrap({ + state, + handleClick + }) + return attrs + } + } + const _withScopeId = (n) => (vue.pushScopeId('data-v-5d023d19'), (n = n()), vue.popScopeId(), n) + const _hoisted_1 = { + class: 'home', + style: { height: '100vh', display: 'flex' } + } + const _hoisted_2 = { style: { width: '90%', height: '50%' } } + const _hoisted_3 = ['src'] + const _hoisted_4 = { + class: 'home-content', + style: { 'font-size': '14px' } + } + const _hoisted_5 = { class: 'text' } + const _hoisted_6 = { style: { 'font-size': '16px' } } + const _hoisted_7 = { class: 'logo' } + const _hoisted_8 = ['src'] + const _hoisted_9 = { + style: { + display: 'block', + 'font-size': '28px', + 'margin-top': '12px', + 'margin-bottom': '12px', + 'font-weight': 'bold' + }, + ref: '', + class: 'title' + } + const _hoisted_10 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'span', + { style: { display: 'block', 'margin-bottom': '12px' } }, + '\u81F4\u529B\u4E8E\u901A\u8FC7\u53CB\u597D\u7684\u7528\u6237\u4EA4\u4E92\u63D0\u5347\u4E1A\u52A1\u7684\u5F00\u53D1\u6548\u7387', + -1 + ) + ) + const _hoisted_11 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'span', + { style: { 'margin-top': '12px' } }, + '\u6B22\u8FCE\u4E00\u8D77\u6765\u89E3\u9501~~', + -1 + ) + ) + const _hoisted_12 = { class: 'btn' } + const _hoisted_13 = { class: 'account' } + const _hoisted_14 = { style: { 'font-size': '14px', 'margin-top': '4px' } } + const _hoisted_15 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'span', + { style: { color: '#777777' } }, + '\u5DF2\u6709\u56E2\u961F\uFF1F', + -1 + ) + ) + function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { + const _component_tiny_col = vue.resolveComponent('tiny-col') + const _component_tiny_button = vue.resolveComponent('tiny-button') + const _component_tiny_row = vue.resolveComponent('tiny-row') + return ( + vue.openBlock(), + vue.createElementBlock('div', null, [ + vue.createElementVNode('div', _hoisted_1, [ + vue.createVNode( + _component_tiny_row, + { + align: 'middle', + flex: true, + style: {} + }, + { + default: vue.withCtx(() => [ + vue.createVNode( + _component_tiny_col, + { + span: 6, + style: { 'text-align': 'center', display: 'flex', 'justify-content': 'center' } + }, + { + default: vue.withCtx(() => [ + vue.createElementVNode('div', _hoisted_2, [ + vue.createElementVNode( + 'img', + { + style: { width: '100%', height: '100%' }, + src: _ctx.state.loginImgUrl + }, + null, + 8, + _hoisted_3 + ) + ]) + ]), + _: 1 + } + ), + vue.createVNode( + _component_tiny_col, + { + span: '6', + style: { 'text-align': 'center' } + }, + { + default: vue.withCtx(() => [ + vue.createElementVNode('div', _hoisted_4, [ + vue.createElementVNode('div', _hoisted_5, [ + vue.createElementVNode('div', _hoisted_6, [ + vue.createElementVNode('div', _hoisted_7, [ + vue.createElementVNode( + 'img', + { + style: { width: '105px', height: '105px', 'border-radius': '100px' }, + src: _ctx.state.logoUrl + }, + null, + 8, + _hoisted_8 + ) + ]), + vue.createElementVNode( + 'span', + _hoisted_9, + 'TinyLowCode \u4F4E\u4EE3\u7801\u5E73\u53F0', + 512 + ), + _hoisted_10, + _hoisted_11 + ]), + vue.createElementVNode('div', _hoisted_12, [ + vue.createVNode(_component_tiny_button, { + text: '\u7ACB\u5373\u4F53\u9A8C', + round: true, + type: 'primary', + style: { 'margin-top': '40px' } + }), + vue.createElementVNode('div', _hoisted_13, [ + vue.createElementVNode('div', _hoisted_14, [ + _hoisted_15, + vue.createElementVNode( + 'span', + { + style: { color: '#5e7ce0' }, + onClick: _cache[0] || (_cache[0] = ($event) => _ctx.handleClick(_ctx.event)) + }, + '\u7ACB\u5373\u8FDB\u5165' + ) + ]) + ]) + ]) + ]) + ]) + ]), + _: 1 + } + ) + ]), + _: 1 + } + ) + ]) + ]) + ) + } + var block = /* @__PURE__ */ _export_sfc(_sfc_main, [ + ['render', _sfc_render], + ['styles', [_style_0]], + ['__scopeId', 'data-v-5d023d19'], + ['__file', 'D:/tmp/buildground/buildground_1673597486053/src/block/generated/components/PortalHome.vue'] + ]) + window.TinyLowcodeResource = window.TinyLowcodeResource || {} + const blockName = hyphenate('PortalHome') + block.blockId = 989 + block.blockVersion = '1.0.0' + if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } + } else { + block.links = { + VUE_APP_UI_LIB_FULL_STYLE_FILE_URL: ['//localhost:9090/assets/css/0.1.20/index.css'] + }.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, tinyWebcomponentCore.defineCustomElement(block)) + } + return block +}) diff --git a/dl-flow-frontend/mockServer/assets/js/998web-components.es.js b/dl-flow-frontend/mockServer/assets/js/998web-components.es.js new file mode 100644 index 0000000..173aa17 --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/998web-components.es.js @@ -0,0 +1,664 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineCustomElement } from '@opentiny/tiny-engine-webcomponent-core' +import * as vue from 'vue' +import { + resolveComponent, + openBlock, + createElementBlock, + createElementVNode, + Fragment, + renderList, + toDisplayString, + normalizeClass, + createVNode, + withCtx, + createBlock, + createCommentVNode, + pushScopeId, + popScopeId +} from 'vue' +import { I18nInjectionKey } from 'vue-i18n' +import { IconCheckOut, IconDeltaDown, IconGroup, IconHelpQuery, IconSetting, IconYes } from '@opentiny/vue-icon' +import { Popover, Tooltip } from '@opentiny/vue' +Object.freeze({}) +Object.freeze([]) +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null) + return (str) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + } +} +const hyphenateRE = /\B([A-Z])/g +const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase()) +const _style_0 = + '\n.team-list-item.active[data-v-b66e3972] {\r\n border: 1px solid #38acff;\n}\n.toolbars-item[data-v-b66e3972]:hover {\r\n cursor: pointer;\r\n background-color: #f1f2f3;\n}\n.toolbars-item.active[data-v-b66e3972] {\r\n background-color: #e5e6e8;\n}\n' +const _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc + for (const [key, val] of props) { + target[key] = val + } + return target +} +const _sfc_main = { + components: { + TinyIconCheckOut: IconCheckOut(), + TinyIconDeltaDown: IconDeltaDown(), + TinyIconGroup: IconGroup(), + TinyIconHelpQuery: IconHelpQuery(), + TinyIconSetting: IconSetting(), + TinyIconYes: IconYes(), + TinyPopover: Popover, + TinyTooltip: Tooltip + }, + props: { + tenant: { type: Object, default: () => "{tenant_id: 'public'}" } + }, + emits: ['handle-route'], + setup(props, context) { + const { t, lowcodeWrap } = vue.inject(I18nInjectionKey).lowcode() + const wrap = lowcodeWrap(props, context, t) + const state = vue.reactive({ + menuData: [ + { + label: '\u9996\u9875', + url: '/home' + }, + { + label: '\u6211\u7684\u5E94\u7528', + url: '/home' + }, + { + label: '\u5E94\u7528\u4E2D\u5FC3', + url: '/home' + }, + { + label: '\u6211\u7684\u5E73\u53F0', + url: '/home' + }, + { + label: '\u5E73\u53F0\u4E2D\u5FC3', + url: '/home' + }, + { + label: '\u6211\u7684\u7269\u6599', + url: '/home' + }, + { + label: '\u751F\u6001\u4E2D\u5FC3', + url: '/home' + }, + { + label: '\u76D1\u63A7\u4E2D\u5FC3', + url: '/home' + } + ], + tenants: [ + { + id: 1, + tenant_id: 'public', + name_cn: '\u516C\u5171\u79DF\u6237', + name_en: 'Public Tenant', + description: 'Default tenant for new user to explore.', + published_at: '2021-12-28T11:39:10.000Z', + created_by: null, + updated_by: null, + created_at: '2021-12-28T11:39:10.000Z', + updated_at: '2022-06-27T03:52:15.000Z', + createdBy: null + }, + { + id: 2, + tenant_id: 'crm', + name_cn: '\u5BA2\u6237\u5173\u7CFB\u7BA1\u7406\u7CFB\u7EDF', + name_en: 'Cloud CRM', + description: null, + published_at: '2021-12-30T07:39:19.000Z', + created_by: null, + created_at: '2021-12-30T14:41:57.000Z', + updated_at: '2022-06-14T06:28:08.000Z', + createdBy: null + }, + { + id: 3, + tenant_id: 'tinyMock', + name_cn: 'mock\u5E73\u53F0', + name_en: null, + description: null, + published_at: '2022-05-26T07:13:28.000Z', + created_by: null, + updated_by: null, + created_at: '2022-05-26T07:13:29.000Z', + updated_at: '2022-05-26T07:13:29.000Z', + createdBy: null, + updatedBy: null + }, + { + id: 4, + tenant_id: 'tinyStage', + name_cn: '\u5F00\u53D1\u5DE5\u5177\u96C6', + name_en: 'toolkits', + description: null, + published_at: '2022-05-18T07:56:55.000Z', + created_by: null, + updated_by: null, + created_at: '2022-05-18T07:56:55.000Z', + updated_at: '2022-05-18T07:56:55.000Z' + }, + { + id: 5, + tenant_id: 'tinyUI', + name_cn: 'UI\u7EC4\u4EF6', + name_en: 'components', + description: null, + published_at: '2022-05-18T08:29:32.000Z', + created_by: null, + updated_by: null, + created_at: '2022-05-18T08:29:32.000Z', + updated_at: '2022-05-18T08:29:33.000Z' + }, + { + id: 6, + tenant_id: 'tinyGate', + name_cn: '\u95E8\u7981\u7CFB\u7EDF', + name_en: 'gate', + description: null, + published_at: '2022-06-23T10:15:42.000Z', + created_by: null, + updated_by: null, + created_at: '2022-05-23T10:40:14.000Z', + updated_at: '2022-05-23T10:40:14.000Z', + createdBy: null, + updatedBy: null + }, + { + id: 7, + tenant_id: 'guestGroup', + name_cn: '\u6E38\u5BA2\u56E2\u961F', + name_en: 'guest', + description: null, + published_at: '2022-06-23T10:15:38.000Z', + created_by: null, + updated_by: null, + created_at: '2022-06-22T14:58:22.000Z', + updated_at: '2022-06-22T14:58:22.000Z' + }, + { + id: 265, + tenant_id: 'myteam', + name_cn: null, + name_en: null, + description: null, + published_at: '2022-06-14T06:49:58.000Z', + created_by: null, + updated_by: null, + created_at: '2022-06-14T06:49:58.000Z', + updated_at: '2022-06-14T06:49:58.000Z' + }, + { + id: 267, + tenant_id: 'test', + name_cn: null, + name_en: null, + description: null, + published_at: '2022-06-15T03:35:14.000Z', + created_by: null, + updated_by: null, + created_at: '2022-06-15T03:35:14.000Z', + updated_at: '2022-06-15T03:35:14.000Z' + }, + { + id: 268, + tenant_id: 'zzcTest', + name_cn: null, + name_en: null, + description: null, + published_at: '2022-06-17T08:47:17.000Z', + created_by: null, + updated_by: null, + created_at: '2022-06-17T08:47:17.000Z', + updated_at: '2022-06-17T08:47:17.000Z' + } + ] + }) + const openHomePage = wrap(function openHomePage2(event) { + this.router.push('/team-home') + }) + const gotoRouter = wrap(function gotoRouter2(event) { + this.emit('handle-route', event) + }) + const attrs = wrap({ + state, + openHomePage, + gotoRouter + }) + return attrs + } +} +const _withScopeId = (n) => (pushScopeId('data-v-b66e3972'), (n = n()), popScopeId(), n) +const _hoisted_1 = { + style: { + display: 'flex', + 'justify-content': 'space-between', + 'align-items': 'center', + height: '50px', + 'border-radius': '0px' + } +} +const _hoisted_2 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode( + 'img', + { + src: 'http://localhost:9090/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png', + style: { display: 'block', width: '48px', height: 'auto', 'margin-left': '10px' } + }, + null, + -1 + ) +) +const _hoisted_3 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode('span', { style: { 'font-weight': 'bolder', color: '#000000' } }, 'TinyEngine', -1) +) +const _hoisted_4 = [_hoisted_2, _hoisted_3] +const _hoisted_5 = { + style: { + width: '230px', + height: '50px', + display: 'flex', + 'justify-content': 'space-around', + 'align-items': 'center', + 'margin-right': '10px', + 'border-radius': '0px' + }, + class: 'toolbars' +} +const _hoisted_6 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode('div', { placeholder: '\u89E6\u53D1\u6E90' }, null, -1) +) +const _hoisted_7 = { + style: { + 'padding-top': '6px', + 'padding-left': '6px', + 'padding-right': '6px', + 'padding-bottom': '6px', + 'margin-left': '8px', + 'border-radius': '6px' + } +} +const _hoisted_8 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode('div', { placeholder: '\u89E6\u53D1\u6E90' }, null, -1) +) +const _hoisted_9 = { + style: { + 'padding-top': '6px', + 'padding-left': '6px', + 'padding-right': '6px', + 'padding-bottom': '6px', + 'margin-left': '8px', + 'border-radius': '6px' + } +} +const _hoisted_10 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode('div', { placeholder: '\u89E6\u53D1\u6E90' }, null, -1) +) +const _hoisted_11 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode( + 'span', + { + class: 'split', + style: { margin: '0 8px', 'font-size': '16px', 'border-radius': '0px', color: '#e5e6e8' } + }, + '|', + -1 + ) +) +const _hoisted_12 = { placeholder: '\u89E6\u53D1\u6E90' } +const _hoisted_13 = { + class: 'toolbars-item', + style: { padding: '6px', 'border-radius': '6px', display: 'flex', 'align-items': 'center' } +} +const _hoisted_14 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode('span', { style: { 'border-radius': '0px' } }, 'public', -1) +) +const _hoisted_15 = { + placeholder: '\u63D0\u793A\u5185\u5BB9', + style: { 'border-radius': '0px' } +} +const _hoisted_16 = { + style: { 'border-radius': '0px' }, + class: 'team-list' +} +const _hoisted_17 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode( + 'div', + { + class: 'team-list-title', + style: { + 'font-size': '16px', + 'line-height': '22px', + 'font-weight': '500', + 'text-overflow': 'ellipsis', + 'white-space': 'nowrap', + overflow: 'hidden' + } + }, + [/* @__PURE__ */ createElementVNode('span', null, '\u7EC4\u7EC7/\u56E2\u961F')], + -1 + ) +) +const _hoisted_18 = { + class: 'team-list-group', + style: { height: 'auto', 'max-height': '335px', overflow: 'auto', 'margin-top': '16px', 'border-radius': '0px' } +} +const _hoisted_19 = { + class: 'team-list-item-logo', + style: { + height: '28px', + width: '28px', + 'border-radius': '8px', + 'font-size': '16px', + color: '#fff', + background: '#38acff', + 'margin-right': '12px', + display: 'flex', + 'align-items': 'center', + 'justify-content': 'center' + } +} +const _hoisted_20 = { + style: { + height: '22px', + 'font-size': '14px', + 'line-height': '22px', + color: 'rgba(0, 0, 0, 0.8)', + flex: '1', + 'margin-right': '5px', + overflow: 'hidden', + 'text-overflow': 'ellipsis', + 'white-space': 'nowrap', + 'border-radius': '0px' + } +} +const _hoisted_21 = { + style: { 'border-radius': '0px' }, + class: 'team-list-item-icon' +} +const _hoisted_22 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ createElementVNode( + 'img', + { + style: { width: '40px', height: 'auto', 'border-radius': '50px' }, + src: 'https://localhost:9090/assets/images/120' + }, + null, + -1 + ) +) +function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { + let _a + const _component_tiny_icon_setting = resolveComponent('tiny-icon-setting') + const _component_tiny_tooltip = resolveComponent('tiny-tooltip') + const _component_tiny_icon_check_out = resolveComponent('tiny-icon-check-out') + const _component_tiny_icon_help_query = resolveComponent('tiny-icon-help-query') + const _component_tiny_icon_delta_down = resolveComponent('tiny-icon-delta-down') + const _component_tiny_icon_group = resolveComponent('tiny-icon-group') + const _component_tiny_icon_yes = resolveComponent('tiny-icon-yes') + const _component_tiny_popover = resolveComponent('tiny-popover') + return ( + openBlock(), + createElementBlock('div', null, [ + createElementVNode('div', _hoisted_1, [ + createElementVNode( + 'div', + { + style: { display: 'flex', 'align-items': 'center', 'border-radius': '0px' }, + onClick: _cache[0] || (_cache[0] = ($event) => _ctx.openHomePage(_ctx.event)) + }, + _hoisted_4 + ), + createElementVNode('div', null, [ + (openBlock(true), + createElementBlock( + Fragment, + null, + renderList(_ctx.state.menuData, (item, index) => { + return ( + openBlock(), + createElementBlock( + 'span', + { + key: index, + style: { 'font-size': '16px', 'margin-left': '10px', 'margin-right': '10px', color: '#747677' }, + onClick: _cache[1] || (_cache[1] = ($event) => _ctx.gotoRouter(_ctx.event)) + }, + toDisplayString(item.label), + 1 + ) + ) + }), + 128 + )) + ]), + createElementVNode('div', _hoisted_5, [ + createElementVNode( + 'div', + { + class: normalizeClass({ + 'toolbars-item': true, + active: ((_a = _ctx.route.path) == null ? void 0 : _a.indexOf('/permission-setting')) > -1 + }), + style: { + 'padding-top': '6px', + 'padding-left': '6px', + 'padding-right': '6px', + 'padding-bottom': '6px', + 'margin-left': '8px', + 'border-radius': '6px' + }, + onClick: _cache[2] || (_cache[2] = ($event) => _ctx.openPermission(_ctx.event)) + }, + [ + createVNode( + _component_tiny_tooltip, + { + content: '\u8BBE\u7F6E\u4E2D\u5FC3', + placement: 'top', + manual: false, + modelValue: true, + style: { color: '#878f95' } + }, + { + default: withCtx(() => [_hoisted_6, createVNode(_component_tiny_icon_setting)]), + _: 1 + } + ) + ], + 2 + ), + createElementVNode('div', _hoisted_7, [ + createVNode( + _component_tiny_tooltip, + { + content: '\u534F\u8BAE\u89C4\u8303', + placement: 'top', + manual: false, + modelValue: true, + style: { 'border-radius': '0px' } + }, + { + default: withCtx(() => [ + _hoisted_8, + createVNode(_component_tiny_icon_check_out, { style: { color: '#878f95' } }) + ]), + _: 1 + } + ) + ]), + createElementVNode('div', _hoisted_9, [ + createVNode( + _component_tiny_tooltip, + { + content: '\u5E2E\u52A9\u4E2D\u5FC3', + placement: 'top', + manual: false, + modelValue: true, + class: 'tip-icon', + style: { fill: '#878f95', 'border-radius': '0px' } + }, + { + default: withCtx(() => [ + _hoisted_10, + createVNode(_component_tiny_icon_help_query, { style: { color: '#ffffff' } }) + ]), + _: 1 + } + ) + ]), + _hoisted_11, + createVNode( + _component_tiny_popover, + { + width: 308, + title: '\u5F39\u6846\u6807\u9898', + trigger: 'manual', + modelValue: true, + placement: 'bottom-end', + 'popper-class': 'team-list-pop', + style: { 'border-radius': '0px' } + }, + { + reference: withCtx(() => [ + createElementVNode('div', _hoisted_12, [ + createElementVNode('div', _hoisted_13, [ + _hoisted_14, + createVNode(_component_tiny_icon_delta_down, { + style: { 'font-size': '12px', 'border-radius': '0px', color: '#878f95' } + }) + ]) + ]) + ]), + default: withCtx(() => [ + createElementVNode('div', _hoisted_15, [ + createElementVNode('div', _hoisted_16, [ + _hoisted_17, + createElementVNode('div', _hoisted_18, [ + (openBlock(true), + createElementBlock( + Fragment, + null, + renderList(_ctx.state.tenants, (item, index) => { + return ( + openBlock(), + createElementBlock( + 'div', + { + class: normalizeClass(['team-list-item', { active: item.id === $props.tenant.id }]), + key: item.id, + style: { + display: 'flex', + 'align-items': 'center', + height: '56px', + 'border-radius': '6px', + 'background-color': '#fff', + cursor: 'pointer', + padding: '8px 12px', + 'box-sizing': 'border-box' + } + }, + [ + createElementVNode('div', _hoisted_19, [ + createVNode(_component_tiny_icon_group, { style: { 'border-radius': '0px' } }) + ]), + createElementVNode('span', _hoisted_20, toDisplayString(item.tenant_id), 1), + createElementVNode('div', _hoisted_21, [ + item.id === 1 + ? (openBlock(), + createBlock(_component_tiny_icon_yes, { + key: 0, + style: { 'font-size': '20px', color: '#38acff' } + })) + : createCommentVNode('v-if', true) + ]) + ], + 2 + ) + ) + }), + 128 + )) + ]) + ]) + ]) + ]), + _: 1 + } + ), + createVNode(_component_tiny_popover, { + width: 200, + title: '\u5F39\u6846\u6807\u9898', + trigger: 'manual', + modelValue: false, + 'append-to-body': false + }), + createVNode(_component_tiny_popover, { + width: 308, + title: '\u5F39\u6846\u6807\u9898', + trigger: 'click', + modelValue: false, + placement: 'bottom-end', + 'append-to-body': false, + 'visible-arrow': false, + 'popper-class': 'team-list-pop' + }), + _hoisted_22 + ]) + ]), + createVNode(_component_tiny_popover, { + width: 200, + title: '\u5F39\u6846\u6807\u9898', + trigger: 'manual', + modelValue: true + }), + createVNode(_component_tiny_popover, { + width: 200, + title: '\u5F39\u6846\u6807\u9898', + trigger: 'manual', + modelValue: false, + 'visible-arrow': true + }) + ]) + ) +} +const block = /* @__PURE__ */ _export_sfc(_sfc_main, [ + ['render', _sfc_render], + ['styles', [_style_0]], + ['__scopeId', 'data-v-b66e3972'], + ['__file', 'D:/tmp/buildground/buildground_1673597845904/src/block/generated/components/PortalHeader.vue'] +]) +window.TinyLowcodeResource = window.TinyLowcodeResource || {} +const blockName = hyphenate('PortalHeader') +block.blockId = 998 +block.blockVersion = '1.0.0' +if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } +} else { + block.links = { + VUE_APP_UI_LIB_FULL_STYLE_FILE_URL: ['//localhost:9090/assets/css/0.1.20/index.css'] + }.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, defineCustomElement(block)) +} +export { block as default } diff --git a/dl-flow-frontend/mockServer/assets/js/998web-components.umd.js b/dl-flow-frontend/mockServer/assets/js/998web-components.umd.js new file mode 100644 index 0000000..312b59e --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/js/998web-components.umd.js @@ -0,0 +1,718 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +;(function (global, factory) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = factory( + require('@opentiny/tiny-engine-webcomponent-core'), + require('vue'), + require('vue-i18n'), + require('@opentiny/vue-icon'), + require('@opentiny/vue') + ) + } else if (typeof define === 'function ' && define.amd) { + define([ + '@opentiny/tiny-engine-webcomponent-core', + 'vue', + 'vue-i18n', + '@opentiny/vue-icon', + '@opentiny/vue' + ], factory) + } else { + ;(global = typeof globalThis !== 'undefined' ? globalThis : global || self), + (global.TinyVueBlock = factory( + global.TinyWebcomponentCore, + global.Vue, + global.VueI18n, + global.TinyVueIcon, + global.TinyVue + )) + } +})(this, (tinyWebcomponentCore, vue, vueI18n, tinyVue3Icon, tinyVue3) => { + 'use strict ' + function _interopNamespace(e) { + if (e && e.__esModule) return e + const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module ' } }) + if (e) { + Object.keys(e).forEach((k) => { + if (k !== 'default ') { + const d = Object.getOwnPropertyDescriptor(e, k) + Object.defineProperty( + n, + k, + d.get + ? d + : { + enumerable: true, + get: function () { + return e[k] + } + } + ) + } + }) + } + n['default '] = e + return Object.freeze(n) + } + const vue__namespace = /* @__PURE__ */ _interopNamespace(vue) + Object.freeze({}) + Object.freeze([]) + const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null) + return (str) => { + const hit = cache[str] + return hit || (cache[str] = fn(str)) + } + } + const hyphenateRE = /\B([A-Z])/g + const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1 ').toLowerCase()) + const _style_0 = + '\n.team-list-item.active[data-v-b66e3972] {\r\n border: 1px solid #38acff;\n}\n.toolbars-item[data-v-b66e3972]:hover {\r\n cursor: pointer;\r\n background-color: #f1f2f3;\n}\n.toolbars-item.active[data-v-b66e3972] {\r\n background-color: #e5e6e8;\n}\n ' + const _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc + for (const [key, val] of props) { + target[key] = val + } + return target + } + const _sfc_main = { + components: { + TinyIconCheckOut: tinyVue3Icon.IconCheckOut(), + TinyIconDeltaDown: tinyVue3Icon.IconDeltaDown(), + TinyIconGroup: tinyVue3Icon.IconGroup(), + TinyIconHelpQuery: tinyVue3Icon.IconHelpQuery(), + TinyIconSetting: tinyVue3Icon.IconSetting(), + TinyIconYes: tinyVue3Icon.IconYes(), + TinyPopover: tinyVue3.Popover, + TinyTooltip: tinyVue3.Tooltip + }, + props: { + tenant: { type: Object, default: () => "{tenant_id: 'public'} " } + }, + emits: ['handle-route '], + setup(props, context) { + const { t, lowcodeWrap } = vue__namespace.inject(vueI18n.I18nInjectionKey).lowcode() + const wrap = lowcodeWrap(props, context, t) + const state = vue__namespace.reactive({ + 'menuData ': [ + { + 'label ': '\u9996\u9875 ', + 'url ': '/home ' + }, + { + 'label ': '\u6211\u7684\u5E94\u7528 ', + 'url ': '/home ' + }, + { + 'label ': '\u5E94\u7528\u4E2D\u5FC3 ', + 'url ': '/home ' + }, + { + 'label ': '\u6211\u7684\u5E73\u53F0 ', + 'url ': '/home ' + }, + { + 'label ': '\u5E73\u53F0\u4E2D\u5FC3 ', + 'url ': '/home ' + }, + { + 'label ': '\u6211\u7684\u7269\u6599 ', + 'url ': '/home ' + }, + { + 'label ': '\u751F\u6001\u4E2D\u5FC3 ', + 'url ': '/home ' + }, + { + 'label ': '\u76D1\u63A7\u4E2D\u5FC3 ', + 'url ': '/home ' + } + ], + 'tenants ': [ + { + 'id ': 1, + 'tenant_id ': 'public ', + 'name_cn ': '\u516C\u5171\u79DF\u6237 ', + 'name_en ': 'Public Tenant ', + 'description ': 'Default tenant for new user to explore. ', + 'published_at ': '2021-12-28T11:39:10.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2021-12-28T11:39:10.000Z ', + 'updated_at ': '2022-06-27T03:52:15.000Z ', + 'createdBy ': null + }, + { + 'id ': 2, + 'tenant_id ': 'crm ', + 'name_cn ': '\u5BA2\u6237\u5173\u7CFB\u7BA1\u7406\u7CFB\u7EDF ', + 'name_en ': 'Cloud CRM ', + 'description ': null, + 'published_at ': '2021-12-30T07:39:19.000Z ', + 'created_by ': null, + 'created_at ': '2021-12-30T14:41:57.000Z ', + 'updated_at ': '2022-06-14T06:28:08.000Z ', + 'createdBy ': null + }, + { + 'id ': 3, + 'tenant_id ': 'tinyMock ', + 'name_cn ': 'mock\u5E73\u53F0 ', + 'name_en ': null, + 'description ': null, + 'published_at ': '2022-05-26T07:13:28.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-05-26T07:13:29.000Z ', + 'updated_at ': '2022-05-26T07:13:29.000Z ', + 'createdBy ': null, + 'updatedBy ': null + }, + { + 'id ': 4, + 'tenant_id ': 'tinyStage ', + 'name_cn ': '\u5F00\u53D1\u5DE5\u5177\u96C6 ', + 'name_en ': 'toolkits ', + 'description ': null, + 'published_at ': '2022-05-18T07:56:55.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-05-18T07:56:55.000Z ', + 'updated_at ': '2022-05-18T07:56:55.000Z ' + }, + { + 'id ': 5, + 'tenant_id ': 'tinyUI ', + 'name_cn ': 'UI\u7EC4\u4EF6 ', + 'name_en ': 'components ', + 'description ': null, + 'published_at ': '2022-05-18T08:29:32.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-05-18T08:29:32.000Z ', + 'updated_at ': '2022-05-18T08:29:33.000Z ' + }, + { + 'id ': 6, + 'tenant_id ': 'tinyGate ', + 'name_cn ': '\u95E8\u7981\u7CFB\u7EDF ', + 'name_en ': 'gate ', + 'description ': null, + 'published_at ': '2022-06-23T10:15:42.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-05-23T10:40:14.000Z ', + 'updated_at ': '2022-05-23T10:40:14.000Z ', + 'createdBy ': null, + 'updatedBy ': null + }, + { + 'id ': 7, + 'tenant_id ': 'guestGroup ', + 'name_cn ': '\u6E38\u5BA2\u56E2\u961F ', + 'name_en ': 'guest ', + 'description ': null, + 'published_at ': '2022-06-23T10:15:38.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-06-22T14:58:22.000Z ', + 'updated_at ': '2022-06-22T14:58:22.000Z ' + }, + { + 'id ': 265, + 'tenant_id ': 'myteam ', + 'name_cn ': null, + 'name_en ': null, + 'description ': null, + 'published_at ': '2022-06-14T06:49:58.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-06-14T06:49:58.000Z ', + 'updated_at ': '2022-06-14T06:49:58.000Z ' + }, + { + 'id ': 267, + 'tenant_id ': 'test ', + 'name_cn ': null, + 'name_en ': null, + 'description ': null, + 'published_at ': '2022-06-15T03:35:14.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-06-15T03:35:14.000Z ', + 'updated_at ': '2022-06-15T03:35:14.000Z ' + }, + { + 'id ': 268, + 'tenant_id ': 'zzcTest ', + 'name_cn ': null, + 'name_en ': null, + 'description ': null, + 'published_at ': '2022-06-17T08:47:17.000Z ', + 'created_by ': null, + 'updated_by ': null, + 'created_at ': '2022-06-17T08:47:17.000Z ', + 'updated_at ': '2022-06-17T08:47:17.000Z ' + } + ] + }) + const openHomePage = wrap(function openHomePage2(event) { + this.router.push('/team-home ') + }) + const gotoRouter = wrap(function gotoRouter2(event) { + this.emit('handle-route ', event) + }) + const attrs = wrap({ + state, + openHomePage, + gotoRouter + }) + return attrs + } + } + const _withScopeId = (n) => (vue.pushScopeId('data-v-b66e3972 '), (n = n()), vue.popScopeId(), n) + const _hoisted_1 = { + style: { + 'display ': 'flex ', + 'justify-content ': 'space-between ', + 'align-items ': 'center ', + 'height ': '50px ', + 'border-radius ': '0px ' + } + } + const _hoisted_2 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'img ', + { + src: 'http://localhost:9090/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png ', + style: { 'display ': 'block ', 'width ': '48px ', 'height ': 'auto ', 'margin-left ': '10px ' } + }, + null, + -1 + ) + ) + const _hoisted_3 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'span ', + { style: { 'font-weight ': 'bolder ', 'color ': '#000000 ' } }, + 'TinyEngine ', + -1 + ) + ) + const _hoisted_4 = [_hoisted_2, _hoisted_3] + const _hoisted_5 = { + style: { + 'width ': '230px ', + 'height ': '50px ', + 'display ': 'flex ', + 'justify-content ': 'space-around ', + 'align-items ': 'center ', + 'margin-right ': '10px ', + 'border-radius ': '0px ' + }, + class: 'toolbars ' + } + const _hoisted_6 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode('div ', { placeholder: '\u89E6\u53D1\u6E90 ' }, null, -1) + ) + const _hoisted_7 = { + style: { + 'padding-top ': '6px ', + 'padding-left ': '6px ', + 'padding-right ': '6px ', + 'padding-bottom ': '6px ', + 'margin-left ': '8px ', + 'border-radius ': '6px ' + } + } + const _hoisted_8 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode('div ', { placeholder: '\u89E6\u53D1\u6E90 ' }, null, -1) + ) + const _hoisted_9 = { + style: { + 'padding-top ': '6px ', + 'padding-left ': '6px ', + 'padding-right ': '6px ', + 'padding-bottom ': '6px ', + 'margin-left ': '8px ', + 'border-radius ': '6px ' + } + } + const _hoisted_10 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode('div ', { placeholder: '\u89E6\u53D1\u6E90 ' }, null, -1) + ) + const _hoisted_11 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'span ', + { + class: 'split ', + style: { 'margin ': '0 8px ', 'font-size ': '16px ', 'border-radius ': '0px ', 'color ': '#e5e6e8 ' } + }, + '| ', + -1 + ) + ) + const _hoisted_12 = { placeholder: '\u89E6\u53D1\u6E90 ' } + const _hoisted_13 = { + class: 'toolbars-item ', + style: { 'padding ': '6px ', 'border-radius ': '6px ', 'display ': 'flex ', 'align-items ': 'center ' } + } + const _hoisted_14 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode('span ', { style: { 'border-radius ': '0px ' } }, 'public ', -1) + ) + const _hoisted_15 = { + placeholder: '\u63D0\u793A\u5185\u5BB9 ', + style: { 'border-radius ': '0px ' } + } + const _hoisted_16 = { + style: { 'border-radius ': '0px ' }, + class: 'team-list ' + } + const _hoisted_17 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'div ', + { + class: 'team-list-title ', + style: { + 'font-size ': '16px ', + 'line-height ': '22px ', + 'font-weight ': '500 ', + 'text-overflow ': 'ellipsis ', + 'white-space ': 'nowrap ', + 'overflow ': 'hidden ' + } + }, + [/* @__PURE__ */ vue.createElementVNode('span ', null, '\u7EC4\u7EC7/\u56E2\u961F ')], + -1 + ) + ) + const _hoisted_18 = { + class: 'team-list-group ', + style: { + 'height ': 'auto ', + 'max-height ': '335px ', + 'overflow ': 'auto ', + 'margin-top ': '16px ', + 'border-radius ': '0px ' + } + } + const _hoisted_19 = { + class: 'team-list-item-logo ', + style: { + 'height ': '28px ', + 'width ': '28px ', + 'border-radius ': '8px ', + 'font-size ': '16px ', + 'color ': '#fff ', + 'background ': '#38acff ', + 'margin-right ': '12px ', + 'display ': 'flex ', + 'align-items ': 'center ', + 'justify-content ': 'center ' + } + } + const _hoisted_20 = { + style: { + 'height ': '22px ', + 'font-size ': '14px ', + 'line-height ': '22px ', + 'color ': 'rgba(0, 0, 0, 0.8) ', + 'flex ': '1 ', + 'margin-right ': '5px ', + 'overflow ': 'hidden ', + 'text-overflow ': 'ellipsis ', + 'white-space ': 'nowrap ', + 'border-radius ': '0px ' + } + } + const _hoisted_21 = { + style: { 'border-radius ': '0px ' }, + class: 'team-list-item-icon ' + } + const _hoisted_22 = /* @__PURE__ */ _withScopeId(() => + /* @__PURE__ */ vue.createElementVNode( + 'img ', + { + style: { 'width ': '40px ', 'height ': 'auto ', 'border-radius ': '50px ' }, + src: 'http://localhost:9090/assets/images/120 ' + }, + null, + -1 + ) + ) + function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { + let _a + const _component_tiny_icon_setting = vue.resolveComponent('tiny-icon-setting ') + const _component_tiny_tooltip = vue.resolveComponent('tiny-tooltip ') + const _component_tiny_icon_check_out = vue.resolveComponent('tiny-icon-check-out ') + const _component_tiny_icon_help_query = vue.resolveComponent('tiny-icon-help-query ') + const _component_tiny_icon_delta_down = vue.resolveComponent('tiny-icon-delta-down ') + const _component_tiny_icon_group = vue.resolveComponent('tiny-icon-group ') + const _component_tiny_icon_yes = vue.resolveComponent('tiny-icon-yes ') + const _component_tiny_popover = vue.resolveComponent('tiny-popover ') + return ( + vue.openBlock(), + vue.createElementBlock('div ', null, [ + vue.createElementVNode('div ', _hoisted_1, [ + vue.createElementVNode( + 'div ', + { + style: { 'display ': 'flex ', 'align-items ': 'center ', 'border-radius ': '0px ' }, + onClick: _cache[0] || (_cache[0] = ($event) => _ctx.openHomePage(_ctx.event)) + }, + _hoisted_4 + ), + vue.createElementVNode('div ', null, [ + (vue.openBlock(true), + vue.createElementBlock( + vue.Fragment, + null, + vue.renderList(_ctx.state.menuData, (item, index) => { + return ( + vue.openBlock(), + vue.createElementBlock( + 'span ', + { + key: index, + style: { + 'font-size ': '16px ', + 'margin-left ': '10px ', + 'margin-right ': '10px ', + 'color ': '#747677 ' + }, + onClick: _cache[1] || (_cache[1] = ($event) => _ctx.gotoRouter(_ctx.event)) + }, + vue.toDisplayString(item.label), + 1 + ) + ) + }), + 128 + )) + ]), + vue.createElementVNode('div ', _hoisted_5, [ + vue.createElementVNode( + 'div ', + { + class: vue.normalizeClass({ + 'toolbars-item ': true, + active: ((_a = _ctx.route.path) == null ? void 0 : _a.indexOf('/permission-setting ')) > -1 + }), + style: { + 'padding-top ': '6px ', + 'padding-left ': '6px ', + 'padding-right ': '6px ', + 'padding-bottom ': '6px ', + 'margin-left ': '8px ', + 'border-radius ': '6px ' + }, + onClick: _cache[2] || (_cache[2] = ($event) => _ctx.openPermission(_ctx.event)) + }, + [ + vue.createVNode( + _component_tiny_tooltip, + { + content: '\u8BBE\u7F6E\u4E2D\u5FC3 ', + placement: 'top ', + manual: false, + modelValue: true, + style: { 'color ': '#878f95 ' } + }, + { + default: vue.withCtx(() => [_hoisted_6, vue.createVNode(_component_tiny_icon_setting)]), + _: 1 + } + ) + ], + 2 + ), + vue.createElementVNode('div ', _hoisted_7, [ + vue.createVNode( + _component_tiny_tooltip, + { + content: '\u534F\u8BAE\u89C4\u8303 ', + placement: 'top ', + manual: false, + modelValue: true, + style: { 'border-radius ': '0px ' } + }, + { + default: vue.withCtx(() => [ + _hoisted_8, + vue.createVNode(_component_tiny_icon_check_out, { style: { 'color ': '#878f95 ' } }) + ]), + _: 1 + } + ) + ]), + vue.createElementVNode('div ', _hoisted_9, [ + vue.createVNode( + _component_tiny_tooltip, + { + content: '\u5E2E\u52A9\u4E2D\u5FC3 ', + placement: 'top ', + manual: false, + modelValue: true, + class: 'tip-icon ', + style: { 'fill ': '#878f95 ', 'border-radius ': '0px ' } + }, + { + default: vue.withCtx(() => [ + _hoisted_10, + vue.createVNode(_component_tiny_icon_help_query, { style: { 'color ': '#ffffff ' } }) + ]), + _: 1 + } + ) + ]), + _hoisted_11, + vue.createVNode( + _component_tiny_popover, + { + width: 308, + title: '\u5F39\u6846\u6807\u9898 ', + trigger: 'manual ', + modelValue: true, + placement: 'bottom-end ', + 'popper-class ': 'team-list-pop ', + style: { 'border-radius ': '0px ' } + }, + { + reference: vue.withCtx(() => [ + vue.createElementVNode('div ', _hoisted_12, [ + vue.createElementVNode('div ', _hoisted_13, [ + _hoisted_14, + vue.createVNode(_component_tiny_icon_delta_down, { + style: { 'font-size ': '12px ', 'border-radius ': '0px ', 'color ': '#878f95 ' } + }) + ]) + ]) + ]), + default: vue.withCtx(() => [ + vue.createElementVNode('div ', _hoisted_15, [ + vue.createElementVNode('div ', _hoisted_16, [ + _hoisted_17, + vue.createElementVNode('div ', _hoisted_18, [ + (vue.openBlock(true), + vue.createElementBlock( + vue.Fragment, + null, + vue.renderList(_ctx.state.tenants, (item, index) => { + return ( + vue.openBlock(), + vue.createElementBlock( + 'div ', + { + class: vue.normalizeClass([ + 'team-list-item ', + { active: item.id === $props.tenant.id } + ]), + key: item.id, + style: { + 'display ': 'flex ', + 'align-items ': 'center ', + 'height ': '56px ', + 'border-radius ': '6px ', + 'background-color ': '#fff ', + 'cursor ': 'pointer ', + 'padding ': '8px 12px ', + 'box-sizing ': 'border-box ' + } + }, + [ + vue.createElementVNode('div ', _hoisted_19, [ + vue.createVNode(_component_tiny_icon_group, { style: { 'border-radius ': '0px ' } }) + ]), + vue.createElementVNode('span ', _hoisted_20, vue.toDisplayString(item.tenant_id), 1), + vue.createElementVNode('div ', _hoisted_21, [ + item.id === 1 + ? (vue.openBlock(), + vue.createBlock(_component_tiny_icon_yes, { + key: 0, + style: { 'font-size ': '20px ', 'color ': '#38acff ' } + })) + : vue.createCommentVNode('v-if ', true) + ]) + ], + 2 + ) + ) + }), + 128 + )) + ]) + ]) + ]) + ]), + _: 1 + } + ), + vue.createVNode(_component_tiny_popover, { + width: 200, + title: '\u5F39\u6846\u6807\u9898 ', + trigger: 'manual ', + modelValue: false, + 'append-to-body ': false + }), + vue.createVNode(_component_tiny_popover, { + width: 308, + title: '\u5F39\u6846\u6807\u9898 ', + trigger: 'click ', + modelValue: false, + placement: 'bottom-end ', + 'append-to-body ': false, + 'visible-arrow ': false, + 'popper-class ': 'team-list-pop ' + }), + _hoisted_22 + ]) + ]), + vue.createVNode(_component_tiny_popover, { + width: 200, + title: '\u5F39\u6846\u6807\u9898 ', + trigger: 'manual ', + modelValue: true + }), + vue.createVNode(_component_tiny_popover, { + width: 200, + title: '\u5F39\u6846\u6807\u9898 ', + trigger: 'manual ', + modelValue: false, + 'visible-arrow ': true + }) + ]) + ) + } + const block = /* @__PURE__ */ _export_sfc(_sfc_main, [ + ['render ', _sfc_render], + ['styles ', [_style_0]], + ['__scopeId ', 'data-v-b66e3972 '], + ['__file ', 'D:/tmp/buildground/buildground_1673597845904/src/block/generated/components/PortalHeader.vue '] + ]) + window.TinyLowcodeResource = window.TinyLowcodeResource || {} + const blockName = hyphenate('PortalHeader ') + block.blockId = 998 + block.blockVersion = '1.0.0 ' + if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } + } else { + block.links = { + 'VUE_APP_UI_LIB_FULL_STYLE_FILE_URL ': ['//localhost:9090/assets/css/0.1.20/index.css '] + }.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, tinyWebcomponentCore.defineCustomElement(block)) + } + return block +}) diff --git a/dl-flow-frontend/mockServer/assets/json/_bundle.json b/dl-flow-frontend/mockServer/assets/json/_bundle.json new file mode 100644 index 0000000..c5b2117 --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/json/_bundle.json @@ -0,0 +1,10471 @@ +{ + "data": { + "framework": "Vue", + "materials": { + "components": [ + { + "name": { + "zh_CN": "走马灯子项" + }, + "component": "TinyCarouselItem", + "icon": "carouselitem", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现。", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CarouselItem", + "version": "", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "幻灯片的名字,可用作 setActiveItem 的参数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "幻灯片的标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "indicator-position", + "label": { + "text": { + "zh_CN": "指示器的位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "outside", + "value": "outside" + }, + { + "label": "none", + "value": "none" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "走马灯" + }, + "component": "TinyCarousel", + "icon": "carousel", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现。", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Carousel", + "version": "", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "arrow", + "label": { + "text": { + "zh_CN": "切换箭头的显示时机" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "总是显示", + "value": "always" + }, + { + "label": "鼠标悬停时显示", + "value": "hover" + }, + { + "label": "从不显示", + "value": "never" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "autoplay", + "label": { + "text": { + "zh_CN": "是否自动切换" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "tabs", + "label": { + "text": { + "zh_CN": "选项卡" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "", + "cols": 12, + "bindState": false, + "widget": { + "component": "MetaContainer", + "props": {} + }, + "description": { + "zh_CN": "tabs" + }, + "labelPosition": "none" + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "走马灯的高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "indicator-position", + "label": { + "text": { + "zh_CN": "指示器的位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "走马灯外部", + "value": "outside" + }, + { + "label": "不显示", + "value": "none" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "initial-index", + "label": { + "text": { + "zh_CN": "初始状态激活的幻灯片的索引,从 0 开始 " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "interval", + "label": { + "text": { + "zh_CN": "自动切换的时间间隔,单位为毫秒" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "loop", + "label": { + "text": { + "zh_CN": "是否循环显示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "show-title", + "label": { + "text": { + "zh_CN": "是否显示标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "指示器的触发方式,默认为 hover" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "点击", + "value": "click" + }, + { + "label": "悬停", + "value": "hover" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "走马灯的类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "水平", + "value": "horizontal" + }, + { + "label": "垂直", + "value": "vertical" + }, + { + "label": "卡片", + "value": "card" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "clickCapture": false, + "isModal": false, + "nestingRule": { + "childWhitelist": ["TinyCarouselItem"], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "link", + "name": { + "zh_CN": "提示框" + }, + "component": "a", + "description": "链接", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "group": "component", + "priority": 7, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "children", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlText", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + }, + { + "property": "href", + "label": { + "text": { + "zh_CN": "跳转链接" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "链接" + } + }, + { + "property": "target", + "label": { + "text": { + "zh_CN": "页面目标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "当前页面", + "value": "_self" + }, + { + "label": "打开新页面", + "value": "_blank" + } + ] + } + }, + "description": { + "zh_CN": "链接" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ] + }, + "configure": { + "loop": true, + "condition": true, + "slots": [], + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [] + }, + "contextMenu": { + "actions": [], + "disable": [] + } + } + }, + { + "name": { + "zh_CN": "标题" + }, + "component": ["h1", "h2", "h3", "h4", "h5", "h6"], + "icon": "h16", + "description": "标题", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 20, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "children", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlText", + "props": { + "showRadioButton": true + } + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "段落" + }, + "component": "p", + "icon": "paragraph", + "description": "段落", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 30, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "children", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlText", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [] + }, + "contextMenu": { + "actions": [], + "disable": [] + } + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "component": "input", + "icon": "input", + "description": "输入框", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 40, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "checkbox", + "value": "checkbox" + }, + { + "label": "color", + "value": "color" + }, + { + "label": "date", + "value": "date" + }, + { + "label": "button", + "value": "button" + }, + { + "label": "email", + "value": "email" + }, + { + "label": "file", + "value": "file" + }, + { + "label": "hidden", + "value": "hidden" + }, + { + "label": "image", + "value": "image" + }, + { + "label": "month", + "value": "month" + }, + { + "label": "number", + "value": "number" + }, + { + "label": "password", + "value": "password" + }, + { + "label": "radio", + "value": "radio" + }, + { + "label": "range", + "value": "range" + }, + { + "label": "reset", + "value": "reset" + }, + { + "label": "search", + "value": "search" + }, + { + "label": "submit", + "value": "submit" + }, + { + "label": "text", + "value": "text" + }, + { + "label": "time", + "value": "time" + }, + { + "label": "week", + "value": "week" + }, + { + "label": "url", + "value": "url" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onChange": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "视频" + }, + "component": "video", + "icon": "video", + "description": "视频", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 50, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "src", + "label": { + "text": { + "zh_CN": "视频的 URL" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "视频播放器的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "视频播放器的高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "controls", + "label": { + "text": { + "zh_CN": "是否显示控件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "autoplay", + "label": { + "text": { + "zh_CN": "是否马上播放" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [] + }, + "contextMenu": { + "actions": [], + "disable": [] + } + } + }, + { + "icon": "Image", + "name": { + "zh_CN": "Img" + }, + "component": "Img", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 60, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "src", + "type": "string", + "defaultValue": "", + "bindState": true, + "label": { + "text": { + "zh_CN": "src路径" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": ["src"] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "button", + "name": { + "zh_CN": "Button" + }, + "component": "button", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 70, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "table", + "name": { + "zh_CN": "表格" + }, + "component": "table", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 80, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "width", + "label": { + "text": { + "zh_CN": "表格的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "border", + "label": { + "text": { + "zh_CN": "表格边框的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "td", + "name": { + "zh_CN": "表格单元格" + }, + "component": "td", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 90, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "colspan", + "label": { + "text": { + "zh_CN": "单元格可横跨的列数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "rowspan", + "label": { + "text": { + "zh_CN": "单元格可横跨的行数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "form", + "name": { + "zh_CN": "表单" + }, + "component": "form", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 100, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "表单的名称" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "action", + "label": { + "text": { + "zh_CN": "提交表单时向何处发送表单数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "method", + "label": { + "text": { + "zh_CN": "用于发送 form-data 的 HTTP 方法" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "get", + "value": "get" + }, + { + "label": "post", + "value": "post" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "label", + "name": { + "zh_CN": "表单标签" + }, + "component": "label", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 110, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "for", + "label": { + "text": { + "zh_CN": "label 绑定到哪个表单元素" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "form", + "label": { + "text": { + "zh_CN": "label 字段所属的一个或多个表单" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "name": { + "zh_CN": "按钮组" + }, + "component": "TinyButtonGroup", + "icon": "buttonGroup", + "description": "以按钮组的方式出现,常用于多项类似操作", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "ButtonGroup", + "version": "", + "destructuring": true + }, + "group": "component", + "category": "general", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "按钮组数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "组件大小" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "mini", + "value": "mini" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "medium", + "value": "medium" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "plain", + "label": { + "text": { + "zh_CN": "是否是朴素按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "row", + "name": { + "zh_CN": "row" + }, + "component": "TinyRow", + "description": "定义 Layout 的行配置信息", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Row", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 5, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "layout", + "label": { + "text": { + "zh_CN": "layout" + } + }, + "cols": 12, + "widget": { + "component": "MetaLayoutGrid", + "props": {} + }, + "description": { + "zh_CN": "layout" + }, + "labelPosition": "none" + }, + { + "property": "align", + "label": { + "text": { + "zh_CN": "align" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "middle", + "value": "middle" + }, + { + "label": "bottom", + "value": "bottom" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "flex", + "label": { + "text": { + "zh_CN": "flex" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "gutter", + "label": { + "text": { + "zh_CN": "gutter" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ] + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "form", + "name": { + "zh_CN": "表单" + }, + "component": "TinyForm", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Form", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 5, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label-width", + "label": { + "text": { + "zh_CN": "标签宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单中标签占位宽度,默认为 80px" + }, + "labelPosition": "left" + }, + { + "property": "inline", + "label": { + "text": { + "zh_CN": "行内布局" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "行内布局模式,默认为 false" + } + }, + { + "property": "label-align", + "label": { + "text": { + "zh_CN": "必填标识是否占位" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "必填标识 * 是否占位" + }, + "labelPosition": "left" + }, + { + "property": "label-suffix", + "label": { + "text": { + "zh_CN": "标签后缀" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单中标签后缀" + } + }, + { + "property": "label-position", + "label": { + "text": { + "zh_CN": "标签位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "right", + "value": "right" + }, + { + "label": "left ", + "value": "left " + }, + { + "label": "top", + "value": "top" + } + ] + } + }, + "description": { + "zh_CN": "表单中标签的布局位置" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "校验属性" + }, + "content": [ + { + "property": "model", + "label": { + "text": { + "zh_CN": "表单校验对象" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表单数据对象" + }, + "labelPosition": "left" + }, + { + "property": "rules", + "label": { + "text": { + "zh_CN": "校验规则" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表单验证规则" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onValidate": { + "label": { + "zh_CN": "表单项被校验后触发" + }, + "description": { + "zh_CN": "表单项被校验后触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "function", + "type": "Function", + "defaultValue": "(valid) => {}", + "description": { + "zh_CN": "校验回调函数" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onInput": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框输入的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "formitem", + "name": { + "zh_CN": "表单项" + }, + "component": "TinyFormItem", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "FormItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 12, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "label", + "label": { + "text": { + "zh_CN": "标签文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "标签", + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标签文本" + }, + "labelPosition": "left" + }, + { + "property": "prop", + "label": { + "text": { + "zh_CN": "校验字段" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的" + } + }, + { + "property": "required", + "label": { + "text": { + "zh_CN": "必填" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否必填" + }, + "labelPosition": "left" + } + ] + } + ], + "events": {}, + "slots": { + "label": { + "label": { + "zh_CN": "字段名" + }, + "description": { + "zh_CN": "自定义显示字段名称" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": ["TinyForm"], + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label", "rules"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "col", + "name": { + "zh_CN": "col" + }, + "component": "TinyCol", + "description": "列配置信息", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Col", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "span", + "label": { + "text": { + "zh_CN": "栅格列格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "整行", + "value": 12 + }, + { + "label": "6格", + "value": 6 + }, + { + "label": "4格", + "value": 4 + }, + { + "label": "3格", + "value": 3 + }, + { + "label": "1格", + "value": 1 + } + ] + } + }, + "description": { + "zh_CN": "当一行分为12格时,一列可占位多少格" + } + }, + { + "property": "move", + "label": { + "text": { + "zh_CN": "栅格左右移动格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": -12, + "max": 12 + } + }, + "description": { + "zh_CN": "栅格左右移动格数(正数向右,负数向左)" + } + }, + { + "property": "no", + "label": { + "text": { + "zh_CN": "排序编号" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "max": 12 + } + }, + "description": { + "zh_CN": "排序编号(row中启用order生效)" + } + }, + { + "property": "offset", + "label": { + "text": { + "zh_CN": "间隔格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 0, + "max": 12 + } + }, + "description": { + "zh_CN": "栅格左侧的间隔格数" + } + }, + { + "property": "xs", + "label": { + "text": { + "zh_CN": "超小屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "<768px 响应式栅格数" + } + }, + { + "property": "sm", + "label": { + "text": { + "zh_CN": "小屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥768px 响应式栅格数" + } + }, + { + "property": "md", + "label": { + "text": { + "zh_CN": "中屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥992px 响应式栅格数" + } + }, + { + "property": "lg", + "label": { + "text": { + "zh_CN": "大屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥1200px 响应式栅格数" + } + }, + { + "property": "xl", + "label": { + "text": { + "zh_CN": "超大屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥1920px 响应式栅格数" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label", "rules"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "按钮" + }, + "component": "TinyButton", + "icon": "button", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Button", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "type": "string", + "defaultValue": "按钮文案", + "label": { + "text": { + "zh_CN": "按钮文字" + } + }, + "cols": 12, + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "type": "select", + "label": { + "text": { + "zh_CN": "大小" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "medium", + "value": "medium" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "mini", + "value": "mini" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "primary", + "value": "primary" + }, + { + "label": "success", + "value": "success" + }, + { + "label": "info", + "value": "info" + }, + { + "label": "warning", + "value": "warning" + }, + { + "label": "danger", + "value": "danger" + }, + { + "label": "text", + "value": "text" + } + ] + } + }, + "description": { + "zh_CN": "设置不同的主题样式" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "round", + "label": { + "text": { + "zh_CN": "圆角" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否圆角按钮" + }, + "labelPosition": "left" + }, + { + "property": "plain", + "label": { + "text": { + "zh_CN": "朴素按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否为朴素按钮" + }, + "labelPosition": "left" + }, + { + "property": "reset-time", + "label": { + "text": { + "zh_CN": "禁用时间" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "设置禁用时间,防止重复提交,单位毫秒" + } + }, + { + "property": "circle", + "label": { + "text": { + "zh_CN": "圆角" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否圆形按钮" + }, + "labelPosition": "left" + }, + { + "property": "autofocus", + "label": { + "text": { + "zh_CN": "聚焦" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否默认聚焦" + }, + "labelPosition": "left" + }, + { + "property": "loading", + "label": { + "text": { + "zh_CN": "加载中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否展示位加载中样式" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "按钮被点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "component": "TinyInput", + "icon": "input", + "description": "通过鼠标或键盘输入字符", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Input", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "textarea", + "value": "textarea" + }, + { + "label": "text", + "value": "text" + }, + { + "label": "password", + "value": "password" + } + ] + } + }, + "description": { + "zh_CN": "设置input框的type属性" + } + }, + { + "property": "rows", + "label": { + "text": { + "zh_CN": "行数" + } + }, + "widget": { + "component": "MetaNumber" + }, + "description": { + "zh_CN": "输入框行数,只对 type='textarea' 有效" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "medium", + "value": "medium" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "mini", + "value": "mini" + } + ] + } + }, + "description": { + "zh_CN": "输入框尺寸。该属性的可选值为 medium / small / mini" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "maxlength", + "label": { + "text": { + "zh_CN": "最大长度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "设置 input 框的maxLength" + }, + "labelPosition": "left" + }, + { + "property": "autofocus", + "label": { + "text": { + "zh_CN": "聚焦" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "自动获取焦点" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值改变时触发" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框改变后的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onInput": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框输入的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "slots": { + "prefix": { + "label": { + "zh_CN": "前置内容" + } + }, + "suffix": { + "label": { + "zh_CN": "后置内容" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "radio", + "name": { + "zh_CN": "单选" + }, + "component": "TinyRadio", + "description": "用于配置不同场景的选项,在一组备选项中进行单选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Radio", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 3, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label", + "label": { + "text": { + "zh_CN": "单选框的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "label": { + "zh_CN": "其他" + }, + "description": { + "zh_CN": "" + }, + "content": [ + { + "property": "border", + "label": { + "text": { + "zh_CN": "显示边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "单选框的尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "name", + "label": { + "text": { + "zh_CN": "原生 name 属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值变化事件" + }, + "description": { + "zh_CN": "绑定值变化时触发的事件" + } + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["visible", "width"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "select", + "name": { + "zh_CN": "下拉框" + }, + "component": "TinySelect", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Select", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 8, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "searchable", + "label": { + "text": { + "zh_CN": "下拉面板可搜索" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "下拉面板是否可搜索" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "下拉数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "配置 Select 下拉数据项" + }, + "labelPosition": "left" + }, + { + "property": "multiple", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许输入框输入或选择多个项" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "multiple-limit", + "label": { + "text": { + "zh_CN": "最大可选值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "多选时用户最多可以选择的项目数,为 0 则不限制" + }, + "labelPosition": "left" + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "下拉框的类名" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置下拉框自定义的类名" + }, + "labelPosition": "left" + }, + { + "property": "collapse-tags", + "label": { + "text": { + "zh_CN": "多选展示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "多选时是否将选中值按文字的形式展示" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值改变时触发" + }, + "description": { + "zh_CN": "在下拉框值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "下拉框选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onRemoveTag": { + "label": { + "zh_CN": "多选模式下移除tag时触发" + }, + "description": { + "zh_CN": "多选模式下移除tag时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "被移除Tag对应数据项的值字段" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + }, + "onBeforeMount": "console.log('table on load'); this.options = source.data" + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["multiple", "options"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "switch", + "name": { + "zh_CN": "开关" + }, + "component": "TinySwitch", + "description": "Switch 在两种状态间切换选择", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Switch", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 9, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "绑定默认值" + } + }, + { + "property": "true-value", + "label": { + "text": { + "zh_CN": "打开时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置打开时的值(Boolean / String / Number)" + }, + "labelPosition": "left" + }, + { + "property": "false-value", + "label": { + "text": { + "zh_CN": "关闭时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置关闭时的值(Boolean / String / Number)" + }, + "labelPosition": "left" + }, + { + "property": "mini", + "label": { + "text": { + "zh_CN": "迷你尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示为 mini 模式" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "按钮被点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "开关的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的开关状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "search", + "name": { + "zh_CN": "搜索框" + }, + "component": "TinySearch", + "description": "指定条件对象进行搜索数据", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Search", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "默认值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框内的默认搜索值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本 " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框内的提示占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清空按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置显示清空图标按钮" + }, + "labelPosition": "left" + }, + { + "property": "isEnterSearch", + "label": { + "text": { + "zh_CN": "是否Enter键触发search事件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否在按下键盘Enter键的时候触发search事件" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他配置" + }, + "content": [ + { + "property": "mini", + "label": { + "text": { + "zh_CN": "迷你尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "迷你模式,配置为true时,搜索默认显示为一个带图标的圆形按钮,点击后展开" + }, + "labelPosition": "left" + }, + { + "property": "transparent", + "label": { + "text": { + "zh_CN": "透明模式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "配置为true时,边框变为透明且收缩后半透明显示,一般用在带有背景的场景,默认 false" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "输入完成时触发" + }, + "description": { + "zh_CN": "在 input 框中输入完成时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "搜索类型,默认值为 {} " + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前input框中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onSearch": { + "label": { + "zh_CN": "点击搜索按钮时触发" + }, + "description": { + "zh_CN": "展开状态点击搜索按钮时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "搜索类型,默认值为 {} " + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前input框中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["clearable", "mini"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "checkbox", + "name": { + "zh_CN": "复选框" + }, + "component": "TinyCheckbox", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Checkbox", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 4, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "checked", + "label": { + "text": { + "zh_CN": "勾选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当前是否勾选" + }, + "labelPosition": "left" + }, + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "复选框的文本" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "border", + "label": { + "text": { + "zh_CN": "边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示边框" + } + }, + { + "property": "false-label", + "label": { + "text": { + "zh_CN": "未选中的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "没有选中时的值" + } + }, + { + "property": "true-label", + "label": { + "text": { + "zh_CN": "选择时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "选中时的值" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["border", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "checkboxbutton", + "name": { + "zh_CN": "复选按钮" + }, + "component": "TinyCheckboxButton", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CheckboxButton", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "checked", + "label": { + "text": { + "zh_CN": "勾选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当前是否勾选" + }, + "labelPosition": "left" + }, + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "按钮文本" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "array", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "checkboxgroup", + "name": { + "zh_CN": "复选按钮组" + }, + "component": "TinyCheckboxGroup", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CheckboxGroup", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "dataType": "Array" + } + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "数据列表" + } + }, + "defaultValue": [ + { + "label": "标签2" + }, + { + "label": "标签2" + } + ], + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "checkbox组件列表" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "button", + "value": "button" + }, + { + "label": "checkbox", + "value": "checkbox" + } + ] + } + }, + "description": { + "zh_CN": "checkbox组件类型(button/checkbox),该属性的默认值为 checkbox,配合 options 属性一起使用" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "array", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "type"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "dialogbox", + "name": { + "zh_CN": "对话框" + }, + "component": "TinyDialogBox", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作。", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DialogBox", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 4, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "弹出框标题" + }, + "labelPosition": "left" + }, + { + "property": "visible", + "label": { + "text": { + "zh_CN": "显示与隐藏" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "控制弹出框显示与关闭" + }, + "labelPosition": "left" + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "弹出框的宽度" + }, + "labelPosition": "left" + }, + { + "property": "draggable", + "label": { + "text": { + "zh_CN": "可拖拽" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否开启弹窗的拖拽功能,默认值为 false 。" + } + }, + { + "property": "center", + "label": { + "text": { + "zh_CN": "居中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "弹出框的头部与底部内容会自动居中" + }, + "labelPosition": "left" + }, + { + "property": "dialog-class", + "label": { + "text": { + "zh_CN": "自定义类" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "自定义配置弹窗类名" + }, + "labelPosition": "left" + }, + { + "property": "append-to-body", + "label": { + "text": { + "zh_CN": "插入到 Body " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "DialogBox 本身是否插入到 body 上,嵌套的 Dialog 必须指定该属性并赋值为 true" + }, + "labelPosition": "left" + }, + { + "property": "show-close", + "label": { + "text": { + "zh_CN": "关闭按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示关闭按钮,默认值为 true 。" + } + } + ] + } + ], + "selector": ".TinyDialogBox", + "events": { + "onClose": { + "label": { + "zh_CN": "关闭弹窗时触发" + }, + "description": { + "zh_CN": "Dialog 关闭的回调" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:visible": { + "label": { + "zh_CN": "双向绑定的状态改变时触发" + }, + "description": { + "zh_CN": "显示或隐藏的状态值,发生改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的显示或隐藏的状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + }, + "slots": { + "title": { + "label": { + "zh_CN": "标题区" + }, + "description": { + "zh_CN": "Dialog 标题区的内容" + } + }, + "footer": { + "label": { + "zh_CN": "按钮操作区" + }, + "description": { + "zh_CN": "Dialog 按钮操作区的内容" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": true, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": ".tiny-dialog-box", + "shortcuts": { + "properties": ["visible", "width"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tabs", + "name": { + "zh_CN": "标签页" + }, + "component": "TinyTabs", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tabs", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 10, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "showEditIcon", + "label": { + "text": { + "zh_CN": "显示编辑ICON " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示标题后编辑 ICON" + }, + "labelPosition": "left" + }, + { + "property": "tabs", + "label": { + "text": { + "zh_CN": "选项卡" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "", + "cols": 12, + "bindState": false, + "widget": { + "component": "MetaContainer", + "props": {} + }, + "description": { + "zh_CN": "tabs" + }, + "labelPosition": "none" + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "绑定值,选中选项卡的 name" + }, + "labelPosition": "left" + }, + { + "property": "with-add", + "label": { + "text": { + "zh_CN": "可新增" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "标签是否可增加" + }, + "labelPosition": "left" + }, + { + "property": "with-close", + "label": { + "text": { + "zh_CN": "可关闭" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "标签是否可关闭" + }, + "labelPosition": "left" + }, + { + "property": "tab-style", + "label": { + "text": { + "zh_CN": "标签页样式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "card", + "value": "card" + }, + { + "label": "border-card", + "value": "border-card" + } + ] + } + }, + "description": { + "zh_CN": "标签页样式" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击页签时触发事件" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "component", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前点击的页签对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onEdit": { + "label": { + "zh_CN": "点击新增按钮或关闭按钮或者编辑按钮后触发" + }, + "description": { + "zh_CN": "点击新增按钮或关闭按钮或者编辑按钮后触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "tab", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前操作的页签对象" + } + }, + { + "name": "type", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前操作的类型(remove || add || edit)" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClose": { + "label": { + "zh_CN": "关闭页签时触发" + }, + "description": { + "zh_CN": "关闭页签时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "name", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "页签名称" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "clickCapture": false, + "isModal": false, + "nestingRule": { + "childWhitelist": ["TinyTabItem"], + "parentWhitelist": [], + "descendantBlacklist": [], + "ancestorWhitelist": [] + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["size", "tab-style"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tabitem", + "name": { + "zh_CN": "tab页签" + }, + "component": "TinyTabItem", + "description": "tab 标签页", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TinyTabItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "唯一表示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "唯一表示" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标题" + } + } + ] + } + ], + "events": {}, + "slots": { + "title": { + "label": { + "zh_CN": "标题" + }, + "description": { + "zh_CN": "自定义标题" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": ["TinyTab"], + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["name", "title"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "breadcrumb", + "name": { + "zh_CN": "面包屑" + }, + "component": "TinyBreadcrumb", + "description": "告诉访问者他们目前在网站中的位置以及如何返回", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Select", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "separator", + "label": { + "text": { + "zh_CN": "分隔符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "自定义分隔符" + }, + "labelPosition": "left" + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "options" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "textField", + "label": { + "text": { + "zh_CN": "textField" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onSelect": { + "label": { + "zh_CN": "选择 breadcrumb 时触发" + }, + "description": { + "zh_CN": "选择 breadcrumb 时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "clickCapture": false, + "isModal": false, + "nestingRule": { + "childWhitelist": ["TinyBreadcrumbItem"], + "parentWhitelist": [], + "descendantBlacklist": [], + "ancestorWhitelist": [] + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["separator"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "breadcrumb", + "name": { + "zh_CN": "面包屑项" + }, + "component": "TinyBreadcrumbItem", + "description": "", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TinyBreadcrumbItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "to", + "label": { + "text": { + "zh_CN": "路由路径" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "面包屑项" + } + } + ] + } + ], + "slots": { + "default": { + "label": { + "zh_CN": "面包屑项标签" + }, + "description": { + "zh_CN": "面包屑项" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": ["TinyBreadcrumb"], + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["to"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "collapse", + "name": { + "zh_CN": "折叠面板" + }, + "component": "TinyCollapse", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Collapse", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 3, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "当前激活的面板" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定当前激活的面板" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "激活面板改变时触发" + }, + "description": { + "zh_CN": "当前激活面板改变时触发(如果是手风琴模式,参数 activeNames 类型为string,否则为array)" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前激活面板的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前激活面板的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "collapseitem", + "name": { + "zh_CN": "折叠面板项" + }, + "component": "TinyCollapseItem", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CollapseItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "唯一标志符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "唯一标志符;String | Number" + }, + "labelPosition": "left" + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "面板标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "面板标题" + }, + "labelPosition": "left" + } + ] + } + ], + "events": {}, + "slots": { + "title": { + "label": { + "zh_CN": "标题" + }, + "description": { + "zh_CN": "自定义标题" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "grid", + "name": { + "zh_CN": "表格" + }, + "component": "TinyGrid", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Grid", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础属性" + }, + "description": { + "zh_CN": "基础属性" + }, + "collapse": { + "number": 15, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "表格数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "onChange": "this.delProp('fetchData')", + "description": { + "zh_CN": "设置表格的数据" + } + }, + { + "property": "columns", + "label": { + "text": { + "zh_CN": "表格列" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "properties": [ + { + "label": { + "zh_CN": "默认分组" + }, + "content": [ + { + "property": "title", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列标题" + } + }, + "widget": { + "component": "MetaBindI18n", + "props": {} + } + }, + { + "property": "field", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列键值" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "sortable", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否排序" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "width", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列宽" + } + }, + "widget": { + "component": "MetaNumber", + "props": {} + } + }, + { + "property": "formatText", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "内置渲染器" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "整数", + "value": "integer" + }, + { + "label": "小数", + "value": "number" + }, + { + "label": "金额", + "value": "money" + }, + { + "label": "百分比", + "value": "rate" + }, + { + "label": "布尔", + "value": "boole" + }, + { + "label": "年月日", + "value": "date" + }, + { + "label": "年月日时分", + "value": "dateTime" + }, + { + "label": "时间", + "value": "time" + }, + { + "label": "省略", + "value": "ellipsis" + } + ] + } + } + }, + { + "property": "renderer", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "dataType": "JSFunction" + } + } + }, + { + "property": "slots", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "插槽" + } + }, + "labelPosition": "none", + "widget": { + "component": "MetaJsSlot", + "props": { + "slots": ["header", "default"] + } + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "列类型" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "索引列", + "value": "index" + }, + { + "label": "单选列", + "value": "radio" + }, + { + "label": "多选列", + "value": "selection" + }, + { + "label": "展开列", + "value": "expand" + } + ], + "clearable": true + } + }, + "description": { + "zh_CN": "设置内置列的类型,该属性的可选值为 index(序号)/ selection(复选框)/ radio(单选框)/ expand(展开行)" + }, + "labelPosition": "left" + }, + { + "property": "editor", + "label": { + "text": { + "zh_CN": "编辑配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "单元格编辑渲染配置项,也可以是函数 Function(h, params)" + }, + "labelPosition": "left" + }, + { + "property": "filter", + "label": { + "text": { + "zh_CN": "筛选配置" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息" + } + }, + { + "property": "showOverflow", + "label": { + "text": { + "zh_CN": "内容超出部分省略号配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "只显示省略号", + "value": "ellipsis" + }, + { + "label": "显示为原生 title", + "value": "title" + }, + { + "label": "显示为 tooltip 提示", + "value": "tooltip" + } + ], + "clearable": true + } + }, + "description": { + "zh_CN": "设置内置列的内容超出部分显示省略号配置,该属性的可选值为 ellipsis(只显示省略号)/ title(显示为原生 title)/ tooltip(显示为 tooltip 提示)" + }, + "labelPosition": "left" + } + ] + } + ], + "widget": { + "component": "MetaArrayItem", + "props": { + "type": "object", + "textField": "title", + "language": "json", + "buttonText": "编辑列配置", + "title": "编辑列配置", + "expand": true + } + }, + "description": { + "zh_CN": "表格列的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "fetchData", + "label": { + "text": { + "zh_CN": "服务端数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "onChange": "this.delProp('data')", + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "name": "fetchData", + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "服务端数据查询方法" + } + }, + { + "property": "pager", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "defaultValue": { + "attrs": { + "currentPage": 1 + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "name": "pager", + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "分页配置" + } + }, + { + "property": "resizable", + "label": { + "text": { + "zh_CN": "调整列宽" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许调整列宽" + }, + "labelPosition": "left" + }, + { + "property": "row-id", + "label": { + "text": { + "zh_CN": "行数据唯一标识的字段名" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "placeholder": "比如:id" + } + }, + "description": { + "zh_CN": "行数据唯一标识的字段名" + }, + "labelPosition": "left" + }, + { + "property": "select-config", + "label": { + "text": { + "zh_CN": "复选框配置" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "表格行数据复选框配置项" + }, + "labelPosition": "left" + }, + { + "property": "edit-rules", + "label": { + "text": { + "zh_CN": "校验规则" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表格校验规则配置项" + }, + "labelPosition": "left" + }, + { + "property": "edit-config", + "label": { + "text": { + "zh_CN": "编辑配置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表格编辑配置项" + } + }, + { + "property": "expand-config", + "label": { + "text": { + "zh_CN": "复选框配置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "复选框配置项" + }, + "labelPosition": "left" + }, + { + "property": "sortable", + "label": { + "text": { + "zh_CN": "可排序" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许列数据排序。默认为 true 可排序" + }, + "labelPosition": "left" + } + ] + }, + { + "label": { + "zh_CN": "其他属性" + }, + "description": { + "zh_CN": "其他属性" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "auto-resize", + "label": { + "text": { + "zh_CN": "可排序" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许列数据排序。默认为 true 可排序" + }, + "labelPosition": "left" + }, + { + "property": "border", + "label": { + "text": { + "zh_CN": "边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否带有纵向边框" + }, + "labelPosition": "left" + }, + { + "property": "seq-serial", + "label": { + "text": { + "zh_CN": "行号连续" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置行序号是否连续,开启分页时有效,该属性的默认值为 false" + }, + "labelPosition": "left" + }, + { + "property": "highlight-current-row", + "label": { + "text": { + "zh_CN": "高亮当前行" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "高亮当前行" + }, + "labelPosition": "left" + }, + { + "property": "highlight-hover-row", + "label": { + "text": { + "zh_CN": "hover 时候高亮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "鼠标移到行是否要高亮显示" + }, + "labelPosition": "left" + }, + { + "property": "row-class-name", + "label": { + "text": { + "zh_CN": "hover 高亮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "给行附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex})" + }, + "labelPosition": "left" + }, + { + "property": "max-height", + "label": { + "text": { + "zh_CN": "最大高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置表格内容区域(不含表格头部,底部)的最大高度。" + }, + "labelPosition": "left" + }, + { + "property": "row-span", + "label": { + "text": { + "zh_CN": "行合并" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置行合并,该属性仅适用于普通表格,不可与 tree-config 同时使用" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onFilterChange": { + "label": { + "zh_CN": "筛选条件改变时触发改事件" + }, + "description": { + "zh_CN": "配置 remote-filter 开启服务端过滤,服务端过滤会调用表格 fetch-data 进行查询,filter-change 服务端过滤后触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "{$table,filters} 包含 table 实例对象和过滤条件的对象" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onSortChange": { + "label": { + "zh_CN": "点击列头,执行数据排序前触发的事件" + }, + "description": { + "zh_CN": "配置 remote-filter 开启服务端过滤,服务端过滤会调用表格 fetch-data 进行查询,filter-change 服务端过滤后触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "{$table,filters} 包含 table 实例对象和过滤条件的对象" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onSelectAll": { + "label": { + "zh_CN": "当手动勾选全选时触发的事件" + }, + "description": { + "zh_CN": "只对 type=selection 有效,当手动勾选全选时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " 包含 table 实例对象" + } + }, + { + "name": "checked", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "勾选状态" + } + }, + { + "name": "selction", + "type": "Array", + "defaultValue": "", + "description": { + "zh_CN": "选中的表格数据数组" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onSelectChange": { + "label": { + "zh_CN": "手动勾选并且值发生改变时触发的事件" + }, + "description": { + "zh_CN": "只对 type=selection 有效,当手动勾选并且值发生改变时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " table 实例对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " 原生 Event" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onToggleExpandChange": { + "label": { + "zh_CN": "当行展开或收起时会触发该事件" + }, + "description": { + "zh_CN": "当行展开或收起时会触发该事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "{$table,row,rowIndex} 包含 table 实例对象和当前行数据的对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " 原生 Event" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onCurrentChange": { + "label": { + "zh_CN": "行点击时触发" + }, + "description": { + "zh_CN": "行点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": ["sortable", "columns"] + }, + "contentMenu": { + "actions": ["create symbol"] + }, + "onBeforeMount": "console.log('table on load'); this.pager = source.pager; this.fetchData = source.fetchData; this.data = source.data ;this.columns = source.columns" + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["sortable", "columns"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "分页" + }, + "component": "TinyPager", + "icon": "pager", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Pager", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "currentPage", + "label": { + "text": { + "zh_CN": "当前页数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "当前页数,支持 .sync 修饰符" + }, + "labelPosition": "left" + }, + { + "property": "pageSize", + "label": { + "text": { + "zh_CN": "每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "每页显示条目个数" + }, + "labelPosition": "left" + }, + { + "property": "pageSizes", + "label": { + "text": { + "zh_CN": "可选每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置可选择的每页显示条数" + } + }, + { + "property": "total", + "label": { + "text": { + "zh_CN": "总条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "数据总条数" + }, + "labelPosition": "left" + }, + { + "property": "layout", + "label": { + "text": { + "zh_CN": "布局" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "defaultValue": "total,sizes,prev, pager, next", + "widget": { + "component": "MetaInput", + "props": { + "type": "textarea" + } + }, + "description": { + "zh_CN": "组件布局,子组件名用逗号分隔" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onCurrentChange ": { + "label": { + "zh_CN": "切换页码时触发" + }, + "description": { + "zh_CN": "切换页码时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前页的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onPrevClick ": { + "label": { + "zh_CN": "点击上一页按钮时触发" + }, + "description": { + "zh_CN": "点击上一页按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "page", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页的页码值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onNextClick": { + "label": { + "zh_CN": "点击下一页按钮时触发" + }, + "description": { + "zh_CN": "点击上一页按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "page", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页的页码值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["currentPage", "total"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "弹出编辑" + }, + "component": "TinyPopeditor", + "icon": "popEditor", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "PopEditor", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 6, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "show-clear-btn", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板的宽度(单位像素)" + }, + "labelPosition": "left" + }, + { + "property": "conditions", + "label": { + "text": { + "zh_CN": "过滤条件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "当弹出面板配置的是表格时,设置弹出面板中的过滤条件" + }, + "labelPosition": "left" + }, + { + "property": "grid-op", + "label": { + "text": { + "zh_CN": "表格配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板中表格组件的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "pager-op", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置弹出编辑框中分页配置" + }, + "labelPosition": "left" + }, + { + "property": "multi", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板中的数据是否可多选" + }, + "labelPosition": "left" + }, + { + "property": "show-pager", + "label": { + "text": { + "zh_CN": "启用分页" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当 popseletor 为 grid 时才能生效,配置为 true 后还需配置 pagerOp 属性" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "选中值改变时触发" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前选中项的值" + } + }, + { + "name": "value", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中对象" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClose": { + "label": { + "zh_CN": "弹框关闭时触发的事件" + }, + "description": { + "zh_CN": "弹框关闭时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onPageChange": { + "label": { + "zh_CN": "分页切换事件" + }, + "description": { + "zh_CN": "表格模式下分页切换事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页码数" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["modelValue", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tree", + "name": { + "zh_CN": "树" + }, + "component": "TinyTree", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tree", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 12, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "show-checkbox", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置接口是否可以多选" + }, + "labelPosition": "left" + }, + { + "property": "data", + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": [ + { + "label": "一级 1", + "children": [ + { + "label": "二级 1-1" + } + ] + } + ], + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "可配置静态数据源和动态数据源" + } + }, + { + "property": "node-key", + "label": { + "text": { + "zh_CN": "唯一标识" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "节点唯一标识属性名称" + }, + "labelPosition": "left" + }, + { + "property": "icon-trigger-click-node", + "label": { + "text": { + "zh_CN": "触发NodeClick 事件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "点击图标展开节点时是否触发 node-click 事件" + }, + "labelPosition": "left" + }, + { + "property": "expand-icon", + "label": { + "text": { + "zh_CN": "展开图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点展开图标" + }, + "labelPosition": "left" + }, + { + "property": "shrink-icon", + "label": { + "text": { + "zh_CN": "收缩图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点收缩的图标" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "check-on-click-node", + "label": { + "text": { + "zh_CN": "点击节点选中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点" + }, + "labelPosition": "left" + }, + { + "property": "filter-node-method", + "label": { + "text": { + "zh_CN": "筛选函数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点筛选函数" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onCheck": { + "label": { + "zh_CN": "勾选节点后的事件" + }, + "description": { + "zh_CN": "勾选节点后的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中节点信息" + } + }, + { + "name": "currentNode", + "type": "object", + "defaultValue": "", + "description": { + "zh_CN": "树组件目前的选中状态信息,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onNodeClick": { + "label": { + "zh_CN": "点击节点后的事件" + }, + "description": { + "zh_CN": "点击节点后的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中节点信息" + } + }, + { + "name": "node", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "树组件目前的选中状态信息,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性" + } + }, + { + "name": "vm", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "树组件实例" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["data", "show-checkbox"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "timeline", + "name": { + "zh_CN": "时间线" + }, + "component": "TinyTimeLine", + "description": "TimeLine 时间线", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TimeLine", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 3, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "horizontal", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "水平布局" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "节点和文字横向布局" + } + }, + { + "property": "vertical", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "垂直布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "垂直布局" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "节点和文字垂直布局" + } + }, + { + "property": "active", + "label": { + "text": { + "zh_CN": "选中值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "步骤条的选中步骤值" + }, + "labelPosition": "left" + }, + { + "property": "data", + "label": { + "text": { + "zh_CN": "数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": [ + { + "name": "配置基本信息", + "status": "ready" + }, + { + "name": "配置报价", + "status": "wait" + }, + { + "name": "完成报价", + "status": "wait" + } + ], + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "时间线步骤条数据" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "节点的点击时触发" + }, + "description": { + "zh_CN": "节点的点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "点击节点的下标" + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前节点对象:{ name: 节点名称, time: 时间 }" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["active", "data"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tooltip", + "name": { + "zh_CN": "文字提示框" + }, + "component": "TinyTooltip", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tooltip", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 11, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 20, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "placement", + "label": { + "text": { + "zh_CN": "提示位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + }, + { + "label": "left", + "value": "left" + }, + { + "label": "left-start", + "value": "left-start" + }, + { + "label": "left-end", + "value": "left-end" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "right-start", + "value": "right-start" + }, + { + "label": "right-end", + "value": "right-end" + } + ] + } + }, + "description": { + "zh_CN": "Tooltip 的出现位置" + }, + "labelPosition": "left" + }, + { + "property": "content", + "label": { + "text": { + "zh_CN": "内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "提示信息", + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot#content 传入 DOM" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "是否可见" + } + }, + "defaultValue": true, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "状态是否可见" + } + }, + { + "property": "manual", + "label": { + "text": { + "zh_CN": "手动控制" + } + }, + "defaultValue": true, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "手动控制模式,设置为 true 后,mouseenter 和 mouseleave 事件将不会生效" + } + } + ] + } + ], + "events": {}, + "slots": { + "content": { + "label": { + "zh_CN": "提示内容" + }, + "description": { + "zh_CN": "自定义提示内容" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "isPopper": true, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "content"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "popover", + "name": { + "zh_CN": "提示框" + }, + "component": "TinyPopover", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Popover", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 7, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "双向绑定,手动控制是否可见的状态值" + }, + "labelPosition": "left" + }, + { + "property": "placement", + "label": { + "text": { + "zh_CN": "位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + }, + { + "label": "left", + "value": "left" + }, + { + "label": "left-start", + "value": "left-start" + }, + { + "label": "left-end", + "value": "left-end" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "right-start", + "value": "right-start" + }, + { + "label": "right-end", + "value": "right-end" + } + ] + } + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "left" + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "触发方式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "click", + "value": "click" + }, + { + "label": "focus", + "value": "focus" + }, + { + "label": "hover", + "value": "hover" + }, + { + "label": "manual", + "value": "manual" + } + ] + } + }, + "description": { + "zh_CN": "触发方式,该属性的可选值为 click / focus / hover / manual,该属性的默认值为 click" + } + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "自定义类" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "为 popper 添加类名" + }, + "labelPosition": "left" + }, + { + "property": "visible-arrow", + "label": { + "text": { + "zh_CN": "显示箭头" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示 Tooltip 箭头" + } + }, + { + "property": "append-to-body", + "label": { + "text": { + "zh_CN": "添加到body上" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "Popover弹窗是否添加到body上" + } + }, + { + "property": "arrow-offset", + "label": { + "text": { + "zh_CN": "箭头的位置偏移" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "箭头的位置偏移,该属性的默认值为 0" + } + }, + { + "property": "close-delay", + "label": { + "text": { + "zh_CN": "隐藏延迟" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "触发方式为 hover 时的隐藏延迟,单位为毫秒" + } + }, + { + "property": "content", + "label": { + "text": { + "zh_CN": "显示的内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot 传入 DOM" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "Popover 是否可用" + } + }, + { + "property": "offset", + "label": { + "text": { + "zh_CN": "位置偏移量" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "出现位置的偏移量" + } + }, + { + "property": "open-delay", + "label": { + "text": { + "zh_CN": "显示延迟" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "触发方式为 hover 时的显示延迟,单位为毫秒" + } + }, + { + "property": "popper-options", + "label": { + "text": { + "zh_CN": "popper.js的参数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "popper.js 的参数" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标题" + } + }, + { + "property": "transform-origin", + "label": { + "text": { + "zh_CN": "旋转中心点" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "组件的旋转中心点,组件的旋转中心点" + } + }, + { + "property": "transition", + "label": { + "text": { + "zh_CN": "定义渐变动画" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "该属性的默认值为 fade-in-linear" + } + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "宽度" + } + } + ] + } + ], + "events": { + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "手动控制是否可见的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的可见状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "isPopper": true, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["visible", "width"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + } + ], + "blocks": [], + "snippets": [ + { + "group": "html", + "children": [ + { + "name": { + "zh_CN": "段落" + }, + "icon": "paragraph", + "screenshot": "", + "snippetName": "p", + "schema": { + "componentName": "p", + "children": "TinyEngine 前端可视化设计器致力于通过友好的用户交互提升业务应用的开发效率。" + } + }, + { + "name": { + "zh_CN": "链接" + }, + "icon": "link", + "screenshot": "", + "snippetName": "a", + "schema": { + "componentName": "a", + "children": "链接" + } + }, + { + "name": { + "zh_CN": "分隔线" + }, + "icon": "hr", + "screenshot": "", + "snippetName": "hr", + "schema": {} + }, + { + "name": { + "zh_CN": "标题" + }, + "icon": "h16", + "screenshot": "", + "snippetName": "h1", + "schema": { + "componentName": "h1", + "props": {}, + "children": "Heading" + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "icon": "input", + "screenshot": "", + "snippetName": "input", + "schema": { + "componentName": "input", + "props": { + "type": "text", + "placeholder": "请输入" + } + } + }, + { + "name": { + "zh_CN": "视频" + }, + "icon": "video", + "screenshot": "", + "snippetName": "video", + "schema": { + "componentName": "video", + "props": { + "src": "img/webNova.jpg", + "width": "200", + "height": "100", + "style": "border:1px solid #ccc" + } + } + }, + { + "name": { + "zh_CN": "图片" + }, + "icon": "Image", + "screenshot": "", + "snippetName": "img", + "schema": { + "componentName": "img", + "props": { + "src": "img/webNova.jpg", + "width": "200", + "height": "100" + } + } + }, + { + "name": { + "zh_CN": "按钮" + }, + "icon": "button", + "screenshot": "", + "snippetName": "button", + "schema": { + "componentName": "button", + "props": {}, + "children": [ + { + "componentName": "Text", + "props": { + "text": "按钮文案" + } + } + ] + } + }, + { + "name": { + "zh_CN": "表格" + }, + "icon": "table", + "screenshot": "", + "snippetName": "table", + "schema": { + "componentName": "table", + "props": { + "border": "1" + }, + "children": [ + { + "componentName": "tr", + "children": [ + { + "componentName": "td", + "children": "Month" + }, + { + "componentName": "td", + "children": "Savings" + } + ] + }, + { + "componentName": "tr", + "children": [ + { + "componentName": "td", + "children": "January" + }, + { + "componentName": "td", + "children": "100" + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "表单" + }, + "icon": "form", + "screenshot": "", + "snippetName": "form", + "schema": { + "componentName": "form", + "props": { + "action": "action" + }, + "children": [ + { + "componentName": "label", + "props": { + "for": "male" + }, + "children": "male" + }, + { + "componentName": "input", + "props": { + "type": "text" + } + }, + { + "componentName": "br" + }, + { + "componentName": "label", + "props": { + "for": "Female" + }, + "children": "Female" + }, + { + "componentName": "input", + "props": { + "type": "text" + } + } + ] + } + } + ] + }, + { + "group": "content", + "children": [ + { + "name": { + "zh_CN": "走马灯" + }, + "screenshot": "", + "snippetName": "tiny-carousel", + "icon": "carousel", + "schema": { + "componentName": "TinyCarousel", + "props": { + "height": "180px" + }, + "children": [ + { + "componentName": "TinyCarouselItem", + "children": [ + { + "componentName": "div", + "props": { + "style": "margin:10px 0 0 30px" + } + } + ] + }, + { + "componentName": "TinyCarouselItem", + "children": [ + { + "componentName": "div", + "props": { + "style": "margin:10px 0 0 30px" + } + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "表单" + }, + "screenshot": "", + "snippetName": "tiny-form", + "icon": "form", + "schema": { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "人员" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "" + } + } + ] + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "密码" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "type": "password" + } + } + ] + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "" + }, + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "提交", + "type": "primary", + "style": "margin-right: 10px" + } + }, + { + "componentName": "TinyButton", + "props": { + "text": "重置", + "type": "primary" + } + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "下拉框" + }, + "icon": "select", + "screenshot": "", + "snippetName": "TinySelect", + "schema": { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ] + } + } + }, + { + "name": { + "zh_CN": "开关" + }, + "icon": "switch", + "screenshot": "", + "snippetName": "TinySwitch", + "schema": { + "componentName": "TinySwitch", + "props": { + "modelValue": "" + } + } + }, + { + "name": { + "zh_CN": "复选框组" + }, + "icon": "checkboxs", + "screenshot": "", + "snippetName": "TinyCheckboxGroup", + "schema": { + "componentName": "TinyCheckboxGroup", + "props": { + "modelValue": ["name1", "name2"], + "type": "checkbox", + "options": [ + { + "text": "复选框1", + "label": "name1" + }, + { + "text": "复选框2", + "label": "name2" + }, + { + "text": "复选框3", + "label": "name3" + } + ] + } + } + }, + { + "name": { + "zh_CN": "复选框拖拽按钮组" + }, + "icon": "checkboxgroup", + "screenshot": "", + "snippetName": "TinyCheckboxbuttonGroup", + "schema": { + "componentName": "TinyCheckboxGroup", + "props": { + "modelValue": [] + }, + "children": [ + { + "componentName": "TinyCheckboxButton", + "children": [ + { + "componentName": "div" + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "对话框" + }, + "screenshot": "", + "snippetName": "TinyDialogBox", + "icon": "dialogbox", + "schema": { + "componentName": "TinyDialogBox", + "props": { + "visible": true, + "show-close": true, + "title": "dialogBox title" + }, + "children": [ + { + "componentName": "div" + } + ] + } + }, + { + "name": { + "zh_CN": "标签页" + }, + "icon": "tabs", + "screenshot": "", + "group": true, + "snippetName": "TinyTabs", + "schema": { + "componentName": "TinyTabs", + "props": { + "modelValue": "first" + }, + "children": [ + { + "componentName": "TinyTabItem", + "props": { + "title": "标签页1", + "name": "first" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "margin:10px 0 0 30px" + } + } + ] + }, + { + "componentName": "TinyTabItem", + "props": { + "title": "标签页2", + "name": "second" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "margin:10px 0 0 30px" + } + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "折叠面板" + }, + "screenshot": "", + "snippetName": "TinyCollapse", + "icon": "collapse", + "schema": { + "componentName": "TinyCollapse", + "props": { + "modelValue": "collapse1" + }, + "children": [ + { + "componentName": "TinyCollapseItem", + "props": { + "name": "collapse1", + "title": "折叠项1" + }, + "children": [ + { + "componentName": "div" + } + ] + }, + { + "componentName": "TinyCollapseItem", + "props": { + "name": "collapse2", + "title": "折叠项2" + }, + "children": [ + { + "componentName": "div" + } + ] + }, + { + "componentName": "TinyCollapseItem", + "props": { + "name": "collapse3", + "title": "折叠项3" + }, + "children": [ + { + "componentName": "div" + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "表格" + }, + "icon": "grid", + "screenshot": "", + "snippetName": "tinyGrid", + "schema": { + "componentName": "TinyGrid", + "props": { + "editConfig": { + "trigger": "click", + "mode": "cell", + "showStatus": true + }, + "columns": [ + { + "type": "index", + "width": 60 + }, + { + "type": "selection", + "width": 60 + }, + { + "field": "employees", + "title": "员工数" + }, + { + "field": "created_date", + "title": "创建日期" + }, + { + "field": "city", + "title": "城市" + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司", + "city": "福州", + "employees": 800, + "created_date": "2014-04-30 00:56:00", + "boole": false + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "employees": 300, + "created_date": "2016-07-08 12:36:22", + "boole": true + } + ] + } + } + }, + { + "name": { + "zh_CN": "弹出编辑" + }, + "icon": "popeditor", + "screenshot": "", + "snippetName": "TinyPopeditor", + "schema": { + "componentName": "TinyPopeditor", + "props": { + "modelValue": "", + "placeholder": "请选择", + "gridOp": { + "columns": [ + { + "field": "id", + "title": "ID", + "width": 40 + }, + { + "field": "name", + "title": "名称", + "showOverflow": "tooltip" + }, + { + "field": "province", + "title": "省份", + "width": 80 + }, + { + "field": "city", + "title": "城市", + "width": 80 + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司", + "city": "福州", + "province": "福建" + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "province": "广东" + }, + { + "id": "3", + "name": "RFV有限责任公司", + "city": "中山", + "province": "广东" + }, + { + "id": "4", + "name": "TGB科技有限公司", + "city": "龙岩", + "province": "福建" + }, + { + "id": "5", + "name": "YHN科技有限公司", + "city": "韶关", + "province": "广东" + }, + { + "id": "6", + "name": "WSX科技有限公司", + "city": "黄冈", + "province": "武汉" + } + ] + } + } + } + }, + { + "name": { + "zh_CN": "树" + }, + "icon": "tree", + "screenshot": "", + "snippetName": "TinyTree", + "schema": { + "componentName": "TinyTree", + "props": { + "data": [ + { + "label": "一级 1", + "children": [ + { + "label": "二级 1-1", + "children": [ + { + "label": "三级 1-1-1" + } + ] + } + ] + }, + { + "label": "一级 2", + "children": [ + { + "label": "二级 2-1", + "children": [ + { + "label": "三级 2-1-1" + } + ] + }, + { + "label": "二级 2-2", + "children": [ + { + "label": "三级 2-2-1" + } + ] + } + ] + } + ] + } + } + }, + { + "name": { + "zh_CN": "文字提示框" + }, + "icon": "tooltip", + "screenshot": "", + "snippetName": "TinyTooltip", + "schema": { + "componentName": "TinyTooltip", + "props": { + "content": "Top Left 提示文字", + "placement": "top-start", + "manual": true, + "modelValue": true + }, + "children": [ + { + "componentName": "span", + "children": [ + { + "componentName": "div", + "props": {} + } + ] + }, + { + "componentName": "Template", + "props": { + "slot": "content" + }, + "children": [ + { + "componentName": "span", + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "提示内容" + } + } + ] + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "提示框" + }, + "icon": "popover", + "screenshot": "", + "snippetName": "TinyPopover", + "schema": { + "componentName": "TinyPopover", + "props": { + "width": 200, + "title": "弹框标题", + "trigger": "manual", + "modelValue": true + }, + "children": [ + { + "componentName": "Template", + "props": { + "slot": "reference" + }, + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "触发源" + } + } + ] + }, + { + "componentName": "Template", + "props": { + "slot": "default" + }, + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "提示内容" + } + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "分页" + }, + "icon": "pager", + "screenshot": "", + "snippetName": "TinyPager", + "schema": { + "componentName": "TinyPager", + "props": { + "layout": "total, sizes, prev, pager, next", + "total": 100, + "pageSize": 10, + "currentPage": 1 + } + } + }, + { + "name": { + "zh_CN": "面包屑" + }, + "icon": "breadcrumb", + "screenshot": "", + "snippetName": "TinyBreadcrumb", + "schema": { + "componentName": "TinyBreadcrumb", + "props": { + "options": [ + { + "to": "{ path: '/' }", + "label": "首页" + }, + { + "to": "{ path: '/breadcrumb' }", + "label": "产品" + }, + { + "replace": "true", + "label": "软件" + } + ] + } + } + } + ] + }, + { + "group": "general", + "children": [ + { + "name": { + "zh_CN": "Row" + }, + "icon": "row", + "screenshot": "", + "snippetName": "TinyRow", + "schema": { + "componentName": "TinyRow", + "props": {}, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": 3 + } + }, + { + "componentName": "TinyCol", + "props": { + "span": 3 + } + }, + { + "componentName": "TinyCol", + "props": { + "span": 3 + } + }, + { + "componentName": "TinyCol", + "props": { + "span": 3 + } + } + ] + } + }, + { + "name": { + "zh_CN": "Col" + }, + "icon": "col", + "screenshot": "", + "snippetName": "TinyCol", + "schema": { + "componentName": "TinyCol", + "props": { + "span": 12, + "style": { + "height": "30px", + "border": "1px solid #ccc" + } + } + } + }, + { + "name": { + "zh_CN": "按钮" + }, + "icon": "button", + "screenshot": "", + "snippetName": "TinyButton", + "schema": { + "componentName": "TinyButton", + "props": { + "text": "按钮文案" + } + } + }, + { + "name": { + "zh_CN": "按钮组" + }, + "icon": "buttons", + "snippetName": "TinyButtons", + "screenshot": "", + "schema": { + "componentName": "div", + "props": {}, + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "提交", + "type": "primary", + "style": { + "margin": "0 5px 0 5px" + } + } + }, + { + "componentName": "TinyButton", + "props": { + "text": "重置", + "style": { + "margin": "0 5px 0 5px" + } + } + }, + { + "componentName": "TinyButton", + "props": { + "text": "取消" + } + } + ] + }, + "configure": { + "isContainer": true + } + }, + { + "name": { + "zh_CN": "互斥按钮组" + }, + "icon": "buttons", + "snippetName": "TinyButtonGroup", + "screenshot": "", + "schema": { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "Button1", + "value": "1" + }, + { + "text": "Button2", + "value": "2" + }, + { + "text": "Button3", + "value": "3" + } + ], + "modelValue": "1" + } + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "icon": "input", + "screenshot": "", + "snippetName": "TinyInput", + "schema": { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "" + } + } + }, + { + "name": { + "zh_CN": "单选" + }, + "icon": "radio", + "screenshot": "", + "snippetName": "TinyRadio", + "schema": { + "componentName": "TinyRadio", + "props": { + "label": "1", + "text": "单选文本" + } + } + }, + { + "name": { + "zh_CN": "复选框" + }, + "icon": "checkbox", + "screenshot": "", + "snippetName": "TinyCheckbox", + "schema": { + "componentName": "TinyCheckbox", + "props": { + "text": "复选框文案" + } + } + } + ] + }, + { + "group": "navigation", + "children": [ + { + "name": { + "zh_CN": "搜索框" + }, + "icon": "search", + "screenshot": "", + "snippetName": "TinySearch", + "schema": { + "componentName": "TinySearch", + "props": { + "modelValue": "", + "placeholder": "输入关键词" + } + } + }, + { + "name": { + "zh_CN": "时间线" + }, + "icon": "timeline", + "screenshot": "", + "snippetName": "TinyTimeLine", + "schema": { + "componentName": "TinyTimeLine", + "props": { + "active": "2", + "data": [ + { + "name": "已下单" + }, + { + "name": "运输中" + }, + { + "name": "已签收" + } + ] + } + } + } + ] + } + ] + } + } +} diff --git a/dl-flow-frontend/mockServer/assets/json/bundle.json b/dl-flow-frontend/mockServer/assets/json/bundle.json new file mode 100644 index 0000000..0a5cc4a --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/json/bundle.json @@ -0,0 +1,334 @@ +{ + "data": { + "materials": [ + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "zh_CN": "输入通道数", + "en_US": "in_channels", + "type": "number" + }, + { + "id": "out_channels", + "zh_CN": "输出通道数", + "en_US": "out_channels", + "type": "number" + }, + { + "id": "kernal_size", + "zh_CN": "卷积核大小", + "en_US": "kernal_size", + "type": "number" + }, + { + "id": "stride", + "zh_CN": "步长", + "en_US": "stride", + "type": "number" + }, + { + "id": "dilation", + "zh_CN": "空洞大小", + "en_US": "dilation", + "type": "number" + }, + { + "id": "groups", + "zh_CN": "组数", + "en_US": "groups", + "type": "number" + }, + { + "id": "padding_mode", + "zh_CN": "填充模式", + "en_US": "padding_mode", + "type": "enums", + "data": [ + { "id": 1, "label": "zeros", "value": "zeros", "default": true }, + { "id": 2, "label": "reflect", "value": "reflect" }, + { "id": 3, "label": "replicate", "value": "replicate" }, + { "id": 4, "label": "circular", "value": "circular" } + ] + }, + { + "id": "weight_attr", + "zh_CN": "权重参数", + "en_US": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "zh_CN": "偏置参数", + "en_US": "bias_attr", + "type": "ParamAttr" + }, + { + "id": "data_format", + "zh_CN": "数据格式", + "en_US": "data_format", + "type": "string" + } + ] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number" + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number" + }, + { + "id": "kernal_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernal_size" + }, + "type": "number" + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number" + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number" + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number" + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "data": [ + { "id": 1, "label": "zeros", "value": "zeros", "default": true }, + { "id": 2, "label": "reflect", "value": "reflect" }, + { "id": 3, "label": "replicate", "value": "replicate" }, + { "id": 4, "label": "circular", "value": "circular" } + ] + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string" + } + ] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "zh_CN": "输入通道数", + "en_US": "in_channels", + "type": "number" + }, + { + "id": "out_channels", + "zh_CN": "输出通道数", + "en_US": "out_channels", + "type": "number" + }, + { + "id": "kernal_size", + "zh_CN": "卷积核大小", + "en_US": "kernal_size", + "type": "number" + }, + { + "id": "stride", + "zh_CN": "步长", + "en_US": "stride", + "type": "number" + }, + { + "id": "dilation", + "zh_CN": "空洞大小", + "en_US": "dilation", + "type": "number" + }, + { + "id": "groups", + "zh_CN": "组数", + "en_US": "groups", + "type": "number" + }, + { + "id": "padding_mode", + "zh_CN": "填充模式", + "en_US": "padding_mode", + "type": "enums", + "data": [ + { "id": 1, "label": "zeros", "value": "zeros", "default": true }, + { "id": 2, "label": "reflect", "value": "reflect" }, + { "id": 3, "label": "replicate", "value": "replicate" }, + { "id": 4, "label": "circular", "value": "circular" } + ] + }, + { + "id": "weight_attr", + "zh_CN": "权重参数", + "en_US": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "zh_CN": "偏置参数", + "en_US": "bias_attr", + "type": "ParamAttr" + }, + { + "id": "data_format", + "zh_CN": "数据格式", + "en_US": "data_format", + "type": "string" + } + ] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "properties": [ + { + "id": "in_channels", + "zh_CN": "输入通道数", + "en_US": "in_channels", + "type": "number" + }, + { + "id": "out_channels", + "zh_CN": "输出通道数", + "en_US": "out_channels", + "type": "number" + }, + { + "id": "kernal_size", + "zh_CN": "卷积核大小", + "en_US": "kernal_size", + "type": "number" + }, + { + "id": "stride", + "zh_CN": "步长", + "en_US": "stride", + "type": "number" + }, + { + "id": "dilation", + "zh_CN": "空洞大小", + "en_US": "dilation", + "type": "number" + }, + { + "id": "groups", + "zh_CN": "组数", + "en_US": "groups", + "type": "number" + }, + { + "id": "padding_mode", + "zh_CN": "填充模式", + "en_US": "padding_mode", + "type": "enums", + "enums": [ + { "id": 1, "label": "zeros", "value": "zeros", "default": true }, + { "id": 2, "label": "reflect", "value": "reflect" }, + { "id": 3, "label": "replicate", "value": "replicate" }, + { "id": 4, "label": "circular", "value": "circular" } + ] + }, + { + "id": "weight_attr", + "zh_CN": "权重参数", + "en_US": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "zh_CN": "偏置参数", + "en_US": "bias_attr", + "type": "ParamAttr" + }, + { + "id": "data_format", + "zh_CN": "数据格式", + "en_US": "data_format", + "type": "string" + } + ] + } + ] + } +} diff --git a/dl-flow-frontend/mockServer/assets/uploads/.gitkeep b/dl-flow-frontend/mockServer/assets/uploads/.gitkeep new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/dl-flow-frontend/mockServer/assets/uploads/.gitkeep @@ -0,0 +1 @@ +1 diff --git a/dl-flow-frontend/mockServer/build/dev-server.js b/dl-flow-frontend/mockServer/build/dev-server.js new file mode 100644 index 0000000..f32a8a0 --- /dev/null +++ b/dl-flow-frontend/mockServer/build/dev-server.js @@ -0,0 +1,14 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +require('@babel/register') +require('../src/app') diff --git a/dl-flow-frontend/mockServer/config/config.js b/dl-flow-frontend/mockServer/config/config.js new file mode 100644 index 0000000..dcd70e9 --- /dev/null +++ b/dl-flow-frontend/mockServer/config/config.js @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +module.exports = { + port: process.env.MOCK_PORT || 9090, + env: process.env.NODE_ENV || 'development' // Current mode +} diff --git a/dl-flow-frontend/mockServer/gulpfile.js b/dl-flow-frontend/mockServer/gulpfile.js new file mode 100644 index 0000000..c49d674 --- /dev/null +++ b/dl-flow-frontend/mockServer/gulpfile.js @@ -0,0 +1,109 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const gulp = require('gulp') +const eslint = require('gulp-eslint') +const nodemon = require('gulp-nodemon') +const friendlyFormatter = require('eslint-friendly-formatter') + +let jsScript = 'node' +if (process.env.npm_config_argv !== undefined && process.env.npm_config_argv.indexOf('debug') > 0) { + jsScript = 'node debug' +} + +function lintOne(aims) { + return gulp + .src(aims) + .pipe(eslint({ configFile: './.eslintrc.js' })) + .pipe(eslint.format(friendlyFormatter)) + .pipe( + eslint.results((results) => { + // Called once for all ESLint results. + }) + ) +} + +gulp.task('ESlint', () => { + return gulp + .src(['src/**/*.js', '!node_modules/**']) + .pipe(eslint({ configFile: './.eslintrc.js' })) + .pipe(eslint.format(friendlyFormatter)) + .pipe(eslint.results((results) => {})) +}) + +gulp.task( + 'ESlint_nodemon', + gulp.series('ESlint', () => { + const stream = nodemon({ + script: 'build/dev-server.js', + execMap: { + js: jsScript + }, + tasks: function (changedFiles) { + lintOne(changedFiles) + return [] + }, + verbose: true, + ignore: ['build/*.js', 'dist/*.js', 'nodemon.json', '.git', 'node_modules/**/node_modules', 'gulpfile.js'], + env: { + NODE_ENV: 'development' + }, + ext: 'js json' + }) + + return stream + .on('restart', () => { + // 重启项目 + }) + .on('crash', () => { + // 重启工程:restart the server in 20 seconds:stream.emit('restart', 20) + }) + }) +) + +gulp.task('nodemon', () => { + return nodemon({ + script: 'build/dev-server.js', + execMap: { + js: jsScript + }, + verbose: true, + ignore: ['build/*.js', 'dist/*.js', 'nodemon.json', '.git', 'node_modules/**/node_modules', 'gulpfile.js'], + env: { + NODE_ENV: 'development' + }, + ext: 'js json' + }) +}) + +gulp.task('default', () => { + const stream = nodemon({ + script: 'build/dev-server.js', + execMap: { + js: jsScript + }, + verbose: true, + ignore: ['build/*.js', 'dist/*.js', 'nodemon.json', '.git', 'node_modules/**/node_modules', 'gulpfile.js'], + env: { + NODE_ENV: 'development' + }, + ext: 'js json' + }) + + return stream + .on('restart', () => { + // 重启项目 + }) + .on('crash', () => { + // 重启工程:restart the server in 20 seconds:stream.emit('restart', 20) + }) +}) diff --git a/dl-flow-frontend/mockServer/logs/out.log b/dl-flow-frontend/mockServer/logs/out.log new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/dl-flow-frontend/mockServer/logs/out.log @@ -0,0 +1 @@ +ok diff --git a/dl-flow-frontend/mockServer/package.json b/dl-flow-frontend/mockServer/package.json new file mode 100644 index 0000000..37eb3f2 --- /dev/null +++ b/dl-flow-frontend/mockServer/package.json @@ -0,0 +1,69 @@ +{ + "name": "@opentiny/tiny-engine-mock", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "description": "mock服务", + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "mockServer" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "scripts": { + "start": "gulp nodemon", + "dev": "gulp", + "build": "babel src -d dist", + "production": "node dist/app.js", + "test": "jest", + "lint": "eslint --fix ." + }, + "dependencies": { + "@opentiny/tiny-engine-dsl-vue": "1.0.2", + "@seald-io/nedb": "^4.0.2", + "fs-extra": "^11.1.1", + "glob": "^10.3.4", + "koa": "^2.11.0", + "koa-body": "^4.1.1", + "koa-compose": "^4.1.0", + "koa-jwt": "^3.6.0", + "koa-router": "^8.0.8", + "koa-static2": "^0.1.8" + }, + "devDependencies": { + "@babel/cli": "^7.8.4", + "@babel/core": "^7.9.0", + "@babel/plugin-external-helpers": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.9.0", + "@babel/preset-env": "^7.9.5", + "@babel/register": "^7.9.0", + "@babel/runtime": "^7.9.2", + "babel-core": "^7.0.0-bridge.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^25.3.0", + "eslint": "^6.8.0", + "eslint-config-standard": "^14.1.1", + "eslint-friendly-formatter": "^4.0.1", + "eslint-plugin-html": "^6.0.1", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-jest": "^23.8.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "gulp": "^4.0.2", + "gulp-eslint": "^6.0.0", + "gulp-nodemon": "^2.5.0", + "jest": "^25.3.0", + "koa-logger": "^3.2.1" + }, + "engines": { + "node": ">= 7.8.0", + "npm": ">= 4.2.0" + } +} diff --git a/dl-flow-frontend/mockServer/pm2.js b/dl-flow-frontend/mockServer/pm2.js new file mode 100644 index 0000000..b4de90c --- /dev/null +++ b/dl-flow-frontend/mockServer/pm2.js @@ -0,0 +1,31 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +module.exports = { + apps: [ + { + name: 'RESRful API Server', + script: './dist/app.js', + watch: false, // 默认关闭watch 可替换为 ['src'] + ignoreWatch: ['node_modules', 'build', 'logs'], + outFile: '/logs/out.log', // 日志输出 + errorFile: '/logs/error.log', // 错误日志 + maxMemoryRestart: '2G', // 超过多大内存自动重启,仅防止内存泄露有意义,需要根据自己的业务设置 + env: { + NODE_ENV: 'production' + }, + execMode: 'cluster', // 开启多线程模式,用于负载均衡 + instances: 'max', // 启用多少个实例,可用于负载均衡 + autorestart: true // 程序崩溃后自动重启 + } + ] +} diff --git a/dl-flow-frontend/mockServer/src/app.js b/dl-flow-frontend/mockServer/src/app.js new file mode 100644 index 0000000..26c5b34 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/app.js @@ -0,0 +1,61 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import Koa2 from 'koa' +import KoaBody from 'koa-body' +import KoaStatic from 'koa-static2' +import path from 'path' +import { env, port } from '../config/config' +import ErrorRoutesCatch from './middleware/ErrorRoutesCatch' +import ErrorRoutes from './routes/error-routes' +import MainRoutes from './routes/main-routes' + +const app = new Koa2() +app + .use((ctx, next) => { + ctx.set('Access-Control-Allow-Origin', '*') + ctx.set('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept') + ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS') + ctx.set('Access-Control-Allow-Credentials', true) // 允许带上 cookie + return next() + }) + .use(ErrorRoutesCatch()) + .use(KoaStatic('assets', path.resolve(__dirname, '../assets'))) // Static resource + .use( + KoaBody({ + multipart: true, + parsedMethods: ['POST', 'PUT', 'PATCH', 'GET', 'HEAD', 'DELETE'], // parse GET, HEAD, DELETE requests + formidable: { + uploadDir: path.join(__dirname, '../assets/uploads/tmp') + }, + jsonLimit: '50mb', + formLimit: '50mb', + textLimit: '50mb' + }) + ) // Processing request + .use(MainRoutes.routes()) + .use(MainRoutes.allowedMethods()) + .use(ErrorRoutes()) + +if (env === 'development') { + // logger + app.use((ctx, next) => { + const start = new Date() + return next().then(() => { + const ms = new Date() - start + }) + }) +} + +app.listen(port) + +export default app diff --git a/dl-flow-frontend/mockServer/src/database/blockCategories.db b/dl-flow-frontend/mockServer/src/database/blockCategories.db new file mode 100644 index 0000000..85744f5 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/database/blockCategories.db @@ -0,0 +1,3 @@ +{"id":"L0fyFYECrNiRZMiX","app":{"id":918,"name":"portal-app","app_website":null,"platform":{"id":897,"name":"portal-platform"},"obs_url":"","created_by":null,"updated_by":null,"created_at":"2022-06-08T07:19:01.000Z","updated_at":"2023-09-04T08:55:40.000Z","state":null,"published":false,"createdBy":86,"updatedBy":564,"tenant":1,"home_page":"NTJ4MjvqoVj8OVsc","css":null,"config":{},"git_group":"","project_name":"","constants":null,"data_handler":{"type":"JSFunction","value":"function dataHanlder(res){\n return res;\n}"},"description":"demo应用","latest":22,"platform_history":null,"editor_url":"","branch":"develop","visit_url":null,"is_demo":null,"image_url":"","is_default":true,"template_type":null,"set_template_time":null,"set_template_by":null,"set_default_by":169,"framework":"Vue","global_state":[],"default_lang":null,"extend_config":{"business":{"serviceName":"","endpointName":"cce","endpointId":"ee","serviceId":"ee","router":"ee"},"env":{"alpha":{"regions":[{"name":"","baseUrl":"","isDefault":false}],"isDefault":true}},"type":"console"},"assets_url":"","data_hash":"ae128e37f6bc378f1b9c21d75bd05551","can_associate":true,"data_source_global":{"dataHandler":{"type":"JSFunction","value":"function dataHanlder(res){\n return res;\n}"}}},"name":"我的分类","desc":"","blocks":["ALvDb0JD8atzd3nA"],"category_id":"qukuaifenlei","_id":"L0fyFYECrNiRZMiX"} +{"$$indexCreated":{"fieldName":"name","unique":true,"sparse":false}} +{"$$indexCreated":{"fieldName":"name","unique":true}} diff --git a/dl-flow-frontend/mockServer/src/database/blockGroups.db b/dl-flow-frontend/mockServer/src/database/blockGroups.db new file mode 100644 index 0000000..fe904aa --- /dev/null +++ b/dl-flow-frontend/mockServer/src/database/blockGroups.db @@ -0,0 +1,3 @@ +{"id":"b57MCCORYPGjgL23","app":{"id":918,"name":"portal-app","app_website":null,"platform":{"id":897,"name":"portal-platform"},"obs_url":"","created_by":null,"updated_by":null,"created_at":"2022-06-08T07:19:01.000Z","updated_at":"2023-09-04T08:55:40.000Z","state":null,"published":false,"createdBy":86,"updatedBy":564,"tenant":1,"home_page":"NTJ4MjvqoVj8OVsc","css":null,"config":{},"git_group":"","project_name":"","constants":null,"data_handler":{"type":"JSFunction","value":"function dataHanlder(res){\n return res;\n}"},"description":"demo应用","latest":22,"platform_history":null,"editor_url":"","branch":"develop","visit_url":null,"is_demo":null,"image_url":"","is_default":true,"template_type":null,"set_template_time":null,"set_template_by":null,"set_default_by":169,"framework":"Vue","global_state":[],"default_lang":null,"extend_config":{"business":{"serviceName":"","endpointName":"cce","endpointId":"ee","serviceId":"ee","router":"ee"},"env":{"alpha":{"regions":[{"name":"","baseUrl":"","isDefault":false}],"isDefault":true}},"type":"console"},"assets_url":"","data_hash":"ae128e37f6bc378f1b9c21d75bd05551","can_associate":true,"data_source_global":{"dataHandler":{"type":"JSFunction","value":"function dataHanlder(res){\n return res;\n}"}}},"name":"我的区块","desc":"","blocks":["ALvDb0JD8atzd3nA"],"_id":"b57MCCORYPGjgL23"} +{"$$indexCreated":{"fieldName":"name","unique":true,"sparse":false}} +{"$$indexCreated":{"fieldName":"name","unique":true}} diff --git a/dl-flow-frontend/mockServer/src/database/blocks.db b/dl-flow-frontend/mockServer/src/database/blocks.db new file mode 100644 index 0000000..387c640 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/database/blocks.db @@ -0,0 +1,4 @@ +{"id":"ALvDb0JD8atzd3nA","label":"PortalHome","name_cn":null,"framework":"Vue","content":{"state":{"logoUrl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAF8CAYAAADM5wDKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OEVGOTU4RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI5OEVGOTU5RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Mjk4RUY5NTZFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Mjk4RUY5NTdFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4dZkpJAAAvNElEQVR42uyd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","loginImgUrl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0wAAAI3CAYAAACoD9sBAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAP+lSURBVHhe7L0FfFRn2vf/38fe532fp7radWl3u91u27XudrXuLVDcaZEChRZ3l9LSQtECxd1dAsElEAjB4oS4J+PJxEau//ndk6GRO8nIGb9+n8+3UM4kM3PmnDP371z2/xGLxWKxWCwWi8VisaRiw8RisVgsFovFYrFYzYgNE4vFYrFYLBaLxWI1IzZMLBaLxWKxWCwWi9WM2DCxWCwWi8VisVgsVjNiw8RisVgsFovFYrFYzYgNE4vFYrFYLBaLxWI1IzZMLBaLxWKxWCwWi9WM2DCxWCwWi8VisVgsVjNiw8RisVgsFovFYrFYzYgNE4vFYrFYLBaLxWI1IzZMLBaLxWKxWCwWi9WM2DCxWCwWi8VisVgsVjNiwxSkstuJrAoWG1GNlajaolBLVKVQWUNkVqio/pryRtTfhsfiZ/Cz+D01CrXK77QqvxvPw2KxWCwWi8ViseRiwxRAwavAtMAQwdCUVxHpzUS6CiJtuQONjxHPozyfQXlek/L8lYqpgpmysZFisVgsFovFYrHYMPlS8BwwHogSwYQgumOudhgTGCOZgQkmhJGqdESpEN1yRqXYTLFYLBaLxWKxIkVsmFSUM2IkjFFdxMioGA6dYo5gPmSmJJTAe4DRw3vC+8P7xPtlsVgsFovFYrHCVWyYVBBqglA3BDMBUxEO5sgV7qbzKQYKKYVsnlgsFovFYrFY4SY2TG6ofoodan0QaYkUc+QqTvNkqauD4uw9FovFYrFYLFYoiw1TK8KCHwapyuKo5YEh8EczhlDHGXnCPkN3PhgoNk8sFovFYrFYrFATG6ZmhOgIFvqiBimC0ux8AfYd9iGn7rFYLBaLxWKxQk1smOoJJgmd4FCPxAbJt8A8wZDCPPEsKBaLxWKxWCxWsCriDRMW6zBJ6PqGWUSyxT3jO2BMEcVD5InnP7FYLBaLxWKxgk0Ra5gap9zJFvOMfxFpe4ppRYQPnQfZO7FYLBaLxWKxAq2IM0wwSogmsUkKfhB9QtMIkbZX9/mxWCwWi8VisVj+VEQYJiy20aWNjVLogponfH6ctsdisVgsFovF8qfC2jBhXe1s4qDj+qSwwNltD5EnfLbsnVgsFovFYrFYvlTYGiZEIYxV8kU3Ez7ACCPyxFEnFovFYrFYLJYvFHaGCUNmsYDmtuCRBT5vk2KQqy1c88RisVgsFovFUk9hY5iwSK5QjJKeU+8iHhwDSMOsruXIE4vFYrFYLBbLO4WFYUJUgZs5MI3RKuC4gHmCoWaxWCwWi8VisdxVyBomBA6Qfoc0LNlimWEagxlPiDqJlD2OPLFYLBaLxWKxXFBIGqa7s5Q4/Y7xgLspexZO2WOxWCwWi8VitayQM0xoJc11SowaoFEEjiWYb07ZY7FYLBaLxWLJFDKGCSlUlbXc/Y7xDah3QnpnDQ/GZbFYLBaLxWLVU0gYJkSVuFaJ8ReodaqsIbLwYFwWi8VisVisiFfQG6aqWu6AxwQGHHci6mSpOxhZLBaLxWKxWBGnoDVMSMFDbYlsIcsw/ga1TjDvnK7HYrFYLBaLFVkKSsPE7cKZYEU0iah2pIlya3IWi8VisVis8FfQGSYU3aOGRLZYZZhggdP1WCwWi8VisSJDQWWYapXFJ3fBY0INvXLMwjhxwInFYrFYLBYr/BQUhgmpTagPYbPEhDKGSsdxjJRSNk8sFovFYrFY4aGAGyYsLNHcgc0SEy6gzqmi2mGcWCwWi8VisVihrYAbpgruhMeEKc5huFY2TiwWi8VisVghq4AZJqTh4S68bKHJMOEEoqfliDhxZz0Wi8VisViskFNADJPTLOEOvGyByTDhCIyTs7Me+yYWi8VisVis0FBADJOoWZIsKBkmEoBxQoMItNBnsVgsFovFYgW3/GqYcFe9kmuWGOYuiDiJrnoccmKxWCwWi8UKSvnNMGE9yK3DGaYposaJh+CyWCwWi8ViBaX8ZpiQfqRjs8QwzQLjZKwkquVUPRaLxWKxWKygkV8Mk83OZolh3AFd9dCOnDP1WCwWi8VisQIrnxsmLPr0lfJFIcMwzYObDGiQwgNwWSwWi8VisQInnxomRJZQ1C5bDDIM4xp6s6MNP84nFovFYrFYLJZ/5VPDhCYPsgUgwzDuo1OME84p7qjHYrFYLBaL5T/5zDAhjYjrlhhGfdAYAk1U2DixWCwWi8Vi+V4+MUxIHUIakWyxxzCM96CjHtJduaMei8VisVgslm/lE8OEDl+yRR7DMOoiZjgp5xtHm1gsFovFYrF8I9UNU7WFh9MyjL9BRBfnHjeGYLFYLBaLxVJXqhomLNYMnIrHMAFBqyDqmxTjxL6JxWKxWCwWSx2papgqauQLOYZh/Aen6bFYLBaLxWKpJ9UMk8XKqXgME0ygSyXS9Ng4sVgsFovFYnkuVQwTUvGQCiRbtDEMEziQpsfd9FgsFovFYrE8lyqGqYobPTBMUINoUwXS9OrOWRaLxWKxWCyWa/LaMIlGDxxdYpiQAOcq0mdZLBaLxWKxWK7Ja8OEGgnZwoxhmOAE0SZzDZHVVncSs1gsFovFYrGalVeGCek9Om4jzjAhCUYAoAU5i8VisVgsFqt5eWWYqmrlCzGGYUID1B6K2iYubmKxVBfOK0RyK5XvSjRfQUosbjIC/N2o/BuivWjKgsfyachisVjBKY8NE2qX9BxdYpiwQAy85domFstrwfggcgsjhCiuqw2RYKIwPw1p7lZ2TiwWixVU8tgwIbqElsWyCz/DMKHH3U56vFhjsTwSbjogkuRN11h8ryL6hO9YPhdZLBYrOOSRYUJ0yaRc0GUXe4ZhQhtEji3cEILFckvlilGSnU/egHMR37csFovFCqw8MkzIt+a5SwwTviDahDvcvFhjsVoWbi74cnA7vmuRpsenIovFYgVOHhkmpO3ILuwMw4QPSA1CehFHm1gsuZCC549aXtzAqKype1IWi8Vi+V1uGybc5eLoEsNEDihGR1SZxWJ9LXS/g5GRnTO+ApEmFovFYvlfbhsmtEeVXcgZhglfcJMEd7g5RY/FcnSxC0SXWJyH3M2SxWKx/C+3DBM69nArcYaJXDA3hlP0WJEs3DTwRYMHV+GmLCwWi+V/uWWYcGeL0/EYJrJBih6nBrEiVZixFOjvQdH+v+71sFgsFsv3csswYRCf7OLNMEzkUcEpeqwIEw53X3bEcxUYNtRQsVgsFss/ctkwIR0PHbNkF2+GYSIT7qLHiiRVWeTnQSDAucdisVgs/8hlw4RFEVJxZBduhmEiF3QK4xQ9ViQo2L4DOcrEYrFY/pHLhgl527ILNsMwjOiiV+uIRLNY4SjcNJQd+4GEZzOxWCyWf+SyYQpkVyCGYYIfDLpFMTrf9WaFo2BOZMd9IEE9Fd+jYLFYLN/LZcPk7wF9DMOEJgZlEWfhWTGsMBIip2ipLzveAwm+l/kGhX+EBje4riHbpqrWYaDN1Y6bRAA3lVFX5gT/L8A2BTTNQhQedXD4HRgGjs+Oo/IsVmjIJcOEk1p2sWYYhpGBhRybJla4CItl3AiQHeuBRAyy5fpBVQTfAjCUGGYGhgjGxx91a5itheeCqUI9KI435+thsVjBIZcME+6KyE5yhmGY5oBpwp1YvoPKCnWhfikYh7bDMFUr5xjLPeGahBvBMEYwKDAqSG8MpqYeuH7iNSF6hc/4bkSq7j2wWCz/yiXDFAxzJxiGCT2woMMXPs9rYoWyEC0NSsOkgJsSrNaFa5AwR8r1CGsafJ64Psn2azACA2WoF4mCgeKbUSyW/9SqYcIJKTt5GYZhXAULFBYrVAXDFKxjNZABwpILJgmGEumUoWSOXAXvCXVSME8sFsu3atUw4USUnagMwzDugDu6/MXOCkUFbUqeAkeYvhYMEswtTCRu0oSjSWoORKAQzUdNG6fusVjqq1XDhIux7ORkGIZxFyw6ueaCFWrCAjQoDZOySI70odHIgsGNGGcdUiSZJBkw0ThW0ZkPxwan7bFY6qhVw4Q7FrKTkmEYxhPwhc4DN1mhJEQugrFLHqIKkRq1xWeC6wjMQaSbpObAtRappDCT2F8sFstztWiYcH6hwFB2IjIMw3gDbsbw3U9WqAh37GXHcSCBWYikhTDeKwwiPgs2Se6B/YX1HFIW2TyxWO6rRcOEkyoY76oxDBP64O4nFj785c0KBSG9SXYcBxIsgCNBWOQjSsLrEe/BdRdDmFFuwddeFst1tWiYgjVvm2GY8AGLIP7iZgW7EA0NtqhGuNcvIZoEU4jUQ9n7ZzwHx7JI1+ObViyWS2rRMIlWqnyhYhjGx+DGDDqRsVjBrGBKUcd3cziuc51NHHj+o//AscQRJxarZbVomNCekvOEGYbxB4g0RWoBOys0hKyLYPlODLd24liso4Mmd7oLHLhxhZbsOM5ZLFZDtWiYuKU4wzD+xHmn0xNZrFbSG0yUk19MybezKDE1k1LSs+lOdj6VafXKIoBXASzvFQydY8MpjRURJZzz3O0uOHC2JUcHQm7Kw2J9rRYNE04Y2QnFMAzjK7Bowl1O2Xd1rcVCFeZK0ugMdOLcFZo+fxV17D+ennyhBz3465fof3/xbLPc8/Bz9LOn29GLnYbQ0InzaPn63XT1Zgpp9UbxO2trLbxAYLWqQA+xxYI2HKJLONdqrIHdl0zL4LNB1J8viyxWK4YJXWlkJxHDMIwvEaap7g4nTNLtjBzadegUTZizjJ7v8AF96zevSE2RJ/zkj23o5c5DafSMxbR591G6FJ8gIlJ2dk+sZgTDEqhoCOqoQjm6hEAvUu+4411oILqZKsccGydWpKtFwxSMcycYhokM8EV9OjaRhkycR8+80Ze+raJJao5v/voleuyfXei1bsNo8qcr6MLlm1RTG+atyFhuC146EDcUQzkVD/sMkWMDUu8k740JbpAujXRUbgzBilS1aJiCqSMQwzCRw/XUQuo0cKrU1PibJ57vTis27qWaGv/kQWFhieiWTSG/sJRiryXRxau3BJevJ1FBURlZrTaOgAWB/PkdifSoUP3I0USAI0rhASKriBCyWJGmZg0TrssYbiY7YRiGYXxBUkYZzV2+ix5+pqPUvASSH//hbRo+5QuKPntZpOypIYvFSkUlGoq/lUr7os7StHkrqU3v0fT7l3rSd3/7qvR1AGz7/cu9qMcHU2nhqu2inut2Ri5V19TU/WaWP4S77bjr7uv0PHSOC7W2+1hD4DUjUyVQ6YuM78DnitEzLFakqEXDxHeEGIbxB2UmO524mExv9h5L9//qRalJCBZQ89Smz2hateWAaD7hiYymCjoYfZ5Gz1hEr/cYTo8/21WkA8qezxW++9vX6G9v96eBYz6hrfuiVTN0rNaFqA9qmnw1sxCGLNTaPMNIYiAqN3QIb/D5otaU0/RYkaAWDRNf7BiG8QcnY1PpiRd6ik52MkMQjDz46Iv09Gvv0v6j5xwXTRdUUqalmfNX0yN/7UDfeuxluveR56W/21Ow/2C8fv3PzvTpkg1UUVFZ98wsXwumRs1hq3rFgGEWYigJ64ZANsRgAgNurlvZNLHCXC0aJl/dMWMYhgGILJ2KTVMMRCepAQgV0Kp8z+HTlJlTQJVV1WSz2USdkd5YTrczc0U06d1hM+k7jzefZucLfvDUmzRv+RYqVowayz+qVkwOjJMn358wGrhRiYYSoXTXHlE2dFFT0zAyoQWOXTT14GgTK1zFholhmICBNLynXuwtXeyHGuji94+279PAMZ+KVLuR0xaKGiNEobxJt/MWPPd7w2eRTm9yXNxZPpfTQGABicYQuhayNbDQhNGASUJEKdTS77hOiakPjvdQq7djsVxR84ZJueDzBZBhGF9xO89AHQZMCak0vFDl/l+9QDO/WFN3dWf5U/guxV13GCGYKJgigL/j37ANjwlFidotTt1nGoFjApFWFiucxIaJYZiAsHTDEfrmr1+WLvAZ9UEErLBEU3eFZ7E8E7wdIgjcRZdpDefwcRYrHMSGiWEYv5NXVk2/f/ld6cKe8R1frttdd4VnsdwXImJIHeSoEuMKWEMiXZPrmljhIDZMDMP4nfmr9nEqXgBo++7ouis8i+WekGLFnXMZTxBd9LiuiRXiYsPEMIxfKdJb6GdPt5cu6Bnf8sTz3alUo6u7yrNYrQvRAcyCkp3LDOMqME3cDIIVymLDxDCMX9l/Ip7uU3n+EOMav/p7J0pKy6y7yrNYzQtrAI4qMWqCYwnNTlisUBQbJoZh/AbmLn00dSmn4wWInz3dls5cvFZ3lWex5EJUqbyK1wCM+qD+jU0TKxTVvGFS4DlMDMOoSUqWlp7v+KF0Mc/4nu8/9QbtOnTKcZFnsSRCy3M2SowvwdrSwqaJFWJq0TBxKJ5hGDWJOneLHvlrJ+linvE93/rNK/TVxr2OizyLVU8oyketEpslxh9gWDM3gmCFklo0TAY2TAzDqMjKbcfpgV+9KF3MM77n3keep1kL1pIdOdcsliIcCahVQlG+7JxlGF8B08SXIlaoqGXDxBdQhmFUosRgpZEzl0sX8oz/6D/yYyqvUC7urIgXFqsiqiQ5XxnGH5iqHOtNFivY1axhgkxsmBiGUYkCbQ290nWEdBHP+I9n2w+ivMKSuqt867LZbKIVeWJqBsVcuUknzl2ho6cuUfSZy3Qu9jrF3Uim1PRsKirRUE1Nbd1PsYJZWKCixTNnkTCBBma9soZNEyv41aJhQpcc2QHOMAzjLrmlVfSTP7WVLuIZ//G9J16jY2di667yLSs9K4/mLF5Pbd8dQ0++0IMeevJ1kdbn/F3f/s0r9LOn29GfXu1Db/YcQR9OmkebdkVRVm4hp/0FqfCxYIHKTZ2YYIE757FCQS0aJh5WxzCMWtxIK+J24kHCX954j8yVygW+GSFlb+7SjfTwM+3dqjnD5wsT9et/dBY/X1nV/HOw/C+0C0fdiOz8ZJhAghIQFiuY1aJhMtfID2yGYRh32XowRrrIZgLD397qT2cvXqPCEg2VmyvJVGGmwuIyOh0TT690/UgVc/uHV3rT+M830I6jsXTrdi6Vao1k5dZYfhdifWjswFElJpjBmpPFCla1aJiqauUHNcMwjLtM/my9dFHNBA7MZXqly4c0YPQc6jtiNr3UeSg9+OhL0sd6ygOPv0kP/a0vPfrGKOo0YhEt3HSUUrMK675lWL6WjduFMyECjlFOzWMFq1o0TDzAjmEYteg8eLp0Qc2EP/f9+lX6/j/60/ef/YB+8tJH9KfOk2n2in1kKOc8HF+qRll8crdbJpQQXfO4/JEVhGrRMMHpcwifYRg1eK79h9LFNBMZ3PPLl+gH/xwgTJOTZ3vPpOMXE6iihXoqlvvCghMZInzDkwk1cMziZj2LFWxq0TCh7aie244yDKMCv32+h3QhzUQO9/7qJZGeV980/eLV4TRk9jqKvZlOtRbOx/FW+N7mDrdMKIMoE4sVbGrRMKE2l+c0MAyjBg89+aZ0Ec1EFg880ZYe+ufABqYJPN1lMs1bd5iqeJaTx0IKHt/kZEIdzGbiWiZWsKlFw4SwPrcgZRjGW0oMNunimYk87nnkefrOX3o3MUxOOg5fSKU6Ew+ydEPYV5WcgseEEdxmnBVsatEwQRzaZxjGW4p0FunimYlM7nvsdfr+vwZLDRN464PPKS2rkE2TC0IKHlKYZOcdw4QyHGViBZNaNUy4ayU7kBmGYVylkA0T04jv/Ln5KNOPXhhK709bTXpjRd03EUsmFMdzCh4Trpi5FwwriNSqYYLDlx3IDMMwrlKgrZUumpnI5V60GpeYpfos2ni47puIVV+IvGG2kuxcY5hwAWl5Ng4zs4JErRomHKycFx3eoMASdynR4AN/6oDymePfZY9nGHcp0nOEiWnEw8/R9/7umM0k43t/60ff+2NHKijR1X0bsSBOwWMiBaxDOC2PFSxq1TBB3CkvfMEFqbrW0RERE+HxJzr74iKFdA/M8qisISqvVr6kKx3HAs/mYjzhW4+9Il84MxHKc/Stp7tLzRL43t/60gO/bUNj5m0lO0+yFMK1mlPwmEiiSll/sFjBIJcMk1k5YGUHMhPauNO6E8sVgfIfgMgj7nRWK6ZKGKoqNlNMyzz8TEfJopmJZB58qoPULIHvPvOeYpjepj90nEjpOcXiOhSpwjUX9Rwc9WciDURTsfZgsQItlwwT1zGFJ2gZ74sbt/idiFQ5I1T4osdFD/nId9P+kPIHJK+LCU/+9Fo/6aKZiVwQQZKZJYDW49j+i1eG0/r953xyrQoF4VrKKXhMpIL1QqSe+6zgkkuGCeI0gPADaXb+vg45zRTS/mCoEKFCyB2mClEqp7FyGirZ62ZCk9d7jJIumpnI5f7H36KH/jVIapi+/XR3MeT2B8rfh3+ykSojLDcH12ZcH/m7l4l0sGZgsQItlw0Td+QJP/CZBpNgpgDS/QROY4UoFdL+lNfrNFOy98MEN++Pmy9dNDORy/2/eZMe+qfcMH3z953pwafai7+3GzqfCkr1dVeKyBCueXzTiGEcNw5YrEDLZcOEaIDsQGZCl2AzTO7IGalypv3hvYjoVL2UP077Cy4+XbZDumhmIpf7f/OW1DA99K/B9OAT7ejbf+gi/h91TMl38uvO/vAWbhYZOQWPYe4SymsVVvjIZcOEAn9ODQgvwvUi5DRTzk5/6CyFxhR4v0j7Q+2W01jxHVz/sf3wRemimYlc7n/8bfq+Yo6aGKZ/vE/3PfYGffeZPuL/f/byMLqamFl3hoevcL3CtUl2/jBMpILMEhYr0HLZMGERyoWn4UUk3rW5m/KnGCpRS1VnrJzd/rBPYKj45oD6xCcXSBfNTOTy4JPtmpgl8N2/9aX7fvVKgzlNJy8l1p3F4SlOwWMYOTgvWKxAy2XDBFXWyg9mJjQJRNOHUBPMFQzV3W5/MFPKxftuuh+Q7FumKbmlVfSjP7SRLpyZSOQ5+tYfuzYwSk6+9YeudfVN79/9t13RV+rOyvASrjF8M5JhWobXKqxAyy3DZFWOWC64Dx84L9hzOdP+nN3+hKFCYwpl4YPFD6f9NSVfU0N/bztYsnBmIpKHn6PvPPNuA6Mk+Ndguu/Xr9E3n+rYIF1v/6n4urMvfCRS8JRrhex8YRjma3BjgcUKpNwyTBCiErKDmQk92DD5Rs60P2fKH0xV/bQ/nEPOtL9Iik4V6SzUY+hs+eKZiTju+eVL0pbi3/5zL7rnkRfFn/X/Per8jbozLPSFtR9usPANSIZxDXyfsliBlNuGCQet7GBmQo9AGiYRobHayWKxk9lso9Q0M50+raXDR8po774S2rmrmKKOltGVKwbKyKyk6mq7eLxNcSL42XAS3o8wVM60v6rwNFOlRhtNX7BZunhmIo8Hn+rQwBABdMe799FX6T6Fh/458O6///D5IXTx+u26Mya0xSl4DOM+bJhYgZbbhgnilqfhgb8NU2WljdLTzXThvI7Wrsun8RPSqHv3G/TmG3H0+mtXWuStN+NowIAEmjEjnTZvLhRGKjunimpqwvcq6oxUNUj7qzNUqKVCKk/9tL9QMFib95+jbz/+qnQBzUQO9zz8fIOGDk6+/afuYtu36tqJO3my3XhKSM+rOzNCV7gxwil4DOM+bJhYgZZHhqlGuehzXUbo4y/DVFxcQ3v3FtPMmenUr98tevuthgapXdvrDf7fFdq/E0+DByfSnDkZdOKEhoxGxVFEkBqn/WEhVr+WCp+ts44qmNJ+Tl5Kod882026iGYiB8xYqm+IwPf+PoDue+x1uvfRlxtEl8CLfedQVn5p3dEfesL5inRcTsFjGM9gw8QKtDwyTFiocZQp9PG1YaqpsdPGTYXUvdt1ESGSGR8waFCm9N9dBQasd+8btGt3cdil63kr7A7gjFSJtL+65hSBSPtLztTQcx2GShfRTGRwzyMv0HclzR6++ftOYvt3GtUugb6TvyK9STlgQ1Scgscw3sGGiRVoeWSYIBSwc5QptPGFYYJhKSurof37Sqhb19YjR/36plOnjjel2zyhb99bdCSqlDQaxRmwXBI+M2fan3MWlbPTn9qmqsRgo+5DZzVZRDORA6JLjZs9fPcvfRQj9Tw98HibJtt+/MKHNH/9EeU4hfUPHeHVIhsDYwhk5wLDMK7DhokVaHlsmPDdhQWV7MBmQgO1DROOiTNndTRuXCq1efuq1NDUp0P7mzRwoHfRJRlt2lyl8eNT6UKMXgyoZXkmLPiQ7oe6KTVvjny8ZBvd8/Bz0sU0E96gMx6G0tY3RN/963t0769eFsgiT4+9NZpOX0l2HJQhIpw73AWPYdQjxO6XsMJQHhsmCHfPZAc2ExqoObjWXGmjpUtz6J134qUmpjFvvB5H77+fQe3fuSHdrgaoc1q4MJsMhsiqb1Jb+KJSM6Xo4KnrdN8vn5cuqJnw5tt/7NbADDnqlt4Q2xxDbL+eu+Tk5X5zqLJacR8hIqS/cmMHhlEP3LBjsQItrwwTxLnZoYtaEaa8vCqaNi3dpW53Tjp3SqABimFy52dcBWasW7fEu3+fPPk25Sqvke9QeS6k68mOIU/ILqqg7z7xepPFNBPGPPwcPfjkOw2MEBo7PPDbNo5tTzTc5uQHzw2h3cev1B2FwS1cXnCe6Mzy455hGM/AOcViBVpeGybklaLOQXaQM8GNGoYpMbGcRo5MaWJaWmPo0Bzq0sVhatTm7bfjqVev1Ab/hpbkSNFj0+SZcJ7LjiFP6TRwmnxhzYQl9//mTXroH+/fNUJoKX7/428Ls/SApKbJCaJLVTXBX4+IqBKn4DGMb0D5B4sVaHltmCC0Mg63IZuRgLeG6Uqcgd591/2GDf363aEhimFC9Ee23Vs6dLhJ3bsnNfn3GbPuiDvALPeltmHadihGurBmwg+0Cf9evbql7/2t3900vAd++3YDI1Wfn78ynE7EJtYdgcErMVuJbxoyjM9AV1cWK9BSxTCJNuOcsx1yeFPDlHbbTAMHuh8h6tjxJk2boaO33nSt1skTunVLoi6dE5r8+669pSIXGgsclntS2zAV6630/afebLK4ZsKLe3/1kjBIDhM0WBin+x59VUSW7n/sTXron/LI0g+fG0LD5mykcnPwrpQQrcbNQo4qMYxvQfdWFivQUsUwQViE8hdHaOFphCm/oJpGjHA/Da9Nm2s0fESBNPqjFoha9e6dKqJM9f8dDSAy8mrF+2bT5L7UNkyg48Cp0kU2Ex7c9+tXRQc8GCDUK33rT13p3l++JOYwPfhk+2bNEvhL1ykUl5hZd/QFn9A9Ene9Zcc1wzDqwt/XrGCQaoYJwlBM2cHOBCeeRJiMJqtHNUsATR4+GOK7VDzw1ptXaeCgzCbNJObOy27w3lF3xxdh1+ULw7R0w2FuLx6m3Pfr1+6ape/9YwA98EQb5bN+XoBueC2ZJTR62BV9mSw46IJQmEHIdbsM4z+QxcRiBVqqGiYc04hayA54JvhwN8JktdppxYpcxfA0NCmu0KnTLZo0ucynbcRB377pTRo+vP3WVUpMr27y/pFGqtaFGL+nyGCnYgXceYYZw3oPYBvSd1R6qoDIF4bp5KUUeuSvHaULbiZ0uffXr9JD/xhI3//XYPr2n3vSPY+8KP79HsxZ+mvDGUyN+dHzQ2nhxqN1R11wCecvbjLJjmWGYXwDbk5wsyZWMEhVwwRhYcX1TKGBO4YJF6yLF/XUrev1BmbEFdBCfNoMPfXs4VlkylU6dbxFo0cXNYkujZ94mwq1Nuk+QGcrNWRRDNKl21Y6GF8rOHK9lk4mWuhCmoWuZlopMc9K6cU2ytXYqEhvJ43JTgazXXwGaEQR7HfQfGGYUnN09HrPMU0W3Exo4ki1e4ce+uf79N1n+txtGe78d8xckpkkJz996SMaOXczVVYFX8ECZg7ybCWG8T8YXcN+iRUMUt0wQVg8ok5EdvAzwYM7KXm1tXYaNcp9w9Oh/Q0aP6GE+vRJk25XizZvx9PwEfnUXnm++v/ets1V2r2/jMpM8n2A47RKhc55jQ1TS8BMRd+y0CnFUJ1LsdBFxVRduWOlG9lWSi2wUXaZTUSqYKiQ5hoMd9d8YZhKjTYaN2cV3ffLF6QLcCZ0uEf5DL/1p27CKD34RFtRq/S/v3hOdMP7zl96tZiC52To7PVUWKqvO+KCQ7iRgZsaXJ/LMIFBrZuaLJa38olhglAUy6YpuHHHMG3bUdTAiLgCIj1jxhbTwIGZ0u1qgZooPMe7ElP2wZAkSslomo5XHyyGYAi8kTuGyRUOgWsOoq5b6Gyyha5mOAxVvtZhpvxZg+ULwwT2n7hK3/3ta00W4EzogOYOD/2jv2jkgBol/BuiSt/6Qxf6fjPzlRozaMYa5Rzy4wHtgnBOc60SwwQW1AyyWMEgnxkmCAc635kLXlxNyUNXPERqGpuRlnin3XUaNbqQPhqWR2+/5bsW4gBd8YZ+mCsG1jbetnpdgfS9Nwb7wptAjtqGyRVgqo7edJipy3esdCvHRreLkPZnpxKjnbTlzrQ/u2h/jNfoabTKV4Ypt7SKHn+uR5NFOBP83PPLF+n+37xBDzzRVjFIMErP0b2/epkeEOl3zlbiLfOrN0bR1CW7yOrtHQsVhagS2hjzDT+GCSw6bs7ECiL51DBhcYYvHtmJwAQeVwyTTVnHoNFDYyPSEmjwMG58CQ0dmiNS5WSPUQM0n+jb9zaNVoyZrJlEl87XKT3H0Uq8NWDsERX1VIEwTC1x+FotHbtZezft79JtC8VlONL+UgpslFliowId6rrsVK4YKrz+luQrwwQmfLKmyWKcCWJQl/TLF8SMJZgm/BuM0jd/1+luZzxX+OXrI2jDgfNkLA+OMf64l4B6Qq7BZZjgAHWDwV7fy4oc+dQwOYUcVNnJwAQWV1LyMrMq6f33mw6BbY7OilmaOk1L/fvf8Wn7cPzufv3u0PgJpc2asoNHtdL33RyuRtxkCjbD1BJI84OhQi1V1I1aOqpw7KaFTiVZKPaOlfTmpkeFLw3TrfRSbi8eKuBzqvdZwSh964/dxJwldMWTGSMZf+kyibLyS5XjKjgiSzjiKziqxDBBBRo+sFjBIr8YJgimib+MgovWDBMihIcPl9Lbb7ecjgfzghS8QYMzadp0Hb377m2fmiW0CYchGz2miNopz9t4OyJPkyanS99zS+D49PRuVigZptYo1DddxPrSMIEXOw9ruDBnghPFLCGydP/jb9G3/9zD5RolJz9/+SMaOG0l5RVp6o6swArXOJE6zrVKDBN0IJWcxQoW+c0w4YtJmCbJScEEhtYMU1WVjWbNvtPEkDhBU4fOnW8pRimLxo4rpg8/zBWtvWWPVYuOHW7SyJEFojaquZlOPXveoPOxJul7bg3cZfZEbJi844tVe+ULdCYoQNc7tAn/1h+7ONLu3IgmORhMz/aaRpsPnCNTRXCk4KE2AtdAvpHHMMGJN2nyLJba8pthgrimKbhoLQVNo6mljh2vNTEkb715VXSlmzJVS9Nn6mnoUMUodbrVZP6R2vTomUyTJmvovb7p4jXIHoPXsGRZLhXr7NL33BqeRpnYMHnHmSu36Sd/aiddrDOBAZ3uHvjt2/Ttp3vS9/7e36XW4DJ+9uJQmrF0B+UWldUdTYGV8+YdNyRimOAFUV8WK5jkV8PkFMKs/GUVeFqLMB09VtbAjLRtc43efz+DZswyiHS4Hj2SfZp6B9D5DmZs2PA8YdC6d0uSPg68oTBqVCrllVql79dVPGljyobJOxLSS+hf7wyRLtwZPyAaObxI9z36iuh6950/96aH3Ey3q88PnvuAfvP2aHpn6FxKTs+tO4oCKxglRJUMnH7HMEEPz19iBZsCYpiwSOeW44GntQjT9Blfp+N16ZJAI0cV0tAPc6ijD9Pu3ngjjjq0v0m9eqXQoEFZynMW0OjRRcKotWvbNNpVn1GD41zuitcSMJLuig2Td9zOM1Cb9ybIF/OMT0Ca3f2/eZMefKo9fesPnem7z7yrmCR3U+0aM5ieajuaxs/fQmcuJ5AFJ0YQiNPvGCZ0QOkGvnNYrGBSQAyTU/gSY9MUOFqKMNXW2qn9O47uc4jqoPNdz54pzabCeQMaN7z7bhoNr4sigVGKORswIIO6dE4QkS3Zz9VnUI/zlHD4svR9uosnrUzZMHnHnXwTte8/WbqwDzXuffg5+t0zbajtW91paO/3aeR7g5U/B9LAHv2pW/ve9NwLHenRP7xBD/zSMeTVL6BZAwzS428r5qirMEff+1s/eugf70tMjycMpr92nkDr956mpPRcqqoOjtvDOI9xY4i/ZxgmdMB3MIsVbAqoYYLwhYaTQ3bSML6lJcOUetssjEiHDjdp4qQy0WyhsUnxFJiuDu1v0KBBjjqoOZ+W0+TJGvpgcDZ16ZrgVi0U0vDe7RxDSWt3UfW1C9L36S5YXLk7LI8Nk3ekZGnp1W4j5Yv9EOAehZ899apijgZRxsYlRMc2too1agNlbFpKB+fOotkfjqAuHfvRH57tQj/5Yxv63m9fpwcffalRu/W6lt513PPw8w4eeaGOF4UpuvfRV+j+xxRD9mQ7+vbT3el7fx8gMTjegZS7n78yjJ5sO5q6jZhPKXeCI+3OKaTfIfWbI0oME3pwOh4rGBVwwwQ57wJyBz3/0lJK3vGTWmFchgzNoT69U6VmxV3atImn9969TaNGFzoG236YS716plDbVlLtmuOdt2Np9tCTlLlph1iAqmWYgLt1TGyYvON6ahH95c0B9cxBaPHMP9+hE198QrajG5oYI3fJ3LKcDsz7jBZNmkEj+n9Eg3u9T53bv0d/fbE7/epvnekHf+pM3/lTN/r2n3vSd//Sm7771770vX8MlBobtYBB+uVrw+i53tNpwNSVNHXRNtpz7CIZy4OrMhvfJTBKfBOOYUIT3ORw94Yli+UPBYVhgnBHkOua/EtLEaZ16/Kpa9dE+vCjXFXS8NBufOz4YlEHhWYR7dpeF/OSZI91hWF9zikL1P1k2r/l7kJTTcPk7h0uNkzecT4+g34aol3yfv7Ua3Rj1QKyq2CWZNiObiTd3jWUtnEZXVm5mM58uZCOL11IOz+fR1NGTKUuPUfS398aQr95aRD99LmB9AMvmjWAHz07mB555UP6c8dx1Omjz+mLdYfo2IWbdCE+hVIz86miMvimSTojSjBKfOONYUIXT1LiWSx/KGgMk1Pou6/nLkZ+oSXDNOeTDBo3oVR0qJMZFneAQfpsXiX165fulUnCz/breoHOL9knXViqaZiwb9wRGybv2BkVKzUjwc69jzxHO2ZNkx6PgaTy0DpKWLuYjsyfS+tmzqK5Y6fQmCHj6IMBo2lgv9E05P2xNPKD8TRtxCT6Yvw0WjvjY7q0YiGZj+9QViuhc3sX1y9OvWOY8MHs5ncvi+UvBZ1hgrA4M1XxnUJf01JK3rx5+aJDncy4uAPM0oSJpdS9e/PtwFuiU9tL9GHvczR32Ak6uaBhRKkxahomd4tOccymFNjo4m0LnU+10OkkC51IsNDRGxY6fK2pKQlmAmGYxs1ZLTUkwcx9ilnq27Uv6feulh6PIUf0JqLb1x3hmiAWXh2ORxglPafeMUzYgDUfp+OxglVBaZggfGdXKl+InKLnO1qKMK1cbRSNGWQmxlXavH2Nxo4rpl69XK+BevuNKzSg+wWa/eFJ2jrzCF1ZvocKt28TaUnSRV491DRMngzNQxpBjcWRzmestCsXfzuVGO1UoLNTdqmNUgttdCvHSlfuWOmCYqpgqI5ct0hNSyAJhGH669vvS01JMPObp9+k+K++kB6LIcnZ3cqBX1L3iQennO3BOQuBYcIPnNfBfbuGFckKWsPklGg9zl+OPqG5CBPM6sKFGqmhcYePhuWJxg6yNLyeHS7RignH6PgXB0SK3ZXleylj406qOLCFqg9tptojm1wySfVR0zAhxUftCzf2K0wVgAEBSOVDCkKpYqyyFFOVlG+juAwrnUm2UFSAzJS/DVNiRploxS0zJcHM6kkTye7mMRrUXD+jfNAeTG32sXAeor4VA2c564BhwpdK7o7HCmIFvWGCsMAsR4peBEabSoxEORo7ZZY6yC6zU67y//k6u7KwJSo2KI9RKDPJf74lWoowTZqY0cTkuEPHjjdp1sdGateuYZSqQ5tY2j7rMFmjNskXbV4Q7IbJEyFiZazEcWCnnDJHlOpmjpVi0x1RqrMpX6f/HbuJiFUtHfIyBdDfhmnO0h1SQxKs3PPws9Sr47s+a/IQEJCOV5hV92kHXrjm42YZz1BimMhAfOcGw5cui9WMQsIwQTiRqpGzHkHRJpila1k2ilYWwlgEg6gbFjp+y0KnEpXFcrKVYtKsFHWpgo5erKCTV8x04UYlXU6qphvpNZSSY6HMYhsVKuZK9vtbMkwTJnjXSnzYsDwa/EFWk3//bPgJET2SLtq8JBwNU0tCgxTUcZjq0v+KDXbK09pEpCpNMVYJuVa6mmkVdVWIWEUrx40rZsqfhqlIZ6G/vj1QakyClaf/0U7MT5IdgyHLhQPKAaUcTAEUjjFEkmCSRLc7NkoMEzHgpjiLFcwKGcPklFVZxeKOu+yECzcS820uLXBX7NbRwk2ltGhzKS3eUkZLt5bRl9vLaPkODa3YqaGVuzW0dp+Oth010L4zJoqOraCYW1WUW2xp9o7OjBnpTcyOq7Rtc40mT9HQ22/FN9m2++PDbqfauUqkGaaWhM/VmfKHO/VYiFbV2pXFqMNc5SvG6naRjW5kw1BZ6WTC180p/GmYTsWm0kNPviE1JsHId379okjFU2PeUjBhzs4U5tvW9KP3qXBcoVYVBgmRJDZJDBN5cLMHVigo5AwThMUgCuvD/cv1TLJrbaqdhsldTl8pVxYscluwcGF2E7PjKuiIN2JkvnQbG6bgFc4rLJphshrLF4apzGSnmYu20P2/elFqToKRdm/1IO2eVdLjL1Sxntt/9zPBcY8ofoVyfUU6KD53mChcJnB8uHtO4GfwswC/q1YBxxii21ybyjBERXo7ZRRaKSGzlmKTqkXGyJ7TJtp6zEi7T5noUIzjBuctZXt6gYXytfKMkVAGN8GbWYqwWEGjkDRMTjnrO2QnYDiA9DuZQWqMLwzTrt3FUsPjCv363aH+/e9It6HRg8UH9UtATcOERSPra/nCMN3JN1HbvhOlxsRX/PTJV+nFlzpT9/Z9qNs7vcXfETWSPbYx33/8Zbq87HPpsReyRG+iirRk6ecDcOcX54KxypEyg3Q5FGYjKgTjgzRpRC8dEcyvwWPQzATGCNdoZwRJ9hwME4nczrfQ4ZhyWrlPRyv3Olh/SE97z5go6mIFnYgz01HFPB04X06bogzicV8pjwEwVEnZtR7VLgcj7g6KZ7ECoZA2TBDW+7gbGo7dk44E0DDFXjFIDU9rvPlGHA0ZkkPdusnnLk0aeJqqD2+WL968RE3D5O4cpnCXLwzTydgU+uXfOknNidr86W9tac3kiZS8dhEVbF9Bur2rSLdnlfj76YWf0ssvd5b+XH1WjB8fXo0eFBBd0hfrpJ9Pa+CaK1CM0F3qbWcYpikwOQfOldOMlSW0NdpA127X0J1Cq4g0yR7vBDWqmcVWSsyqFT8//asSYbAKNKEdccJ1g9PxWKGgkDdMTuGuJk482QkZqgTSMBWX1EjbgbdGm7fj6aOP8pqd4dSr40WqOBD8hgl3xllfyxeG6bMVu6XGRC3Qze7nT71GS8aMpfL9a6THjBPjvtU0oFs/MYxW9ns6tOlFNYfXSX82lKm6EUsao1X6+TAMox4wPJcSq2jyl0X0xWaNMEmyx7lKgdZO6xTDNOqLQoq+bG62uVOwgwg0ixUKChvDBKFrmAntxyUnZSgSSMME9euXIDU9LdH+nRuiQ97bb12VbocJS1izW7p48xY1DROnCDSULwzTP9/5oIk5UYtvPfoCdWnXm66vdH2wbObmL+n5F5tGvH7z9FsUs/Qz6c+EMvYT28iYWyD9bBiGUQ/UHW2LNtLSHRrRxbZM8hhPQWqeSOnbpxNpfrLHBDM1HF1ihYjCyjBBWP8jfz4cok2BNkzLV+RJTU9L9O6dSgMHNW0nXp+R750l474tdxdu5fu3kEWFVuNqGibUZLgj7MYSg52KFPRmu4h4hpPUNkynL6fRAz5q9oAo0fvd+1PRjhXS46Ql9n86s8HvwkDdhaPHUM3h9dLHhzKWi8dIy9ElhvEpiAR9sq6UNkcZKKfUJn2Mt+A5jlysoBlfFYsUP9ljghFOfWeFksLOMDmFTl+h3oUp0Ibpxg2T22l5I0YUULeuidJt9en6ziWa8cEpmjQ8gd7tHEM5W7ZLF3XuoJZhQnG6rFNcS8LjL91u2NXw0DULnUy00KV0K93KsdGdEhsV6u0iBQGPhwkB+AiAJ13I/CU1DRO647XvP7mBMVGTN9/oRqZWUvBa4um/txO/B6l47d/uEXZ1S06MuXnSz4dhGHXIKrbRh5/m0+p9eul2tbmaVkPjFxeJOifZ9mADjbtYrFBR2BomCDOb0NkpVKNNgTZMJpOF+g9wPS0P9UuTJpfRW2/K0/Ea80676zRgQIYwT9dXep+mp5Zhwl2vFnaLVDLD1BIwUxgkezbZQrGKobqebaXkfBtlKKYKM5KQ765RjAWiVeVVjogVniNQhkpNwxR7K4ceePSlJkZHDf7097bNR5ZgfA6tJTqgmKn9qxWUP6OaRo6Wjh1H9z/yHHVs01MxXsrjGm0PB2pjosTxJft8GIbxnjyNjVbs0dHB8+XS7b4ADSUQafpkbanXNVK+xmB2/3uWxQqkwtowQTghQ7UhRKANU22tnZYvz5GaHRn9+qbTwEGZ0m0y3n33NvXskUwd2sTSqYX7pQs7d1DLMKF1srty1zC1xCGFqOu1wlCdSrTQuRQLxaRZ6LJirOIzrZSQaxVDZ3OVL+QSo10xeHafdxlS0zBNnLuW7nm4aXMFb/nxE6/QsfkfNz02YJT2riLatJho3UKiNV8QrZ5PtGER0cGmkaiMTUupf9d+lLnpyybbwoLoTVSemSn9bBiGUYeNUQaBv5sxlBhJzG6atbrEZymAasB1wqxQU9gbJqewoA21OSCBNkzQ+fM66tA+Xmp46oPUvQmTSkWUSba9MWg//uFHeaJJRJs3L9P+Tw7JF3duoJZh8iRNQE3D5CowVoeuOUgtVByND6WWYUrKLKPnOgyVGh5vQd1SOaJHjY+N7cuIVikGaeU8B2sXEGH4bAsDlK1R4ZmGBywxh0mnqZB+PgzDeA+61s1cWUylinmRbfc1onX5+XIxsylQr6ElsBbjVuKsUFPEGCYIXfRCadCtLw3Tsm2ldPlGOdlaMUwaTS2NGpUiNT316dIlgYYOdT0a1b79DRo2PJ/atLlGbypma8uMI9LFnTtUXb8o3Y/ugAu5J1kCgTBM9UktCA3DtP3QRfrh79+WGh5v+NFvX6GDc2c1PCYQWdq+/GujtPoLh3k6En4NHFwmehOZE6+TxhS8d54ZJpTJLrHRhCVFlORhHREMDtKys4qtIq3PU8ODn120TUO3MoKvngndjD35nmWxAqmIMkwQ/EGoDLr1hWFavLmUNu8ro2OntJSRYRaNBlrT3r0lUtPj5I3X42jA+xnUtUvrzR6c9OmTRkMUg4VIE/5/zeSjZG/hjr8rmJNuSPejO6DDoidiw9Q6xXorfTBxodTweMuzz3cUs5QaHBN7Vn5tlpCGh7Q8L4+xUMd2ahcZCkulnw/DMN6ByM6uk0bRQly2vSVyy2yi/mjJdg3NXFlCk74sEl3v5m8qoz1nTJSa617LcLyWwzHltOWY+6/F13CzB1YoKuIMEwSPUBkCdU1qG6Yvt5bSoWgNxVzU0aVLOsrMdM0wVVbZFDN0vYnpcdK27TVRu+RqOh4YM6aQevX6OnK1YsIxskZ501p8k9czZTyNLkFsmFonu9hMP336Hanh8ZbZQ4c3PB4QRUKNEswS0vF2f9Vwe4RSc+U0N3tgGB+BOUhLdmgovcB1c4MI0vErZuo/I5c6jFK+R4dl0NsfNaT9yEzqOy2XdipmTPY7mgMmbJpiuhD1km0PBHpz3ZcKixViikjD5FSwN4NQ0zCt3FFG0ac0wig5cdUwQTEX9dSmjbz7XbduSdS3b7p0m4yuXRNp0hSNYrCu3f23L8dFU60Xs5hEXUaZd92IYKI9VX3DdOCqg8afky8JBcO0ZMNhqdnxFrT/TlqjmKP6x8S+VY4UPBimjYsjOw3PSfRmMuYXSz8bhmG85/zNKtpw2CAaL8i2N6ZIZ6cNRwzUaUxWE5PUHHM3lFJGkesd8BCdWrVPJ90WCNydcchiBYsi2jBBCA3jjofsxA40ahimRZtLadO+Mjp7XtvALLlrmKxWO33ySUYD4wPQ7OHDD3NFi/DG22S8/dZVmjxV28RgLfXCMNmPb6GKtGSv6jJwDMAUeCqtzkIb9mho2rxcmvRJDk2Zm0sfLymk1QcMtO9yjfRza449l6pp+U4dfb6qmBasVz6/6PJWDViwG6ZSo43+/OYAqeHxlp//7jWyNW7SsLNe7dIO5e/1t0UotbEnlM+Co0sM4yvWHtTT2RuV0m2NweiIlYqRaTciU2qMWuLjNSUum6bMYisNnJ0nhtvKtvsTtBJ3dc3BYgWbIt4wQejWEoymyVvDtEhhy/4yOnehoVHyxDBBCQnl1Kf3zQZGp3efVNFOvP6/tUT//ndo0mTN3dolJ8vHHyOLhyl51VfPktbgeWEr6tk8jS6h9frhwyU0aWIafbI4n1bt19OGoyZad9io7H8NjZicQSMnZdCOc5XSz64x+y5X00dj02nC7Gyat7qY5nxZSB+MTKO5K4qkj3dyKs5Me/YU0c4dRZSf70Ff9FbkrWGKS8qjex95Xmp4vKVDm54Njwk0e9iy9Ot0PFnnvEgjehMZ84qknw3DMOowdXkxZbg4/wjzmZCCJzNErfHOyEzaesxApSb5727MjK9KKDaxSrrNn3haI8xiBYPYMNUJKVXBZpq8MUwwSxv3llFMjMMcxVzU0omThRR1NIcOR2XTEYXkFF2rXfLqC+Zq69ZCeutNh9lBSt3IUYUiylTf/DRHhw43aeLEMurY8VaTbasnHSWbmwX59hPbHK3EvazJwKBad296YV8UFFTTnDl3aN26PCoprZXWMO2Pq6EF68towNAUxUwZaP+V5qNN206Zqd078cIo1f/3nRcqadRUxXgp5mvziQphqhBx2htbTVuU/5/0aS6NHptKhw+V0rFjZTR1ym06Hq2hstIaKi+3Uk2NTYAooafy1jB9tfWY1OyoQZP6JUSbNi5xGCbMWwrjFuGuUhsbTVpdtfSzYRjGe1JyLDRjZYl0W2Myi6w0dmGR1Ay5Sv+ZuZRV4po5O3ShnLYcNUi3+Qudsr7COovFClWxYaqnYDNNnhomp1k6r5ili4pR2rojicZO3Uvv9FxIf39tOj39wiR65uUptOirY2Rx8wpWUWGlGTPSRYQIaXWdJOZHBkzVRx/l0aBBmaKrXv1taCu+1eW24pvIdmon1Vw5ReUZGaQ1ejfNHI0e0G7eXSE6t2hhNl2+bBD/X7+GScbaw0YaPTWTPlleRHsuVjfZvvFYubI9gz5fVdJkm5OFG0tp3Mwsmvp5Ls1cmE9TP8ul8bOyaP6aEkrI/jox3GCw0L69xbR2TR5t2lhA27cV0o7thZSUpLxhD+WtYfpo6lKp2VGD1ZMmNjxGhGFa7DBMaPxQf1sE8nXKKqfjMYyvOBprppV7XasVQtpet/HZUiPkDpi1JPv9jUnIqqUFWzTSbf6CW4mzQl1smBopmNLzPDVM63aX0ZnzWoqJ0dIXS87RX1+ZSj95chD96LcDGzBp9laqrXW/AlOnq6Vp07Po3XfTmpif5vjgg2waMbJA2kmv7VuX6eDc5gfXWs/spapbccqiL4WMOfmkL9YprwHpBd4tANHww5P2prk5VTRlym26ddN0N0LXmmECO85WCqMzbPwdWnPQcLcuCZGn94em0JLNZU1+pj54PFL71hw00qp9elp3xEi7LlSJbY1rmPC6EF0qKqqmrMxKYfD0es+7WnhrmDoMmCw1O2qwe86MhscMDNOmOsO09cuG2yIQ69l9pC/RSz8XhmHUYc0BPR280LqBQbvvTVEGaTc8d8G8J9lzNKZQZ6dP1paKuinZdn/ArcRZoS42TBLBNAVD9zxPDNOyraV07KSjwcPmbYn02F9GNDFKTiZ6aJignNwqGjw4qYn5aYxzRtPEyWX01pvyLnud2l6iC0v2SRd7oDre+7Q7GeYa9+94FRZW06iRKWKGVX25YpicrFTMTr8Pkqlbr5vUq28i9R2UTKsV0yR7rKsEc9OHAm0tPd/pI6nZUYMTX8xpeMyghmlzXUrerhUNt0Ug1SoMdGYYpmUwJPZknFm6rT6oO1qwtUxqgNyl16Rs6XM0plhvp7nryyg/QI0fcBOaxfKVcN8aJQe1FjvV1Dr+xP+7UXHiktgwNSPcDUG6luzk9xfuGiak4u2J0tDFizo6e7aEnn1rptQoOfE0wgShhgfpaO+927AJRH0wn2nAgDs0aHBWkyYP9enV8SLd2bhTutgDvjBM5dWOk8wd2RTTcOxoGcXFOdLw6ssdwyS4WiuiQ9vPmFVpQR7Mhik5S0vPvPW+1OyowYG5sxoeMzBM25Y5DBOG19bfFmHYj28mfZFW+rkwDKMe8zaW0TkXOuRh7hKiPTID5C7tR2RKn6MxiCzN21Qm5jLJtvuaGuX7kcVSUxbFEOUV19KlWxW056SB1u7X0oLNpTQb3YWVP9fs09DuE3q6dLNCPM6bGm6n2DC1IMwLCGSkyV3DtGFP2d2htPMXn6UfP9E0Da8+3kSYIBgI1MX069ewjgmRpD590oRRwoym5iJLTgZ2v0AVB7ZIF3xAbcNU4YFZgmASq6ps0kYZbhsmlQlmw3TpZjY99VJvqdlRg43TJjc9bhBZgmHCPKbG2yKI6qvnlM8gcGk4DBMpLN6uoRMuRpgWbdVIDZC79JmSI32OxjgiTKVUoPW/YRKtxOu+R1gsb4W1yJVEM326tpg+/DSPuoxteYYZtuNxH68upthbZrJYPD8a2TC1IqRtyS4C/sAdw7R0SymdPudIxbtwQUMvtp0jNUn18dYwOZWXV0UD+icI84MUvO6KSerYofnIU2MWjTkuXew5UdMwwSz54uKNxhFxGWyYZJy4lEKP/bOr1OyoweKxY5seN3sxuHa+YphWN90WIdijN5GuJLCdsRgmUlhzQEeHY1yrYdp81CBd3LnLRBdrmIoUwzRnbSmVBKCGqcr7JQaLJVSis9CsVcXU1sP6v7bDM2n2ymLRLMwTsWFqRYgqoLuL7ELga1w1TF/t0dHOQ45UPBimPftu0x+eGy81SfXxJiWvsbKyKmn6tPS7LcddBd3zbqzaLV3wOVHDMCFSKGqWfHyrS0ShanFXzU4lRjvlaW10p8RGyflWup5tpSuKqUIk6kKqhc4mW+hUooWO37LQUeWzPnxN/vm6QjAbpuiYRHr0H12kZkcNBvcY0PS4ObiWaO2CiI4w1cSd8bqLJMMwrnEstsLlLnnnb1ZS9wnedclD04hDMRXS39+YW5m1tHCr/7vkoXbJky60LFZ9VVbb6HRcBfWe7H1nSdBtXBZFXzKRucq9g5MNkwtC6lkgOue5apjWHdDRidOO6BL4cuUleuyZkVKTVB81DROk01toy9ZC6tb1utQcyRjZ9yzVHml5YK23hgmfHWrSfOyVXBIMFZqKYFBueZVdeW3K+1LeG3LMC3Q2yiq10e0iGyXmWelalmKu0q10LkUxVQkWOnK9+eMhmA3T0fMJ9Ku/d5aaHTX41/Mdmh43olPeEodxarwtArCf2ErlmRnK/vf/HWWGiURu51tp+opiEUGSba9PZrFVRIdkizlXGfxxHmUVu5Zit++sibYdN0q3+RLUCgfD9y4rdGUot4r6pI6jWk69cxek6q3Zp6WKStfXTmyYXBTukvi7nslVw7TnOOYtOcwSmDn3GD38h6FSk1QftVLy6guFdckpFTR4cKLUINXnzdcvU/xXe6QLvvp4Y5iMVY7FfigJpgplUgCvHcceaqRgtESKqLIv8jR2Yaxu5lgpVjFVMFq+lDeG6ciZm/TI3zpJzY4afPPRF6jm8Pqmxw6aPzT+twjBEnOEdGWuzWhhGEYdZnxVQukFrkV1j8ZWULsRmdLFXGvg53acMLpkzsDU5cV0Odn/g6vxncVieSqrsgjaeEjr8XnSGu2GZ9Kqvdq6Z2tdbJhcFO6SYLGqlVwUfIUrhumQwsU4w12zBCZM308/e+oDqUmqjy8Mk1Nms402bCigAQMS6O23mjZ9wLDaT4edIPPBzdIFX33cNUwwtoZKR2ocSx15Y5gOnb5OD/+1o9TsqMW5RXOlx06kUpl0XfpZMAzjO9Yd0tPZ6613ynOycp+OOo52bzHYRgFd9nJKXIsuZSuP6z8zT8xikm33FfgOZrE8FTK7Tl4up/YjfWOWnLQZlkkHzxpFK/LWxIbJDeGOv1G5CMguDr7AFcN0PsVCCQnGBoZpxISdrXbIA2qn5DUWIiWY17RtWyF98EFSg9big3uepzsbd0gXe41xxzDh84FRkjSyY3khbwzTwVPX6OFnOkiNjlpMG/yR9NiJROzHt5Cu1P/pNwwT6Vy4WUkbjxhcbq5QYiDacFhPPSe6VpuBxSM67N3Ot0h/n4xdp0y09qD/B1dzdInljeJTKlvtgKcWqCe8nND6sDA2TG4K6VGyi4MvcMUw5WttlJhoamCYho3bLjVIjfG1YXIK/fJ1+lqKvWygsePSqF/XGMravIPsR+ULvsa4YpjQmAOzHnzd1CFS5Y1hijp3y6c1TOBfz3ekygitV2pM1Y1Y6efAMIxvuVNoFc0V7riYlgdQvxqTUEUjPi+QLuacDJydR9GxZtHxTvZ7ZGQWWUWaYE4ZR5dYoaPyShtNWlooPQ98AaK2mN9kLG/Z5bNh8kAVfmo13pphOnazVpiRxobpo7HBZZgay1pRQZbMFLLFnSD7uX1kP72T7Ce2EUXLmz/UN0xIt8NAYTRyQH0SmidwNMn38sYwnYpNpcf+1U1qdNTi4d+/TjFLP5MeP5GE/fg20mldTwliGEZddp8y0aYjnrXzv5RYRUt3amnC4iL6YE4+jV1YSPM3lYn5TgVa90wP6psOni+nbdH+jzbje5nF8kS46X3majl1Heef6JITpMa2FmViw+SBsED3R9e81gzTlTsW8VoaG6bh43dIDVJjxkzdSDVoHxcoKWeGzVxBVk0x2fIzyJ6RQHT7GtmTL5P9VgzZQMJFqs1JJ3O1XVyEMUwYoX42Sf6VN4bpQnwGPfF8T6nRUYsHfvk8zR0+kixRkuYPEUT19YvSz4BhGP+QXWKlKcuK6eadWul2f5FbZqNF2zSUmOXf16FT1kbcSpzlqdBCHENpZabG10xfXlT3KuRiw+ShUCfj6wYQrRmm20VW0YyisWEaOXGXSzVMXfotIHNljeMNBYsUE2W3Ke/LYlGoJbtV+RPVf6yAyhvDdCUhl37/ch+p0VGTV1/tQsU7v5IaiUjAfnI7GXPzpZ8BwzD+4+yNSpqqmKZ8jWuNGXwBaqk2RRmo1Cjf7itEK3G+ocnyUFqDVbV5S+7SflQmGcqbX2+yYfJQiHAgT1d2wVCLlgzTkeu1VKR3fLCNDdOoSbtdMkw/fWownbmQRFashlmsFuSNYbqeVkR/eq2v1OSoyX2PPEdRn38sNRORQO3lE6TTcToewwQDO08aadU+nVs1R2oAg7T/rImmLC/2+3PjJjKyQFgsT3X+WoXUzPgLdMxrTmyYvBCiTLKLhlq0ZJhO3KpVLk6O2ziNDdPoybvpJ0+2bpjAU/8cRSs3nKBbSTlkMtVQTY2NLBj6w2LVkzeGKS1XT39rM1BqctTm2Rc6khVDayWGIqyJ3kwVacnS/c8wjP9BdGn5bq1inEzS7b4AZunkVTN9tr6Uckr9H91COh6ny7O80cItpVIj4y8mLy2seyVNxYbJCyHsrPfhMNuWDNOZZAuZquSGaczkPYphGiw1SI1BJOqtrl/Q2s036dCxHBowfA117b+ABo5YIZpCLFh+mDbtOEcxMUlkLNJSlbGCrAFoFMEKrLwxTAWaGnq+40dSg6M29zz8LOVuXSY3FWGM7dRObvbAMEEGuubNWVNS12pc/hg1ib5sprkbSikpOzD1U2iIxWJ5o/GL/NcdT0a/6bl1r6Sp2DB5KfRMkF041KAlw3QxzULVtXLDNHbK3hYNE0zSL58ephijlYoZukMHjxbTrHln6PG/jpI+/hdPDab9n26mS1/uvsuVVQfo5vbjlHo4hjLPXqeCa2mkSc8jU5GGqisqyWaxkk1ZZdsB6pKUl8p5zaErbwwTeLvPOKnB8QWR2C3PnMiDahkmGEHUZ96mMlq6Q+uzmqZSE9Hu0yYaOa/QrRlNaoPvCRbLG/WdniM1Mv4Cs5+qa+SLVTZMKshXtUwtGabL6RZyZs41Nkzjpu6ln0oME4zS75+bQL0Hr6MvV1+nJSvj6YMxO+ivr05vNoXvJ8rPfNT70wZmyRViV+yl+A1H6ObOk5Qcl0fp6RWUlWWm/PwqKi6uJo2mhvT6WjIaLVRebqHKSitVVyMd0E42jukHnbw1TO+N/FRqbnzBpS8/l5qKcAXRJa1OOack+51hmMCDWUtbjhnoqz3Kd3RiFRXq1KktQuvwa7draHOUgZbt1IrOeLLH+QMMjWexvFWnMf5tJ96Yzsrza43yshQ2TCqo2ke1TC0ZJrQUd97NaWKYpu0TDR0aGB/FQLXv8yUtXnmVPlscQ+16LqEn/jFGMVENDVJj/vqvUbR95vomhshllu2hS0fTG7w+EBuroytX9HT1qoGuXzfQzZtGSkgwUXJyOaWmljcxWFptjTBXMFYwVYhasfwnbw3TmNlfSc2NL7i9YbHUWIQrlQnx0n3OMEzwAJN09nolLdutpUVbNV63HU/JtdCyXVpaoPyuY5cr3J7TpDbc7IGlht6bGvgIU2U1R5h8Jswc8MVcppYM09UMy90Ut8aGafz0/Yph+uCu6cHfx8+Mos07M4RRqr+tJX765CAa8e5nFLNUYoRcpRnD5CowVo25fFlPJ89qacMBLe09qfw91kSXEyooJaOK8osVY1Vu5SiVyvLWMM1buVdqbtTm3oefo9rDkTOLCdElQ5FGus8Zhgk+Sox2uphYRSPmF9Kna0spPq1G+rjmyCq2CaM07LMCOhZbQSWGwBolgPUPp+Ox1NDYBQVSI+Mv3lUMW3Niw6SCsDQ3VckvJN7QomHK/Dpk2NgwTZxxgH6mmCKk4P35pSk0e/5ZUaP0x+cnSY2Rkyf+8hG99cYkGvneZzTnw8W0cNRyOr1gh9wIuYqXhqk5jp/W0sJNpc2yaHMpfbWzjDYe1NKeE3o6esFIZ6+W09VEMyUpxiorv0YxV7VUpLFQmd5CepOVys02MTStVkSw6nYuS8hbw7T14AWpwVGbZ/71jtRYhCs18edIq3dvwcUwTOAp0Nnp1FUzfb6xjOasKaV1B/W076yJTsaZ6dyNSopJqKLzNyvp9LVK2n++nDYc1tPc9WU0bUUxHVD+PxBd8JqDZy+x1NK8DYHtkjdhMXfJ87l80WK8JcMUl2G5276zsWGaPOsg/ex3HwizNH3uKeoxcA39/PdDpSbJydP/GEmLxiync4t3yo2Pp/jIMJ04o6XFiimSmSVXWbq1jFbu0tD6/VrackRHu6L1tP+0gaIUc3Ui1kQXrikGK8lMiemVdCe3mvJLlIWpYq7KzVayWCPr28Fbw3Q2Ll1qcNRmxHuDpMYiHLGf2ErlGRnS/c0wTGiAOqSMIivFJlWJ1Lo9p020/biRtirgz12nTBR1sYJiblVRWp5FPF72ewIFZi9h/cNiqSGsvWRGxl/sPK6veyVNxYZJJcG86FRuMd5i04d6NUxJSQ0N05TZh+mJv4+hpauv0xtdFjTbMQ91Ts++/TENHrWdvvpkH11YsktuerzBh4YJUSSZEVIL/P7FWxzG6sttZbR8Rxmt2OkwWat2a0T0at9JPZ24ZKLYmxXCWGUXOExVdU145Sd4a5ju5JukBkdN7lE4/sUnUnMRjljP7uPoEsOEITBF6HwXbOZIBtY9KEtgsdRQidZC3SdkS82Mr2k7LJO0hubnkLJhUlHlKqfltWSYLt22kHMcUmamuYGZ+HjecZo9/wy91W1hA4OEFL3HnhlJ/3prNo2YtJ8Wr4yn6XNP0ttdF9CnI1fIDY+3+CwlTyM1OcHEUsVkIXq1M1pPR87XpQQmmSkls4pyimqUC0OtMFdIBzRVWMlcaaOqGrtICQy2GixvDRP44e/flhodtfj9X9tQ1uYvpeYiHOFBtQzDBJpg7o6H71J8vyL1Hjczb6VX0YXrFXT0opH2nNTTDuW7ed9pAx04Y6Loi5WUVWCj3CJHqr6h3NFgiuVfmatsNGtlsdTQ+BrMgGpJbJhUFO6yyC4ontKSYTqfaiFzXa94na6W4uL0d83Ejj23qfv7qxqYpZ//fgh1em8FzV10gRatiKN+H24SKXswUah3mjFksdzweIuPDNOxk8FvmFoD0auvdmponWKqth7R0e7jejp01kjHL5mEuULU6nqKmZIzqigDKYHFNVSmswhzVVPr3zormHPZMeoOz3X4UGp01KJft35k2r9Gai7CDeuZPRxdYhgm4FQG2bBaLLhRp4yblMuU79cpXxbSB3PyqOu4LGozTL5QBp1G59KgmToaPldPw+YW0tRlRbRyj4aiYoyUklktvnNZvpdNWUcfu2gS7b1ln5Ov6Dg6k05eUQ7oFsSGSWWpmZbXkmE6lWghg9lxAlutdsrKqhQd5GAmtu5Mpd8/O/6uWcLf5395mdZvTRMzmH7799FN0vTQ6CFmaeik5B06HvqGqTUWKSxRTBXSAVfscKQCrlYu4Ov2OToEwmTtP2UQKYGZBTUijxyDlGutjouOmoYKRb2yY9QdBo6bLzU6avDNX71Ay8aNI/tRucEIN8ypidJ9zDAM40+cpQGBFm4mov5k+Of51HtyNnUYlSldGLcEUrJ6TSqmIR8bqd1wh8HCQhq/b/QXBXTgjEFEnli+FaKC2N+yz8hXTFaMta6Z+UtOsWFSWWp2y2vJMB27WUtlpq9XxFgcl5TUiHqmT76Ipl/8QTFETwygF9/5hNZsTqIFyy/Tn16c3MAkOfn574ZQ3x5z6fSX++Wmxxt8ZJh2HSmTmoxI5ew1s/QYgoFHy1dTJVGFcmzibiDmZcBU4YsOxgrZfwDHkBNxTNUdV5gzpsaNgM+/8l1r8d88/RYlrFkoNRfhBqJLujKTdB8zDMP4C53y3RJIVVXbKK/YRgs3l1InxdjIFsKe0GNCIY2Ya6aOo5rOBIKBWrVXozxvLUedfKiz8eXUfqR6n2lLYPZSa9EliA2TyqpSIXXJSUuG6dC1WsrVNL21gwXuxp3R9P0n29KrXcfTht2x1H/kUvre453o2492pO/8ujN999dd6YdP9Ka/vj6Ren+wkkZO3k2Tp++l4xtjFJOjGByZ8fEUHxmmTftaNkzLtpXSiu2OP5duKfW6o16w05xhag10OIIZMihffMhFh+FHNMmsUKGYK/y/VqWo6d7oOKnZUYMB3fqTNWqD1GCEF5uo6uZl0hot0n3MMAzjLyqU74lACLVJ8cmVwiiN+sws0ulkC2Fv6Do2nz6YbaAuY/Kk2/tMyaHlOzWUnFkVNFG2cBJu5m4+oqP2HkQK3aHtsAxad0BL1S6YXzZMKstiVS8tryXDBBJzrXejAfW148AJ+uc7gyk6JpHavjeBHnz0pbsLy3sefp5e6TaS1u48TUfPJdGUzzfR394aQr/+a1eKW/ElGfZuprJdW6hw+1bK2bKN0jdup+R1O+nmql10dcUuil0mMUUt4SPDtHJny4Zp+0ENHYrW0gGF/ce0tO+olvZGaWjXYQ1tU7Zt3l9G6/eW0ZrdZbRyRxktV4zVkhA2VZ4aJn9yPCapgclRC3THu77yC4m5CD9sJ3eQMSdPun8ZhmH8CTIV/C2N3kqLtpZSr0nZImXu3Skl9P4MLbWRLIa9pYtimgbP1tM7I+T1NHj+vtNyaO1+rUgjY6krNMFatkMjTI1s/6vB4q1lYv6mK2LDpLLgig2VTS8sntCaYbqQ+vUspvo6cvIinbiYRM91GHp3UXnfL5+nP776Hu2MukQ5JZW0cM1+eviZDg0Wnj069KHyA2uo6tA6Mh9cS5rdK5su2I5upOpDm8i4z2Gs8rdto4xN2yll3Q7FVO2kuOW76IpgN11WzNXl5XsoNjr9bn2VGpy/0PLQWgBjdOyUzn1OaunQccVg1ZmrrQfKaKNirNbuUowVIlbKhRp1RYhYOUH7cYHkdfiLUDBMh87cbHC8qUXbN7s3OU7DldqYo6Th6BLDMAEGN4b92cwVUaXz1yqoR6OW0+0UM/PhJ2gSII8EeUvPCYWipqnNsJYjHUPm5FFuca1YA7LUE2rG5q4tobbD5fvdU9qNyKTPN5RQudn1D4wNk8pCxEet9uKtGaYj12vJLHHGyem51HXw9LsLyl/8pT2Nmf0VnbuaTkvWH6KnX+/bYMFZnz//ox11V4zTSy91pt/++W1hnGQLt5aoPbKJKg9uJpNiqnR7t1JJSjYVFFRRTk4lZWSY6fbtCkpJKRf1VrduGen6dQPFxxvoyhW9S8bqYHTrDR88NkwucFQxVYcVU3UwGpErDe0+oqEdh2CuNCJVcFUr0S9fEAqGac3OU9Jjzhu+99iLdGbRp9LjMBzhQbUMwwQDSOGWZbj4QmV6C206bKR+04qog6SuqPekYpE+984I38zv6Tu1jAZM1yqL9pZNE2ph0KacG0Ooq8oqG208pBVRRdl+d5du47Np/UEtmSrcc7dsmHwgc438AuMurRkmkFrQ9MQ8f/mmYpLeEQvKJ1/oRVsOnKeDp67R6z1G0Xcef63JorM5fvzEK5S+cYl04eYyxzcTlebVvTKHMGMI8w1qamxUpZwIFRVWMpksZDDUihbppaXVdw3WnTsOcwVjBVMVG6sXER+ZaaiPLw1Ta+xUnlv2mnxJKBim98eq3yXPGRWVHnthhvXcftIaOLrEMEzgQf2SPwxTala1mI/TaXSOSJGDOeo3raxB3RKMDP5t+KcVUkPlLYgu9Vd+f59JJdLt9ek0OosWbC6l8koONakpRO6uJptp5ldFHkeb3hmZKX4e9W+eNOxgw+QDoasYiullFxl3cMUwHb1Rq1y0Gn7wF644DNOPfv82HTgZT3OWbKN7HpYvOFviB4+/TLHL5kkXby4jMUzeCIV5UddqaOf5Ktp6uoI2Rpto3WEDrdqnp+U7tbR4i8NMsWEKLkqNdtUH1/7wty/T/k9nyo+7MKQ844503zIMw/ibSmWd42vdyauhQbObNnRAy+8B0zX03tTSBv/ee3IxjZlfTZ1Hq5+ehzqmwbP01HGUaw0mRs3LF5ERlvq6mlRJQz5x7zMeOCuPLt40e5UyyYbJB0IhpBqdxVwxTKBA1/AIuJaQRn98pQ8t3XCYRs1cTt/+zavSBWdrfP83L9G5xXOlizeXEYYpv+6Vea88rU2kIsr2g5P9cTWUkF1LOcVW5YJbS6mZ1ZR4u4quKydZ3M0Kir1WThfjTHThsonOXTLSmRgDnTpvoBNn9RR9Wm6C3IENU1PW7TotPca8od3bPUi3d5X8uAszrOcOkFZXLd23DMMw/gTrG4yn8JVwDzjxTpXULNUHnez6K8apy9i8uzVG3ccX0kefltOAGVoRkWotjc4duo7LV0yTThg22fbGjF1QQLlFuKld98ZYqgmdCbMKamjPST3NWVMsBhSPXVhAIz7PF/sd/z9ndTHtOqEXj1PjM2DD5APBwarRKc9Vw3T5jkUxaV8fDbczcumrLVE0bNpSj80S+P7jL9OFpZ9JF3Auc2IrUVlB3SvzTjhBbmRbpfugMWlFNuk+BWUmomK9nQoV85VfalWMlUU5oSyUoZir29k1lJKhGKw0GCyzMFiX4svp/GWHsYKpkpmk+rBhasidfCO92Xus9BjzFHTGOzrvY/kxF25EbyJz0g3SmJo/phmGYfwF1je+7JB3NblStO2WmZDGvKOYlz6TisXsJOe/tR+ZQ+9OLqEhsw009GOj6KSnRqoeOvHhuQbN1LXaBAIgdWz6iiLSGrimyZeCGUJHPXQqLNZYxABa/L/aYsPkI2FYqOxC4w6uGqbom7VUavw6ylSqNdK8lbvo/l++IF1susoPf/uK98NAT+9Urq4lda/MOxnNdjqZIN8HjWnJMLkCTBVAKhkoMdShGK0inV1Er9Jzain5TjXdUC7uV25UUMwVE526YKBdR9gw1Wf97tP00JNvSI8xT+nV8d0Imbu0kWxn9pChoES6bxmGYfwN1je+mj2UnltNH3zsXroVzEvfaWXUbXxBg39HdAlRJjSEmLCwlkZ+Zqa+U0sV8+R58wCYJtQzwYTJtjcGrcenfFnE3fPCQGyYfCQM/JRdaNzBVcMEEHlxXsDKKyrpD6/0li403eEXv3uNDHtXSxdxLhMbRVSpvBkVdLvQtegS8NYweUNKgZX2Xq6mXTFVtP2smbacLKeNx1BrZaTV+w20Yo+Olu/S0rKdWvpyh4aWbtfQkm1lYh4A2pPLDFFrBKthSs7U0AudPpIeX57y6z++SYU7lsuPtzCkJu4MaY1W6f5lGIbxNzBMvmgpjgjBpCVfR4rcAcZk4Axds+3FYZ4QhYJ5GvV5JY2YWyFqkt5TjE+3cQXUcXSuqFNyZZ4TUvLen6l1q5X5il1lVO2DqAfLf2LD5COhg4zsQuMO7hgmNH8oMzpORjSBePadQdLFpju88Vo36QLOZaI3EaXFO3IUvRSaPZxwMboEAmmYUgtt0tdUH9RZwVTtvlhFuy5U0o5zZtp2BuaqgjYdL6cNR020FgbrgJ5W7lUM1m6YKy0tacZUBaNhKjHYaOiUJXTvI89Ljy9P+NajL9Ci0WPIFiHRJWDiQbUMwwQRmDWpdl1OrfIdv3BLqTA+MsPhCm0VI4MIUnODZp20HZYpuuz1mlgkuuvBOA352JG+N0j5OzrxtZbCB7OE1LzWnstJ5zFZFH3JRNZ65ROs0BIbJh+pqlZ+oXEHdwwTOJNUS7a6q1i3wZOlC0532DF7unQB5zJndhGZTeL1eKv4TNejSyDYDVNrHLgKaoSx2n+lhvYp5goGa29sNe25VE07z1fSttMVtFkxV+ujjBSbHHwNARauPUAPPPqS9NjylBdf6kT52yInumS5cIhrlxiGCSqEYar7blZLO4/rqZ0KDRrQ9AHNGWTbmgMGCjOcYJJgomCeJiyopY8+MYnGErKfAd2U50Erc1cbS7w/K1c0gWCFptgw+Ug1VvmFxh3cNUwA6WAIlX/25SbpgtNVfvWHN6j28HrpIs4lULukKazbG96p2GCjQ9fk77c5QsUwHYnT0+GrJuk2d0jIDZ5FdZnJTicvpdAv/9ZJemx5yoO/fJ62zZwqP97CkehNZMrJle5jhmGYQGGsqvtyVkkpWdXUb7o685OckSPZNndAtArRp9HzqmjoHJOIKMkaPSDNb+BM1zvnLdpS6rP6L5ZvxYbJR7IoJ4TsQuMOnhimYzdrqUhvo4TUDHrQw7v7SHtaOWmifBHXGkjDu3RYtdlLlTV2upjm/n4IFcN05fQGOnMhVrrNHYLJMKXnGah9/8mqpuKBD3q9TzWH18mPuzDEEnOEa5da4XaRnXZfrqUFR6rps4NV9GV0NW26UEsHlHPiTLKVrmXZ6E6xnYoMipGX/DzDMO6DGm21VFVtp0Vby6itF6l49UGKHDrkeZPaVx9EnjDvaXhdq3JZCh5S+PpP04hIVeNtjXlnRCZduF5R9+5ZoSQ2TD4SwtWyC407eGKYwPlUC1VUWWnIhM+lC8+WuOfh56h3p/dIt8eD+TZndxPdueVIw1MhwRm/AhGzw25Gl0CoGKbEo+PpeOwd6TZ3CCbDNH3BJnrw1+qm4v3r+Y5k2OdlA5JQInoTVdxOVfanvcn+ZRwdLFecrKHfjzPSd/rr6P/20NL/6a6l/+2lpQff09FDA3T0kw/09MhHevrNSAP9bqyBnp9hom6LyumjdWaau7+KVp2qof1XLXTptpUySng/M4yrqGmYrqVUivoembnwhA4js6nP5GKXmje4Q8dROTRotp6Gz62g9oqJqr8NkaeeE4row09MwmDV3yZjwIxc0fqaFVpiw+RDeTu81lPDBDCbqbhUTy93Hkr3/dK1O/33PfIcvfBiZ8rb6mKNCDrg3b5OVJBBVK5XvQoUrdLdTcVzEgqG6dDVako7/L7yZ5V0uzsEi2GKOp+gHG/etbNvzI+eeIWOL5gjPwbDFAyq1RfrpPs40snVEg1ZY6b/r5OGvqHw34pRuv9dGCXHn/copun/9XQYqP/oqqF/66wRj22N/+qmpZ8O0dNfJxuFscJzfH6witacqaXjCVa6nmMT5zaiWjBYWaV2ytXYqUBnp2KDcr1STJzs9TJMuKFWSp7VZqcR89yrN2oJpMVhTlL3Ru3F1QJRq/dnaGncFzWKyWs6VBfpgM66p5bmNCHKtO+0QfXGGSzfig2TD+XtLCZvDBO4kW2h5PQ8GjtrCT32z87NGqd7H36OHv3jmzSq72Aq2rFCuoCTkpNS907VFS4i6LB27Ib8fblCKBimqCullBw1UrrNXYLBMCVllNGf3+gvPcY85X7FxI/tP4QqDqyRH4NhStWNWNJwOl4TSoxEH++tEpEkmJy/KeZmydFquppppdQCG12544hIbzpfQ4uVf5+2s5JGbDDTe8sqqMP8cnplton+PsUoIk6/GKqnh97XCYP1DRdNFR77w0GOqBWe+61Py6nnkgoavt5MU3dU0heHq2nFiWraElNL+68qRuuWhS4rr+mWcn5mKgaLTRUTDhgr676svdT5a+VSQ+EKaLTQYWQOdRmTJxo99JxYJFLnUFPkylBZb3h3SikNU859zHhqvA0znlD7hNeC1wQTBSPnbCyBWijUWM1YrqUSraVuT7BCQWyYfChDgA0TFg4JuVYyVVTTtYQ02rYvmkbPWEy9hk6j9n3HUq8Pp4v/37R1H8VvWUNVh9ysD/GRYdKW2+h0knfvHaZFtk/9gauGCal4t47NlG5zl0AbpmK9labO30APPPqi1Ph4yl//1Z7yIqgrniB6MxnyeVCtjJRCO/14sF6Yl39NM1Kacq5V1xLVKOuOlqiswXXFTvlaO90ptlFSnpXiFCOD9GWYGtQ8rT9bQ5/sqxIGCyYI5ur34wz00w/0wqC5Eqn69y4akR6ItMDvK2bsZ0P09NgIvTBoz0wy0vMzjNTu83Lq/5VZMXNVovZqo2LuopRrPcxedpmda62YoEeNLnnlZhuN/sL16BJMEMxR/+kaGjhTK2qGUKsEg4SIDoyIq40XvAWvBc894jOzSAGUbYdRwmtDm3NEpcRrVl57H+XnMPep2/hcunhTWSSyQkZsmHwoXFRkFxtX8dYwOUnMtbQc+q1STtrLx+SLt5bwgWEy19i9NktOjlxHKk0tnUuxUGy6ha5nWSlRWSilKwumHA0KwZXFiclRD3EXZb97umApSztEZZoSSi1wrQX6qYvX6NqJRdJt7hJow3Q5IZf++Op7UtPjKd9//CXK3vKl/NgLY2ovHpXuY4Zo1p4qYUzu6a2lUqNdao58BVLvMN5gX1wtLT5WTaM3manrwgr6h2LcHnpfL1ID/7OrRqQB/odinGCe/k0B0StXI1jgfxRzhtqrf003Ue8vK2jkxkpaFFUt6q0u38G1i0QTC6QBFhsdUbdSUHcNk+03hlET3Az2Np3scoKZuo9vvd4HoNECZiTBcLg696g+qGeCmUKqHowOapxgstAJz5vmEDBtExbWevSawILNpXV7gxUKYsPkQyFs3fhC4w5qGSZwPQuNIJq5wgWBYUIrdNQsnUxQ7z27wmHFVKGz4MlEC51VjFXMbced3muKuUIaTXIBahbQactGmSV2cQfYWbdQpLeLxYpzkVJWdIdKzg2j9Pg9dCROK32++pyJiaXYMzuk29wl0IZp9uKtomGIzPh4AuqWts+aJj/uwhlElwo4uiQDhuCxEQZhKvosrZCamkCC2XuIYN3Itorr2NaYGpEuOHl7JQ1ebaYuC8qpzVwTPT/dSH+eaKTfjvo6LRC1V6ihamyeZMB8PfCejn7xoZ6eVn7P63PQzMKRFghDiU6B687W0K7LyDKw0KkkK8WmW+lmjo3Si+yUr1y72Fgx3oByA29aY1ssdlqzT+tSZzxEY9C2u/1I99uOI22v54RCkT43/osaGjOvikZ+VikYM79a1CKN+ryS3ld+P9L6PDE+eG1o9tBeEmlqjR4TskWkjRUaYsPkQ6GTjOxi4ypqGqZDCjFpFuX3Sk7OABsmXHizS210IkH+2gMNGk8gWoWaKqTvwFwhCobI1YVUC11UTNZlZUGCu883bhdT0vmVdCP6Uzp6pVj6+5xEXSlTHlMk3eYugTRMBZpaeuyfXaXGxxMe/NXzNOH9oVRxYK38uAtjamNPKPuUO7bJOJ9qFVEbRHCQPiczLcFORTVRoWJY0otswlhhZAKuKah3gsFafaqaPt1XRaM2VlKfZRX01qcm0YTiV8P19O1+OuX9u2aqEOG6/11HWuDDirF6YrSB/qKYq+dmmOhNZXHX8Ytyen9lBU3YVkmfH6ymNadraF8crmmIwtuoUC//DBgG6CqIar1o8lamt9Co+a03ZoDhQT1QOw8jOAOma2nsF9UiJQ7GC4Np8btgjND1DgNuEW0aOscoHjfyM7OoT3IntQ+1SYNm6RV0HnXmi7pgrNsrrGAXGyYfKpgMk5MoZdGfVWole/14egANk015HTdyrB53wws2YEwPxVfRhXNHKGffm3TyUoL0cZ5w8mICXTy7nw5fLW+yLZCGadmmKKnx8ZRnX+joWVv7UCd6M5mysqX7mCGatN2RjoeoDCImMkMSDiBShZormKty5TvEVGkng9lO+go76RQznVFio+ibFlqlmJxpuyqp33IzvfqxiR4fZaAHFZPkaldARKqcBvQ/u2no/3TTirRC1GD9T08tfW+ATkSw2n7u6Bj4sWLkYFSP37JScgE3sIhk0AG4WjlWPVVaTjW9M7L1xgyoD3LMVHK/iQNqhyYutIh2360ZGfx+NGR4f4aOJi+2ikgUapBkj5WBNuOoZ+o7tUy6vSXGLlBnwD/L92LD5EPhy052sXEVXxgmJ1fuWEQRtA0BpwAYJosVefg2Opcif33hwIlLqZQUNZZOx1yVbm8NGK/o2Axhvm4dmy5+16mYeGVbTZPHBsowIY3yH20HS42PJ6DJQ+6WZfLjLcyxxESRvswk3c+RToGe6LnpRrHQf00xB4V6/9YvhRJmxWzdKbJRTJqV9sbV0lcnqmnWnkoxf6rbwq87Bf5hnIF+M1IvUvt+OFBH3+qrE80tUIfV2FzJ+LfOWvquYqoeH2mgZ5XPBlGrQavNNGVHlai52nwBnQItwtydTXakBd7ItlFKgU20ZEcUixtchC44zjzV3lMGqXloDNLcPDFMqE+assQmTJNse0t0GpUjIk4wW4Nn6UQkSva4xqDNONL+MMTWndeLFuOGcp7JFApiw+RD4Q6h7ELjKr40TOBEgoVu5VhJpzyZ3U+GCbVKZcoiGzVVqB2Sva5wAil3xy7nSLc1B4zS6Zg4uhE9V+Ezunx6s4guHYqvlj4eBMowxScX0Hd++5rU/LjLX//1DsV/NV9+rIU70ZvInHidNKbA1qIFK1hwo+McIiLjtlSKKIzMLDCugaL9HI2jW2DsbatIC9x7pZY2nquhZdHVNO9QlbKfzTTgqwphhF6caVIMllFE99AB8D+6upYaiFlYMGIYIoxW7KjdekH5XW0+K6fui8qp/wozjd1cSXP2VSnPW0NbY5AF4RgmjI6InBoYvKBG29PGD1OXFUrNQ2OQOvfelBKR9ibbLgOPHTrHRCPmmt36ufrg59DhDkNqUeOEv8se1xgYNUSaUDcl2y4DTSeuJCgnJCvoxYbJhwp2w+Qk+kYNpV7PIsv5A/LFXHO4aZiQUoJudUe9mK8UCUTHZlH8yWV0+uI10TyiJaPkJFCGaevBC/Tgr1+SGiB3+MXvXqOj8z4m29EN8mMtzLGf3E6GYq10HzNEXx6vEWli/6+Hcj5cq5WaAEZd8P1lrHSkAaIjIZrc5GttlF1mE2mBl5Rr+c7YWlp4pJrGbDJTj8UV9MIME/16uIHue1dH3+jser0VjBWGDaP7IRpgfFMxWd/trxMNMWC0YNjw+0dvqqT5h6uFsTqtmOhUxVRxA4vAgLQ83AB1V8hq6TjaNSMjDNPUUreMD1Lpxn1RTV3G5km3uwOef9BMHU1eZBUd8WSPaUyP8YU02o2UPhimncf1dXuHFcxiw+RDlYeIYapPwo180lw8R+ZT+8l6coeoq5At8AQtGCZcSGssdpF/jy/YmFSLsvCXPyfjPYEyTF+s3kf3/8q72Us//O3LtGbyRPkxFiFUx52V7l+GRJThg9VmsbhGXU2Jn9uJM56BlHTMpDuTZKFtF2vEzKnxWyrp3WUV9PonJhFtenyknn75kV7MukKDCkSj7u3jqKNCNLGxuZKBaNdDA/T0uzEGkW6IGVpomjH3QLWouULEChFKRK2uZtpE91OkBWaU2ClXaxft2Tk10DMQ6XVXecW1UuMgA00a3E3JQ+twNHDwpO6pOd6bUirah2OWkisNIfB4h2nLd6kRxOJtZXV7hxXMYsPkQ4WiYXJy5pqJbsbnUNrFBMq/EEvGmFNUc/4QWc/uJfupHWQ/voVsOalksdqpVjFGlTWOouQSg010vMO8I0STjt+S/35GXQJlmOZ8uYPu/+ULUiPkCo/+8U3aOnMq2Y/KjUQkgHNJX6yT7l/Gsej+03hHO3EstmWLcyY0QR0tolUY44DOo/vjamnDOUc79o/3VtKErWYatKqCui4qFyYLtVdoboHhxff3cb3BBZpZoN7qkQ/1IrUQ9XBvzy1XzFW5aPmOtMCP91bRkmPV4vkxa+tUosNg3S7CzD75sRnpoL24u0Gm89cqpKZBBlLcek4skm5rjh4TikSER03DBJCWN3peJQ2epRfd+2SPcYKo0btTSkQ6H15/a69lxooiqq71ML+R5TexYfKhQtkw1ScqvopOKBe50/EGOnNVR2fjtHT2ShmduVkh7h7ii+5UosMcoS4JLbhlv4fxHYEyTEvWH6IHPIww/eJ3r9Puj2eQNSoy0/CcVF89J923jIOYNJtY8GLhe0q51sgW3kx4Ul3r6BKoMaGeyU45ZTYxeDw5H3OlrBSXYRVNJVafqqHZiuFBN78O88uFsXrkQwPd2xupgXITVR88BnOwMDQYKYFo4f79gToR+YLJwvyvZyYZqd28cmHgpu7EvKsa2h1bK9rdw1RFampglfI5uaMNh/RS0yAD0SV3U+swT2nMfPUNE0Abcsxu+ujTcmrXimkCPSYU0CjFZLXWfGL8ogLSm7jxQ7CLDZMPFYxtxZnwJFCGaf+JePrmYy9LDVFL/ODxl2lbJA6mbYT9+FYy5BdL9y3jYHJdO3Gk46GVsWxhzTDNge/hpDxHK/Z1Z2pEJGnIWjO1V8wPZlw98pGefjhIJ44vpATCMKGWCmmB/9UN3QDlJqsxmJH1o0F6+tMER/RqwEqzYqwqadnxGtobh3l9juHBmHOFqGl6sV10C0RaINJOMQRddvwHO4gyuVPL9MWmcpfMTIdR2WKgLKI1su3NAYM1bkGNaPUt2+4tnUbnifS8IR8rBtqF9Dy8HqQIYrgtOu7J3jtmUpXqlIOVFdRiw+RDGb00TMeUC7xsccyEBlFxZaItuGyb2gTKMN3JN9JP/tROaopk3PPwc/S3V3vR8S/mNDEPkUhN3BnS6qul+5Zx1JY8OcaRjtd/BafjMeqDKFaZyU5piolBx8Co67W05UINfRldTbP3VIqGFgNXVlC3ReVikPCz0xwt2VF7hbormCtXBgp/QwGNS34w0NHIAmbt9Tkm5fdWiLTACVsd3QKRFrjubI1oqIE1wIU0h9FCzRXqrWTnSSBB8wd3apk+WaMXw2Ebm4b6oHbpg9kG8adse0ugUQMG0Paf7lqTBk+ACUJ63qCZepcMHczbQMX8jZhbIYbpItWwfiOL4Z/lU2GpBwVhLL+KDZMPZaiUX2Bc5aJyoZQtjpngBq3E406totTDg+nshXPSx6hNoAwTGDJpkdQcNQZmqV3fiXQ16hjZJeYh0kBnPB5U2zKX0m1isOq/ddGIBaRswcswvgaGQFfh6BSYVepoGnEj20qX09FQwkLRtyzCZH1R19jivWUV9KZirv48wSja4f+vYqpgmGRGqj5IDURk6/4+WvpOf52o1UIEDLOuYNKQFvjGJybqvbSCRm2qpE/3V9Ga05jLZxHnyh3FVAVioDDa1IuZji5o0pIiYR6aS7XrOCqXBs7QuTU4tjEDFLM0cZFFmCfZdjXoNs7RXAI1Ta40dkBkqcuYPPHeUWMFU/f+DK1oQT7i8yLKKWLDFOxiw+RDIVQtu7i4Sk6ZXXT4kS2QmeDi0FUzHbucR9dOLKTM/e0Vw7RG+bcK6WNbI+bsETp8tVy6rTkCaZjS80z04z+2lZokAKP07cdfowmfrqVivZWqr1+UGohIo+bKaVGbIdunjINJ2yvFQvLhD/V0U1mgyhazDBMK6CpIRIrQLXb58WpxbPf5soJemmUSNVKYb4XBwWivDtOEVutICXTeMHClFgug3u+nikn722QjdZxfLgYWzz1QRZvO19KpJKti9tC51k65Gjvlae1UoHOkBCJ6hbRAT2ux0IbeFSH9DKlpMA4YTAsjARBx6TYun4Z+rLxuL8wSgFGastgqDIlsu1qghfjUJXbRctwV0+QE77fXxCL6SDG/SO/7dLWF7uRyDVOwiw2TD6VXLpCyC4ur4MKFPGfkPqOxwskEx52sozctorEC5pHIFs+MfzkcZ1SM0mJKODaVLp3ZQ1FxGunjXAWDaq8fn0/HY29Lt8sIpGEC6/ecocf+2U2Yo/pG6Vf/6Ey9h82h6AuJ4nE6XRXVXoqWGohIwnruAOmUE7zxfmS+pkBHIm0Ji8A2n5mUBR23E2fCF9TnFSnHODrMImqFTn0rT1aLKBLSApGS2mlBuYgwIS0QnSNhtNCYAk0qkO4HY9XYQMlAGiGGCT811kDPzzCJRhn9vzKLodB4Phg6DDHefdkxSBht2eMybJSUb6MsxWzJ6q20CngPrWnKl46hrkhLG6AYGjR2QEc5pKqhOcI7LtQFuQJ+Lxo04Hlk29Wi9+RiGju/mvoof8q2u8LIeQVUVObCzmMFVGyYfChcQBpfVDwBF6d8neOOEO4MZZaiFaud0ovslFqAae02cecKLVAvp1spJtVxwYXBQg704WscpfIliAadjomnI3F66XZ3OXzVROfPH6fkIyPowrmjQT241kmRzkInLqbQxM/WUR/FIA0av4AWrTuo/Fsy5ZRU3n2cobBMtKaXmYhIwXpmLxm50UOrYDApakT+s6uGpu2sFGlRsoUmw0QK5mpHvRW6BeK7H+3YL6Q6OtQeuFor5l2h9mq6cr4MXWOmLgvL6cVZJjGj6keD9SJ6JTNQjcEMLBiwbylG7EeDdaJeC7WEf5nkaMkO04baq6FrzTRtVyUtPlpNm2NqlddhEa8LA4+b0ydrS+4aBTRNQOodcKWBgjugtgiNGYbPrVD9dzem79QyYZrQRU+2vTXGLCggjV75gFlBLTZMPhK6xsgWAf4CxdICkwOYrjwtUaZitDAdHcP74hWDhWF+uHt0QjFXUdfZWAUTh6/qKfXIRxR3cqVI+ZM9xkmgDZMTfJmXKuBP2XbU7NhbGoYc5thPbKPyzAzpvmEagnoQLPAefE9Lh69x/RLDuAoaWQDcZKiqIaqsw6yA9cCVO1bREv2Lw9U0cqNZpO6hPgqmCu3VZSZKBtIEAToJAhgt8B8KSC/89QgDvfKxSUTHZuyupHVnq2ncUs8jMe6C1L8x86poyGyDdLtawJyhlmnKEptH6YSTlhSSyexiERgrYGLD5CNZrPJFgDuUKIvOVH0lFZn8txhGwSjymdHqFJEszJdIzlcMVg7uZtnEhRYpgudTLXQ2xUKnkx0zmGC4cHcJES2E8DllsGWunVjkUo3TkTidSPe7emK5dLuTYDFMLaIcx1W34qRGwmMOryPasYxo32rH348G70wnGEVz0g3SGEPgswowqKtA4TwWZSh6R7G9bGHIMIy6wFjh/LueZRUlAJsv1NCCI1U0aVul6BaIduwvzTKKWVdoRPHYCD39fIieHnpfRw+8q6X/7qFtsd7ql+8VSE2DK6D2B9Ei/CnbLgNzmVAnNGimjtr5sAkEhtkO+8Qkuue527Bi7toSl5tmsAInNkw+Ei48soWAO5wu0dDotKt0U1su3R5InFGrQgPSBRWD5UwXRKpgMVq02kUnIcycuKGYrfhM612zdS7FUZMFk3VUMVeHIzCylbm/Ax2Kr5JuawxS/s5euCDd5iQUDJPWaCXr+YNSM+ExB9cQrf6CaNV8ovULibYsJdqzkujIevnjAwQiS+aUBNIaLNJ9wzQEKcZYjGGB9a5inBov6rwBaU35WptIa0KqM2qjEBHVV9jFkFRztV3cnZf9LMMwjgYPOG/uFDu6BSIt8NiNWtp9uYY2nKuhZWjJvtfRkn3AVw6ThVQ+pPU9MbTlluIy0Ja737QykWI3dI5Jwaj8v4baj3St7XiP8QU0TnS0M/g0PQ+/G/OWhonBtq4/z9r92rqVIyuYxYbJR0LoW7YQcJUkXSX1SjxH79w6QVHFoV3v4EwNRPQKwGiBYqAYrqI605VdSnRbMVpJ+Xa6nm2juDs2ikmz0pkkKx1XzNWRMDJW3jaGaEwoGCZDUZliHjY1MRNesX+1YpgUs7Ry3tfAPK1RTNTWLxVDtVb+c34E7cPL76SLCJtsvzBNOZ5gFXeqYZiilIWYbNHmKZpyO13NsFDsbQeXQbqFrtQRd8cB7rCjAD+1wEoZJTbK0zjMFX7eVOlId5L9foZhHKmAWAdV1jhuQpiq7GQw2ymjsFZqGpqj16QiGr+gRsxVQrrbO4p5Qqpd/+la0dSh9yTXUvwcA2RrxCwkRINkj1EDvLZRn5uFaXKt3XgGHY1RFkasoBcbJh+p3Iuhtbf1VTQs9bIwS2BFjrLYkjwuEilVTFaBnihHWbxg5kRqgZ0S8mwOg5XhqMlyRrCQKojGF0gVRGqBI12wVqQLoiZCZjz8waGrlXTq4k3pNk8JBcNUfT1Gaii8Yt+qpoapMesXEe1a4TBP/ow8RW8my/mDZMzNl+4PpnkmbnO0E//uAL1YdMkWZJ6Sp1GuE2kWVUCTnfgMq2h5juY7twttlKmYq1zlOQr1dioz2sX8HkSvsFg0KkYL3w24Q+9YTDpqTWSvk2HCgVqro6a7vnpOzJaah8agex5ab3cYKX88zAmaOmDuUjsXTBDmII36vJLGzK+ibuML3Ertcwd05hu/oFYM320t0gTDlJGnXAhYQS82TD6SpzOY8owWWpCVQh0TTt41TBNuX5M+lmkeRLQQvUJr4lwtiXRB0Vmw2NH0Au1R0fjihmK00PwC6YIwW+edHQYVswWjhXqsQyp3GYy6Uka5e1+SbvMULNZk+yFY0OqqRaRFaiy8Ael3iCjJjFJjkLq3eSnZD62T/y4VsZ3eI+qVdJoK6f5gWuZ3Yx3txPsuVzcdD+YkKU851yXmx1cgioXIFaJaiFrBXCXmWikl30ppBVZKL7IKk4UUwTwtjJaNShWjhUiWXjFZuDMPc4WWzbL3xDChgLVejc5n677ulNccfSaViNS7Doopkm13gplLg2bqRYqebHtjMPtp0Cy96GqHWVDNmTFv6TqugMbMczxHSxGtPlNyqNbSfFdBVvCIDZMPZFWOfQypky0EWuNQURF1STh91yyBHolnpY9lvOduuqAzTbAuRRCNL2C2UOOQr0UbV+RrO+qynB0GY9MdBgvDAKPdaN+OmqQbx+dKt3kKzKDs/QUL5ZmZUmPhNe4YJgX7xi+pIiGBKlISyXp2v/x3eoE9egtVXY8lfYmemzt4yNUsm+iy9Q3FMKFxjGzx5SmoX0L6nczYBJrG6YFIC7yqEK8YrWuZVsGtHCslK0brdpGNskptoharxGAnbV39VSVHq5ggBs2wYA2iL5mk5sFJ57F5NP6LGsXMuFajBBM0bG4FdZ/gWkMJDMntMaGQxiimacKCWtEWvK0PapsQaXIaM9l2sHR7mWPhyAp6sWHygRCC1npgmJK1ldQz6WwDs+TkBt+pDglgukQ9lmKwMCcrWTFYNxWDhRlZsYhgpSgGK9FKx29WiTRBGC2kCh69gQGBX6cLutphEI+DaYPpk72eoEAxDjVxZ6QGw2vcNEw1+7eTVjnPnK/LmFsgXpvtzB7RmMHtGqvozSJyZj27j6puXiG94rybvH/GLSZtd6Tj/eJDvTAGsoWXp6AOSWZWwgmYLpirm05zVWij7FLHjR/UYCFFUO00R4ZxFayPMvJrqOs4uUFBNAaNE7qNc6+bXheRBlcjIk6y7TJgnJDOB9MEY/PelFIR0VKzxgnGDF36Bs/WN0nPazs8g9Kyq+tWjqxgFxsmHwjFwO4Orc0w1NCY21elZglsyMuS/hwTmpTcWCWGvSKChXostHAX6YKKwUJ6Hdq4X89SjFaGlS7XpQteQLogWrnXtXE/k2yleOUxiIjJniNYMBSUCkMiNRze4qZhqj51VPoadWXlZMrMpMrEa1Rz9SxZYqKECYIZsh/fqrBF/Gk7tZOs5/ZT7aVjVB1/gczJN8mUk0s6pwljvALH8lN16XidF5SL7nWyRZcnIKUNHb1kJiOSQASrULnuyPYRw/iDUr2VJi8tamAenHQfXyBS5mTbWgORHBgg2baWQC0UUvpGzDWL+iZ04oN5ggmDqZL9jDvgPYl5UB8bRTTM+e/DP88nO2fjhYzYMPlAKOiVLQaaA/OWVudmUId6dUuNGZUWJ/1ZJjQpPvoOafStt4t3dhdE5KpBqqDWLv6ObbKfCxpMNmEqKFrl7nhO9rpnmMzX4+Wv04lyLmr1NaL2SF9qIEOxlgxFmrvoi3UiiqTTmklrqBWPl/4exiMwRPuBd3X0n101NGdflaqd6NB0QWYgIg1En7AvZPvIXYxmouQ8RLEcdVhodoGZWaJNu/Ic5VV2rr1imoAOelui9NRuREMzggYI6IbXc6LcTLUGOui11CSiNfDzXcfl0/sztDRWMU6IDI1SjA6MGEyPN2l7ncfk0YjPKmjkZ+a7qYa7Tihf4qyQERsmlYW7BSY3O+RdLjNQ/+QLUqPkpFfSWUo3VEt/ngk9ygqSqcyoLLgl28IJna6KLOcPyc2OGmBgbWtd8uqhKzFJXycTHMw9UE3/p7uWvjdAJ9JUZYstT8kuVa87XiiDhhNqmRi0W5c9R2NQk4WGFwnKc6NNO8wVuhXCXCEbA23aUV/m7BwIsKiGYUajDu4kGH7cuF1FvSY1NDZIhRs8S+f24FcnMFwwN0iDk213F7wOmCfMcJqy2EaTFllEVz5EnxCVQoqdO532EF3Cz+P3fPRpKafjhZjYMKksdIJxp0MeokuzMhKkJqk+XRNO04mSUunvYEKPsqI7LkWYQh1TVrZibHwUXQIHMLjWNcNk37BE+hqZ4ADpqd0WVdA3OmvoydEGKlAxbQwLcBgF2WI+0kCjCNk+cheYGaQMy57DE9D0Ao0unM0t0M0Q5upOXYMLRK8KdDYqVkyW6CKofHeiHsugfN/iJiUyO0SbdslrZYKPiipl7bOy4QwlGJAhsw1u1SE1BnOZEKWSbfMUGLGOo3JF577Bs/SK6XGk7qFF+WDl9faZXCJalrtinmAKYcLWH6ihikrOxwslsWFSWe42fNhfWEidEk41MUjPxR2hl+Oj7v5/h1snaUXOHdHVTfZ7mNCi5OpnVJZ9SbotXNAaLGQ5d1BudNQCs5XQLlxikBpj3b1e+jqZ4CBOWXz/bqxB1C/1X1Gh6sIXC+t4ZSEuW6hHEjAlmAMl20fuAsMiew5fg6YWok17XQdBZ6t2mCyYYhittEIb3Sm2UXYZOgnWDRxWXi/MFYwVDx0ODpIyaxo0WGivGKWhHxuFQalvMtwBqW+oFfLVjCXQTnmdeJ6eEwvp/Zk6YZwwRBc1UIg+vdNKSmCnMVl0I5WjS6EmNkwqCykFssWAjHR9NXVu1ELcyRPn9tK/rhxu8G+T0q9RpqFG+ruY0KI0aRuVpUdLt4ULFWlJcpOjJlHrida4ZphqThyQvk4mODgQb6H/7aUVhulAvLrpeIhMwCzIFuCRBBrKyPaPJ6CDoew5QgVHmqCFEpV9AoOVWWqjAsVcIXqFQcMV1XZHOqDyXp3I9gPjHXPrzWRClAYRnPrmwl0QpULaWzsfGiYZiEDhtU9ebKXJi6w0YLq22YYR01cU1a0YWaEkNkwqy1ApXww0pshkoyXZaQ0MUX0ePb2bXoj7OsIE3ks6T1c03LaYCX7QGMEXc46krFsgNUiNqbjOA6CDmfFbHe3Ev9lXJyJCssWVJyCakFbI0SVQbFDHMCFKcz0CInYw2Ug7RBSr/gws56BhpI0ielXWIEXQTsZKR8ML3EAVdViSfcg4uJNXS32nOZogIOWt37SyJgbDXRBhUquOyV2QTth3aqmIOqFVeb+pZQ064703NYdKdcobZ4Wc2DCpKJvd9XS81ho9/OLkTnrl2tEG/9b+1knaWZAn/X1MiKHVU1nqPuXv4ddlTWu0UGVCvJhRJDU4arN5idQgNcaQyedOMPOn8Y50vPeWVUgXVp6CxT1St2QL4kgCC39ETWT7yF0QhUG9kex5IhGkCWJ/xMNcYQZWtpUS6uqwUhSTlVZgpfQia4NarBJlH2qV6z8MVrnyuURqmqBZee9bjuoVU5GpGB2DKkYHg2gHzfQuUuUt6LgHA4iueKM+N4vaqg4jsygqxli3YmSFmtgwqSiE72ULgcag0cPi7DTFADU0SfX58fEd9Oq1Y03+fcLtVtoiM6GBppRKLk0njT78BhIbCjVkP7Fdbm58we6vpAapMZqS8G+yEarcLrLTv3dxpONF3bBIF1aegtb7skVupIEGCmosyhEtwcJf9hxM6yBq5QRGS5D+dV0WzFaSGDhsFTVYMFeldfVX4TpwuEhjoeGfFdD4BbVNhrt6AlqAw6jItvkbvB80eZiyxEYrdlWRodxWt2JkhZrYMKkoo4vpeAk6M/VIPNPEDNXnh9Hb6TWJYcKsplva8FtkRxzGairLuUIa5VtQuj1EwQBXy4XDcmPjKw6vkxqkxmj0FulrZgLP1J1Vwiz9fIhe9aGqKQW8uMfiXK3ueGj/jciJ7HkY34PPEtEsZ5v2lLroFdrm4zNG2iXmYOnKHbVYX6cIOqKtomV7EKYJxtyooY8+1UpNh7t0GJVDkxZbqY1kW6AYMqeIEhRTzApdsWFSSWgn7ko6Hrrczcq41cQINeb7x7bRK/ENU/KcfJKZKP3dDBNItPpqqr56Vm5qfM26hVKTVB9dXpn0dTOBpcRE9JuRjnS87ovKxQJPtqDyBCwQcedetvCMJJAqhvQv2T5yF3w+nI4X/CBqJdIEMy10I8tyt1W7SBEsrGvXjmHDzk6CdQOHUYcFgxWIboJRMSbqONr7Zg3okIeITvsRng2wBWqarU6js+j8NWWByAppsWFSSZUupuPFlhlElEhmhOrzkGKYXm7GMHVJOE3Jukrp72dCBOWLqSxpB5XlXpVvDzHQQrzqVpz/6pYas3O51CTVx5ScJn3tTGA5l2IVw2r/vYuGFh5RTLeKi7RCZREoW0xGGqinQWRBto/cBYtr2XMwocnd1MC6tECYLHA1o65tu2K4EnKR0mkTg4rR7AIDh2GuYJ5FN0HJceIJmM20Zp+2QatxT0Gb765j86XbWgIpdBh+O2FhLY1bUCMaSKCFuOyxroDarOhLJrJxJl7Iiw2TCrLbHYPzZIuB+hSbbPRxZutDagEiTC9cbdglzwmaP6zLy6KyMGwYEEmUZZyhsjsnpNtCCZglc0oC2QNlloCYx9TyANvqs+Hdxj1U+XhvlTBLPxqkoxMJ6tUvYRGHrmayRWKkgZoj2T7yBJgv2XMwkQtMl+gmmO2YhYUmF8JcaWzipgW6CCI90FiXHljRwiwwjcFKc9eVSs2HOwz/tIJ6TWw4GNcVBszQiLbk3ScUUs8JRfTBbAONrzNOHUfnuhV56jAqkzYd1lFNLQ+oDQexYVJBFhuR3tx0IdAYtATvnxwjNUGN+cGx7fTslSPSbWBkWhyl6jnKFNIYqkijC+028TpNBVXdiA2sWQKYx7Sp5W551j0bpO+BCRx5Wju1+7xcpOP9ZaJRRC9kiyhPQE3pNR5WK0A9i2wfuQtuDGJxLHsOhmkNZ5pgelHLBr5IY6WPV5d4NcB20Eyd2y3KMTdp5OeV1HVcw8hUx9E5Iuo04rMK0e2u/rbmaDcik9bu15Kxwlq3UmSFutgwqSDcyZQtBuqDLjcb8rKpw63W0/HAj49vp7/FHpJuA50TTtHBokJREyV7PiYEMFZT6bWF8m0hgL7EQLWXTxBFb5KbGH+DbnktRJns6xZJ3wcTOC6lW+nxUY76pcGrzaqm4yFtCAs02cItkohXTKNa+xVd22TPwTDukOdCAxKt0UZf7iijdh6m5/WdUup2a3EYJXTXk6UEoi6q58QiMVsJQ2kbb68PIksHzxmpqprz8MJJbJhUkCvpeNmGWhqVFic1PzJ+dmIn/SnmoHSbk/G346nQZJU+HxMalFwYQ5q8m9JtwQrmLBnzish2erfcuASKI+uJ1rfc/MGUnil9T0xg2BJTS/f0drQT33+1Vrpw8gQYhIxiXtwDmBzZPnIX7FM0D5A9B8O4CiKUaCghO8YaY6iw0bIdGmFAZMakJdBa/MM5Jum25ug3TSNS72TbnKCeCe3P+yuPhYlqvL3HxGw6ct5IVgzmZIWV2DB5KRTyudId70KpjjomnJIaHxmPnNpNT57bJ93mBNGqg4WF0udjQoOyghSFJOm2oANFvgUlVHX9UuBT8Jpj7yqiVc1HmapPHRXvQ/r+GL+C+UhjNlcKs/TAezoxDFW2aPIELMgwz0a2YIskUMxfXqXOfkX3NO6Ox3gLOvXJjq/mQN3T3tNGen9WbhNz0hIdRmaLaJHM1DTH4Nl6kXon21YfmKYRyu9+b8rXtVZIHxw9P58uJ5jJyll4YSk2TF4KX8yyxUBj5mS41uzByW/O7qFfnd4t3VafPknnKV1fLX1OhlEFGKXCMqq6dpFsZ/YETwpec2xfJjVLwLp9DRlyi+Xvk/ErRXoSdUswTD2XVEgXS56CxT3MgmzBFkmgAF+tDmYo4Of6JcZbMCdKdny1BI7hhDvVNGlpkct1TXgc6pHecaO1+JCPDWLIrGxbY7qPL6Qx86pEJKvj6CxavlNDRZraupUhKxzFhskLoTueK9GlbGMtdbjlenQJ/O7CfvrJ8R3SbY1Zkp3GtUwhTPGep6kscat0WyAoNTrqP5Kya+n0sTtUeOgg2Y8FuUmqDxpAbFgsNUyIPlVcucJRpiAgrchO/9lVS99QDNOJRPW644HMEk7HA2gBLds/7oKW5Kn5/t2nsUAxaDJkj2eCH0QoMfhYdoy5AtqObz2qp7YjXIsaDfu0nDqNdj0yhejSoFmu1z31nVpKs1ZY6PKtSrEeZIW32DB5IQx1ky0EGrMtP1dqdFrimUsH6dtRW6XbGtM/+QJdLNNLn5sJfsqyY6ns9mHpNn+RWWSly8nVdPB8OS3YoqHBc/Kpx5g0Ktm3Q25Kgp0Da5odZmvfsISMGTnS/cD4jxm7qkR06UeD9aLVsGyB5AmotUGjA9mCLZLA4hQ3BmT7yF0wb8fXHQfxetGyPBUtqZXrUXaJlXLLrJSnsVF+Hfj/7FJle7HjcUi75MHEoQNmOakxDPd1xdg81T+P3h7ZcvTog48N1G18gXSbDHTA++iT8lZbh6MRxbDP8mnzER2V6bixQ6SIDZOHwt0EtK2VLQTqU6J8YY2/fU1qdFriubgjdO/BTdT25nHp9vpgLtPsjFuUb+QGECGJyUYanUm+zYfcKbRS1KUKxSCV0ZgFhfTetNwG3YGWz78gNyOhAkzT2gVS02TdtoqMWfnS/cL4h9+MdHTH67WkgswqDVUFmnIerApuKeajvIV5N+5QbLD7JLKD35mcZ6VCZdFZYoAhstEdxSyl5lspUXn9MEQYnOrkZpZVmKoUZTseBxNVrLeJ/5f9fiZ4wGetxtiA7FIb/b+eWvqPzhr6bHc5fbVHR+9OkUeRkF7nahtw0GFUNo1qIY0P348j5uXT4fNGyi+p5cYOESY2TB6q1oo8+aaLgMbc1FZQv+QLUqPTEq9fP0b/c2AjvXbtmHR7Y9orHCoqkr4GJsgxWak0eSeVFSTLt6tIdomN9p0tpzELC8UE8rbDm34pgPbD0ylj5x65EQklWuicZ93yFRkzOdIUCC7etopUvH9TFj0rT9aoVmcDbhfy4hmkK4ZCtn88IU3lfYp0O3xOVbUYamqjW9l16XaNHtcaeDyMFG46GSrs3MUviInPsJBWhXlg8w45ItPfH6ijS8p1pMxElKuYqL1nTDRwdl6D77Hek0pabQHemBFzK6jr2IZzmNA4YvaqYkrKrKZai53YJkWm2DB5KNwRlS0EGnOgqJC6Jp6WmpyWaKfwPwc3ikiTbLuMHolnKV7j/0gF4z1l6cepLGWP8nf1amsKtDZKyqqlczcqaf0hvYgidRyV1eCLoDnGTLtB+gPb5CYk1Di8jmjLUumMJvv6JVQeH0/6Ik5p9SczdzsWPT/5QE/nU9SrX0J9BBZmsgVbJAHz4UlxvQykUMXd8d4wwdxcU8wNjBJeG6JDV1XsuodIVanyexF58kU0jPEORAa9jSSjydbfJjsaxbw+x0TpxQ2/L2GerqbW0Abl+27q8mIa80UpjfrcQF3HZ7s0zwk3EYfP1dOwz8po1PwCWrSllE5eLqcynfLkrIgXGyYPhHQ8vbnhAkBGsclGX+bcFtEfmcFpjW8e2SJqmWTbmmPc7XhK01dJXw8TxOgMVFaMGUHeGSY0a4hNrKZNUQaavbqEhn6aT53GuGaS6oN0vJqoIG0d7glRG4j2rCLauIhoVUPThEYQln1byJRymzSc1upzCvREr35sEoueZ6cbVUnTcVJitHNNi4IorlcpzRHpeLLncAd8Jqg7QupdpvInIkHuRpNcAQYMNU9I7ZNtZwJHVon3Bv5qhpW+019H/9lVQxO3VSrnu/waAzC2IDXXQjG3ain6ipn2nDGJG4cr9mhpyXYNfbG5jL7YUkZf7tTS6v062nzUIGp4T8dXUVxKLeWWWsnC7cFZ9cSGyQMhfUR2gjYGw2qn3LkuNTau8KPo7a3OYmpMh4STtDwnnYpQFyN5TUx4EptUTQu3aui9qTnUeWwWtXOxi5CMd4bfocNfHZcbj1AHxmn3V0RrvmhomhTs6xZRzfGD0v3LqMeFNCv9apievtFZQ8PWmUWTBtniyBO4O56DtEJ1oksArcllz+EqcYpZKlO+j/LKrKpGlJoD7eTNNXbSlfOxEEyg1b/s+HKHhUeq6b+7a+lb/XS050otya4vLQEThZsquAmAm4ugRPk7OsMiOtX48bgxjvILFgtiw+SmkLvqSnQJJOsqaUBKjNTYuMKjZ3bTL0/tEul5su3NgRTAI8XF3Go8xCi7c5JKjvdwNIGQbAe44KMOKSGzlo5fMdO8TWXUa1KO1Ph4StdRaRSz/ojccIQLRxFxWkm0cbGjMUS9Ybe2rSvIlJpOWr37X8hM66w+XUP39taKu8T7lEWPbGHkCUjXwVBM2WIt0lCjVgSgacRlDyN2iCrdLrCSwWwTHe1kj/ElRTobpQXgeZmmIE3W2zpFvWK4MK8NkWk0jLnTKB3PV6BWvYZNE0sRGyY3hRNXdlLJQKvvjgknpabGFZ6+eIB+GL2d3roRLd3eEn2SztGpEo30dTFBirGWSq8vJ42hssm2jEIrnbxqFqkDyM3ui452bkwwd4c+Y1MoYet+udEIN2CcDq11mCcMvN28RLQjR+vx6tPRpMkpafJZMJ5TZCAatt4soksPvqcTd3obL4w8BQsqpKLJFmyRBOqE1GqiUaCYDk/qgWCykBYHAlVThmYQSAHkYyLwqDEPLCnPRr8d5eisOWi1mWTXF1+BeZuo5eNZS5EtNkxuCOeKsUp+QsnYkZ8nNTOu8sLVKPrWkS0ud8przIDkGLqsMUhfGxOkmBwdn/D3Qp2djl6qoFmrS6j/jFzqOi67QdtvX/GuYpiSt0WIYarPUQWk7KGzHhpFHFxLVUe20ebNybTntImK9JLPi3GLzFI7/WWSo2i7+6Jy6cLIU1C7IlusRRoZKtSKAKRKphW4v09hUPRmR60S0uNkj/EHqJHCQh0tymXbGf8Aw61Ge/tD12rpv7ppxbXjeIL/a01hmjDAmT1T5IoNkxtytZW4ky+yUqRGxlVejT9G3zy8hV5UjJNsuyuMToujRJ1/78Yw7oMcarRGTcuzUML2zrR4ZQx1GOl7cyQDEaZbWw/ITUWEYVc49NUJsV+6jMuiFXt0dCO9RnT4kn2OTMvEZzpmqCDCdOymet3xgLe1NuEAFqdlRnWidpgziDlIsudpDkS3NEabSMWTbfc3t3IsyrWVjXQgSVDOSzXqFD9Y7UjH++mQwHY0rWLTFLFiw+SicIIgR152AjXHSMWsyEyMq7xxPZq+G7WVnrl0SLrdVaakX+fOeUEITBIM0ok4M609qKcpy4qpx8RsmjpjM02ctoPafHSniZnxBz1Hp1LcpkNSAxGJRK+ObrB/uk/IplmrSmj/2XLRhUlWLMzIcbYT/8FAnbieyhZGnlCu/K5ARjOChRuKwTFWqmOYShXj5U79ElLvivTBFdGBgcT+8EezCUaOGul4GBfwM8Uo4doxbnPTlHV/gw6UnJ4XeWLD5KIw0FnnYrMHgIYLnsxfqk+bm8fp5yd3isYPsu2ugrbmo27HURJHmoICNG04HFNOH68upcEf51G38dnUdtjXC/J3hqdS5xEJDRbp/qTDiHQ6tipaah4ikTNro6T7qePoLPH5LdutpRTFOMk+a6YhT4521CD0/rJCujDyFCzKZIu1SON2oU3UWsj2kbu403EQDR70FTYxY8mbGUjXFNOFeUppiunCn2rUP+VruflDoMD8rjKT9wY++pZFRKX/u4eWzqYEfvQD0vOEaapbH7IiQ2yYXBRyV2UnTnNkGWqk5sVdnji3lx48vFm6zV3GpF1l0+RnEH1A61IUP6Or3bQVxWI4nmwB7gSRpU8+/oqGTTos3e4Pls2LoZojYTSHyQvQMbCNZB/VB5/p/M1llJxdKz5v2bEQ6VzPtgmz9G/KwmfDuWrpwsgT0ODgepZ8wRZJIMKWr1OvfulGlmsmA89bYrCJOUuy7S0Bc4U0vuxSK5VX2clUaacSvU0M3caf5VU2MprtlJTruRHDIFs21IHhVo7jc5UdY+7QbWG5uHb8eaKRbhcFz/UVNydYkSM2TC5IRJfcqF0C17QmqWlxl79eOkT/vX8DvX7N/U55Msbfjqeb2nLpa2bUASYpC4uHxCraedIoBsj2nJgtXWg3x+AJJ+nYiveow4gk6XZfM3BCIhXs2Sk1EJHGpQ2Hqd1w19Iju47Lok/XlQpznK0cA7LjI1KZvsuRjofUmit3rNKFkSfg2uxp6+twAs0WDIq5kO0jdzGYSfocjYGJySyxCsMj294c+Llb2VbKU4wMOtnB1DQXTYJxw2MQKfJkKDEiVWgxLtvG+Jb0IpvXHRsLdHYxrBYRpqFrzVQYRM13lKWUo3te3VqRFd5iw+SCEHqVnSwtcbKkTGpY3OWV+KN0z8GN9Lvz+6XbPeGDlEui5bnsdTOeU2wgikmoomW7tDR6QSG9OzVHWWh71rgBUaYPJpyg9sNTpNt9DSIqqxeckxqISOP8uqhWI0yNQZrluEWFortevoYjTjg3/jXNJAzT63NMYhEkWxx5AqIH3qSBhQtqFdeDO8WuGYyEHEfdkjutu/FZZSgGCRGkZOU1u/KzMEqIOqHznmx7SyA6hdco28b4DnzOaowN2BpTI4bV3tdHS2tO15Ds+hJIkJ4HU8gKf7FhakXu1i452VngXUvx+nw7aqtoLy7b5imOluNG6Wtn3AMzklbt01HvyeoOkG0z7A5Nmr6NOgYoygQubzwsNRGRRPSqhk0f3KXf9FyKvmwWTT5kx08kcD7VSj/5QE//3kVDYzZVShdGnoBUaUQQZAu2SKNQr44JhelyJWKHtt1IoXO3kx4iUsUG96NFSP0zVbo/VwnHByJUsm2M78DnVVnj3TEJIzJoVYWILj06TE9xGcEZtUeU28LDbcNebJhaEcKtCLvKTpKW2JSfLTUqnvDbs3vpv/atF9Em2XZPgWmKLiml4rq5P0zrIN3ujmKQLiZU0eYog4gk+WqALJj/yRJaNPcL5TnSpdt9DVqMX9t8kGxHN0nNRLiDtuJ7l5+U7ht3QIRqxLwCOni+nG7nR15nvWXR1fS/vbR0T28t7Y+rlS6OPEFvttO1TDZMMDjIhJDtI3dBdzzZc9QHZim3zEo5bqTiYQGdVWITbb7j0muVf3Mif7yMPI2V0pXrr2xbc8CgeRKZYrwjTfmcZMeXO2QU2+hvkx1z296eW04lQXzTyVBJZOXcvLAWG6YWhOgSZlHITo7WWJebJTUpnvDS1aP073vW0e8vqJeW56RH4lnltWZSnpG7fLUEogNIt8McnrELC6nnpGxqU6+zna9At7xBE05Ru2G3pdt9DRb6QyclUOq2fVJDEe7AMG1Zcka6bzyhw6hMYbJ3nDCK+g3ZsRZuFOiJBq4yi7vEaCeuViQEoMEGp+NZKCVfvZow1J3InqM+iCrB+LgaJYpNq6E7hbVUWFpN8clGupJguMvlRBPFJldKf64x6HaHWibZtuYo1tsoKVe+jfEd2grvz/OTCRb6dj+dMExfHg++dLzGGKu43Xg4iw1TC8KgWuSnyk6M1lidkyE1KJ5y/+FN9OPoHaLVuGy7N3RKOEULs1OpwMRF6o3J09ho9ykTDZydJxa7bYfLF8K+pPuoa9R79BXpNn/x7tgUytu9S2oqwhnb0Y20Yv4F6T7xhndGZFL/Gbl09FIFlRjCu8YpOd8multh0dNjsbrtxHEXW7ZYizSQ4ibbP+5Sriz40IxB9hxOnNElmDTZ9ruk1ihGqIKu3NLRrRQdlZRV0c0kLV29USblSoJe+bmWI054TnfS6/BaK6rsIrol2874BkR9ZceXu3yyv4q+oVw3/r2rlu4Uh8Z1EvPlWOEplwwTDLPJWhtxnUA8jS6Br3LuSM2Jpzx1fh/dd2gTvXQ1SrpdDWZl3KJkXaWYISV7T5FCTqnyhZxYRUt3aNzubucLuo28TudXdaaB409Lt/uLXmNSRXqeJSpy0vOQijh91lXp/lADpHOOW1RE565XiuNOdjyGOmeSrXRvb60wTAfj1UvHQ7r01Qw2TPHKPkAtkWwfuQtm5rQ25BXd7Aq0jbva1VJsajXFplTR5SSTMElxN782Qzl55ZSZY2pgkGQg2lT/uRqDqKw7KXmIhJUZuX7J3yCVTnZ8uQPql56d7rjR0uaz0Onsy00gwlcuGaYks57m5yZSVpVyNESIaqzyk8FV1uaqG2F6Nf4o/d/9G+npiwek29ViRNoVOl2ioRLli1P2vsIZ5NfvP2ui6V8Viy5nsgVuoPhgwnEaOvGYdJs/GTA+iU6sOSY1F+GIVTFM709IlO4LNek0Jku0nz+rGCfZsRnKzKhrJ/7QAD3pzSRdHHlCiQu1NpFAar5NNL+Q7SN3wCJPdByUPEd90HUup8yqPE4xSSmVikEqF6l1cYpJunpD08QExd/UkE5fTbdaiC45we9AZEr2vEj/05Xb3Bpmi/olDNOVbWN8A6J5qIOTHWPukF1qo//p5bjRsj22lmTXlmAF1zmUdLDCSy4Zpg3F6dTh1klalJdENTZb3b+Gr5CDigNediK4yo6CXKkh8RSk4v0gejv94Ng26Xa1aK/QJ+k8HSwqkr6vcAStT3edNNLgj/Oo4+gs6YI2GOg0IkHB94v31ug88jZtWnI2IhpBVB3ZQu2GuTaDyVtQE4c5TjNXlVBKbvjUFP5xvOMuce+l6qbjJSoLd9mCLZJA/VauRp10PETsklrtOFhLeWW1lJpVQXE3tQpNDVJjUm7rqUxTKd3WGIdhqpY8r2LU3Ox2B4NVqLWJwbiy7YxvuJFtFdk5smPMHT7e67jRgu6aGSWhdwPXVFW3oGSFjVwyTLOyb4jFNEzTKV1h2Kfm4U6bJ53x6nOkqLiJGfGW313YT/+5dx29eu2YdLuatFc+65U5dyjHGFp3dlxFDJctsdKx2AoapBgl2QI22Ogz5jIdWT6A+o1Vv6bGXdAM4ovPLlHpvh1SoxEupGzbJ33/vqbHxGzaeswoOjKGcke9hFwbfaOzlv6ti4Z2XqqRLow8AXUCssVapIH0OW25Oul4qF9q0k48Fal2NXQ5xeyIIikGyWCsoZuJrUeLnOTmV4iUPNm2xsShjkl5zgavQUGYH8Us3cpp+O8tkZBjFTWoPNTYv6CuEOZbdoy5ilk5vx/+UC8MU/fFFUE1rNYdsB9Y4SOXDNMHqRfvLqR7Jp2layZN3ZbwE6JLuDMgO/jdIU5jbGBA1OCFuCi65+Am+smJndLtatMx4STNzkigW9oK6XsMVZAHv/9cOU1cUkTtR/quJbjaoLX4yMkHqe/YGOl2f4PIy6QZ1+jmlgOim5zMcIQ6e5adkr53f4CI08j5jlbkodpRb8Zux13in36gF4NVZYsjT8DgW9liLdJAgwY10vFAnrP7HJo11E+1u/m1ObqVrCO9obqByWmN/EKzS/VL4HJSRZP3CJBah3RBd5o35CtmqdXGFIyqIOKJLoay48sdLqZZxXXj/3TX0qKo6pC9aYRMJZ7PFD5q1TBZFAfRJfF0g4X0iNuxlBOm9UzedMarT57Rquyrkw32m7e0vXlcMUs76D/2rqcXfdj8oT6IKn6YGkvxWpP0fYYSuOheTKyisQuLqPPY4E29a41uo65R++Ep0m2BoM+YFNqx9DRVHdksNR2hzPjp16Tv2Z/gWJ25soRSc0IrTa9UOd+c3fHaflauytR/gMGqvBB2kFWqTjpeba2Nbt1xRpEUg9RMqt2dLCMVFpul25ojO1cx/AUV0m31wXPLuuSlF1mpvKr1ZhT1Qbom2p5zdzz/gqHCaqTjTd5eKa4bPx+ipxMJoZ2ejGg4txoPD7VqmHSWGhFpaLyQ/jw3QXTOCzeVKwe37KD3hL7JF5rsN2/55+XD9I09a+mRU7upnWS7r+iUcJqOFpeE5JBbGCV0IFu5V0edgrhGyVUGjz9JyZueF+3GZdsDQdthd2juJ5epbN8Osh+Vm49Qw3Rwq19mbbkK6ut2nDSJNKNQuON6IdVK3+2vo3/voqGpOyuF0ZEtjtzFWGmnG1lsmIDB0yYatXbFJFnJWlVFNpOBKkvlJqYxMD5Zua5Fi5zcSNCSwVRD8fW65jVG1lIc0Qo0bDCY3Zu1hfQ9dA28yceI30EapPR4cwNNuZ1emGkShun5GUbKKg3tBlS4AW8J/9L/iFCrhim7qlxqmPBvawtvU409fI4Eq/JW1IguOZmTmdhkv3kLTNJ3orbSvYc2+S3K5KRX0jnamJ9NBcbQmdeExeWB8+U05JN86SI0VBk/bVdQdM1rzJCJCXRmzVEyH94iNSGhxOUNh6XvMZBgftPkL4vo1FVzUE+9BwuPVNP/66mlb/XVqdpOHJEqVwemhjM3si3S/SNHMUjKXyxV1WQ1VwiTZDdoiPRlgoIsuZFpTFFJJaVnGaXbWgJRKUSaGpsmRLPQhrxx3RIaNWSXOmqQ3IksIaKE1L3MYjZLgaBA533E80KqhX4+1FG/NH5reHQNRdSNg0yhr1YNU0KF7q5hattoAY2BpxuK0skSJqYJU5plB7un7CnMb7C/1OL5uCiRlvf42b1+jTKBromnRV1TliH4m0FkFFrpk7Wl1GVc6EeVGtPmozv07tjYoIoyOek6Mo2WfH6RtPu3S41IqLB6wXnp+wsGMB9swRaNaAohO/YDTb7OTn2+rKBvdNbQIx/pRc2RbHHkLohSYcaLbLEWabTeHc9hkqyVlWQrN5LdqGtgkpxYtWWUmtLQyDRHMQxTpvuGCS3Fy7RVd2uZ4m5o6HKikWJT0BHva7MEcwTDozHZKK3ASnFuGmOkamJGFBtq/4PmGmYv6+lwfn91spr+q5tWDKw9mRg+w/S5AUToq1XDdMlYSh3qDBNaW78Sf7TBArpL4ik6UJZLthBP0kTtkuwg94Zr2nLqrJjK+vtLDWCSfhi9XcxleuvGceljfM2E9Gt0x1Atfd+BBrUTJ+LMYZF+1xLDJkXR2VVdRTMI2fZA8+64FErauj8k24+jnfjEGcFnRhvzwcf5dDW1JuhS9G5k2+hP4w3iLnEvFduJVykLMgwjlS3YIglEUtCcSLaPRCSp0kw2xSA1NkcyKooVQ5MoNzqNyS+ooGw3U/KcoLMeTJOpwkoZhRa6keUYgns90yLMEUxSZY1dzMNrbRaUDJgtXYVN/D7Zdsa3pOR7H11CKmXPJeXiuvGTwXqSXVtCFZ7NFPpq1TCd0BWIwn/nQvnFq0eVRXp0g8Xzu8nn6GQItxuH10NLVdlB7g2p+ioakhrbYF+pxd9iD9H/2beBfnFyp9+jTABtx6em36AEXXB10MsssopapXCMKskYO3VPUKbmOekwIl1EavL37JIak2Dl9va9Ykiv7D0FGzjW1x7Ui9lNwWKcDl+30H19dGLhs/eKeul4ejfrWcIVNDUQ3fFQi6TsGGeqnd2oV3ZS0yhSS5TkYris3OQ05k6m+00fANqRo6lDbHKlYnjR9c4m2oSXGGxUpPyJIaUYiOtpkwbUzugr7DybK4AU6b2PIiPdFnOXcN2YubuKZNeWUAWjaio5yhTSatUwHSzLFYtj50IZndrQeKDxIr2PYpqitPkUisl5aPuo83JQrYxco4VmZdxqsJ/UAqYVUaZ/37NOMU+HpY/xNRhyOzztCl3WGKTv39/EpVbT+MVF9E4ItQpXgwHjztGYqftEmp5se6BB+/ERU27SqdVHyRIC0SY0rTj81XF6Z3hw7k8ZbYZl0ugvCunkVbP03PA3U3c62ol/u59OtTlB4A6n4ynUUk5xNVnM5rupdiRJtXMFpONlpstNjowbiVoymmqk25pDGKWUSul8JTW4nmUho9lhuGTbGd8Tn4Fhtd6f5/viaunfOmvo//bQUmphaDd7kGGo5ChTKKtVw7SzNEssjOsvlDE4VdZwAOl5hzV5ZA+xWBPybmUHt7eUKazLy2oQoVOTf10+Qv+mGKZvHdlCb15vGPXzJ/2SL9DFssCFz3FXHSl4vSbnSBeT4U7bYbcpank/GjVlv3R7sAADMn9uLBkObpMalWCh+shmmjPnivQ9BDtoCrFqnz7gkaa/THK0E++xWL10PAwUv5IeuYvi2NRqupxoouuKaTEUyg2Qu9SUlVGCi+l4TrS6akpI0Um31efKLb1ilKqk70UtUKukNdkomdvMB5RUZf+rMQ+szWeOdLxnpxtJdl0JdRBlquG5TCGrVg3T5uI7TQwTFuf/unxYRJvq/zvol3JeNIoIFcHaIbdUdnCrwfHiUuqReLbJflKL7x3dSv+5dz09ffGAdLu/GHv7KmUaaqT7wNfEp9VQnymRaZacvD/+DE2avi1o65nqM2VmPJUf2io1K8GASXlt744NnjlXnoCGEBjcKTtffE2Bnui/u2vFwmf92RrpwsgTdOWROKy2lmKTzYr5+NqgJCWVUXWZ3AC5S3lxU6PTGjl55ZSZ3XwdE9LvYpMxgNY3ESUnoo6rEjVPbJYCjRrzwCoUw/W/vRxpvGM2h0d3PBmoPWSFplo1TGsK05oYJvDclSgR4Wj876Bn0hnaqBgts005C4JcGComO6jVIttYS0N9VMcEkJr3wOHN9D8HNvq9zXhjPkq9TNe15dL94Asyiqy0ZLuGOoyKrBS85ug37jxtXDCJ3hmeJt0eTHQakU5L58VQ7u5dZJeYlkCyb8VJ6WsOJTA/avDHebT7tImKDfLzx1fM3ONIx0MtAjrayRZHnpBeFP7peIjIXE4qdwyQVUxSnMSQZN0pJbvE/HhCxu2mv781EpK1VFxaKZo4OP9N1Cih611ypfI+fGuUxHymAisV622idkn2GMZ/YFitGmm3K0/WiOsG0ngPxof2sNrWQJMxVuipVcP0VUGq1DC1u3mCHjuzp0kDCCdoRb4wLymoh9ta7fKDWW0WZ6dJ95FaoAHEf+5bTw8qxkkW9fMnQ1JiKUnn+zqK7BIbzV5dSu2Gs1ly8s7wVNq1eAStnPexdHuwgWG3aKxwddNBqXEJBNajm6j/+GTp6w1FcDNhztpSylKMi+w88gVPjnGk43X8opw0JnXql3Bj60a4dsdDql2SSTFIigFRjEd9cyJDr1I6HuqXXG32UB/8TG5BuYg04f9Fe3DlPfjaKAFElYoUo4RmEZjVJHsM418wRBrdK2Xnrasg3bZtXTre3yYb6VZu6A3IdwdTZd0ilBVSatUwfZmfIl0Yg9evH6NfK6YJ7cZl29GO/POcBCquCc6jAyFg2cGsNrEag9R0qkWbG8dFt7xv7FlLj5za1ezn4Q/wPtE9L03vuw43iCzNWlUiXSAyGdR/3HnqOCI0Orw5WT4/hor37hQNF2RGxl+cXntU+vpCGUSbJiwpolsZvk+Zjbltpf/tpaX/6KqhT/dXidkjsgWSu5Qa7eJOtmzBFloopiK1xhFJSix3mKRGhqQlrt8qI5tOboDcRZMvfw5XuJ6oI63RQrfzazzubOcOeI6kPCtpyx1DaT1pO874BjXS8RLzbPTocL1o+NB/hVmMBpFdX8IFbQWRNTzGl0aUWjVMS/KTpQtjJ3+5eJCeuXSoxdbWo9Ov0FVTGVmDaFYTDlZf1i7Vp8Rkp0Epl6T7Ri0wHwupef+1bz39MeaAiADKHucP0OTik4wEKjSpf5fo5p0asfiTLQwZBzBLc2avosETTki3ByOINo2edoNi1h8hm8TI+APUVYXC7CVPGfJJvmiOUmqUn1tq8NnBKvqvbhp66H0dRd1Qp504hllml3k2mydYEA0bUIuUaBT1SBjcKjMirZGTUdrE+HiCXTFdt9NKpc/REnE3taLxBAwf5h4h0pOhGBhfmSak36H7Xb7WJmryeAZX8GEwex9F3nKhhu7roxW1j6h7lF1bwg00yWCFlryKMAGk5P323F7ROU+23UnflPN0SJNLFntw2Grc+UTHEtmB7As25WVL94uavBB3RKTmoZ7p+bjA1jPBNC3KShWdAmX7wxNSciw0dmGhuGMuWxAyDtA1b9zU3RS1rH/IRZq6jUqjZfMvBKQpxOUNh6n76OCv//KGnpNyaNcpk7LQVb9lb6GeqPOCCjGh/6kxBsrTqJOOhy6miC7IFmtBTSoaNlSIbnEwGlc9NEn1MZfIDZC7VJW6PqwWoEYJtVWxqTXKe/s69Q5Rv3ytlbJL1Y/63MrGXDGbSMFLUK796IgnexwTOJAmi3Q62XnrKpiBOWKDmb7RWUMPvqej9OLwaycuA80fgiiGwHJBHtcw1Qc1NE+e29dqVAO/BxErnaUmoI3H0Qcf/fBlB7GvSNZVUvfEM9L9oibolvcfe9fTPQc30mutmFhf0ynhFO0vKqTScu8vgLmlNpq0lCNL7gLD1G5YaJmANgqI9GTu3EM2P81tQivxpZ/HSF9PuNFhVBZtOWqgQp26C5O4DBv9bqxB1CH0Xa5eO3F0QguNxXJduh0iSWjaIDEe3oDueGqm4127JX+e+iBlUBilFuqT8NnkllnF55RWYPU4dRJRKkStknItYqitvsLGg2iDHDVuiiB6+JeJjrrHLguCaxC+L8HsTwun5YWUWjVMq5vpklcfNBr41ek99HSMa62tkaJ3yVBCNQGKNqEPvuwA9iV5RgtNv3NTuj/U5O0bx+nR07vFQFvMZ3opwJ3zhqTG0jWNSbpPXAWRpclfslnyhLFT99C8OV9SpxGJ0u3BTL9xyXRwxQky+mFuU/au3SHfStwd2g7PpMXbNKJ5iuyc84Tdl2tFWg0WPvi7bHHkCUazXXTbSy+yigV5Sr5VRJzQIQ0pWtezrBSf6Yh2YPGONC7Z4s6XxKZU05VEU10kSW4+vCUv05FKJzNA7gDTlZMhfw4niIrBKMEAyt6vDDRhyFGMU4GyAEbECZ/TjSx5ZAifET4vbE9WPkuk9eWW2cTiGX/i3wLxOTKug89VjXQ8fM7/09Nx3TgQ5t3xGoPoHCt01KphWleU7lLDAsxm+t7RbS6lguH39Uk+J9L9jAHoouev2qX6lJXbaVt+rugeKNsnaoLP4kfRO+gbu9eKzySQkab2t07Sp5mJ0n3iCmjwMHNVCafheUinEQk0Z/ZK+mhilHR7sNNheDrN/eSyaAghMzpqgRbnsucPZzDkdukOLeWpNK9p4rYqkY6Hpg9qtBluDGqZkPePFD10zUMqD7pNGRWwcNNX2EmngOcuM9mpSG8XC/AcZQGeoRjD20U2ZRGPqIVNpBLFZyIa4v3CHK203W3e4C7XbpaRrkBugNwFw2qTk+XPI4bNJpvdMkr1wb68rhgnGNrsEisV6WyiUYOhwkY65U/8Xaf8HdEjDdLtlO14HMwVzC8iTGyUQgNE/3Auys5Vd5iwtVKYpZ8N1VORn0cgBJpy5TrGCh21apg2SQbXNscLV6Pox8e3iwW7bLuM/ikX6P9v7yzA276uPtyuNChs7Trstm+Mha1jXmHrCoFyU2aGNGnatEmZ1zZNGmayw4njsJPYsWPHzMxMkiUzSvL57u/+rViWr23JFuuc53kfJ9ZfDL6vzrnnpLY1UZ+Hsk14g6peuJ4gUd9CD+XFKh8HVzMl6zB97UDogDRtoklebjd+sKFR+ZiMBvZZLNthYFlyAVOfK6LbZmT5xWBbFU+8kkN1QprcUaJXuGWX8jqDAbTl37CvxSWNINAOGAufOxa4rhzPE+BbXohYa5cmW2hkUCsW8lbRKqwTkiUEAAv61FLtm/WTFPZQarZBCg1Ay22JQkYmAsrxsO9IJUDOgmG19u3E0YhCm6GkXhy7AjxeyQOPm+p0xr+o0Fnklxiq95SjYC/5D4Qo4XPj8ZXuH0cyGvo2dOPUwL9Vx7ia5o6BhSmHX8SYwrSpsdRhYUJp3q+id9ElMbuUp48E9vYg21TQ2UImN+6Cw0Xj20jVC9cTVLWaaGZhsvIxcAdo+/6tQ5vpczvX0oUHNnl1sO1dOdGUa3R8eneDkCXss7hxBs9ZcgWPzo6mI8vvpVffDPFbaUJDhoiVEdS5L1QpPuMh0DvjOQLeYxsPTGxPU4GQii/eZZAbt/emmpSLo0DBKljt3RbqNDRThxCQ1jotA6Sv1lNjpZ7qKrQSuooSHZUVawNiiwv1VFSgp4J8LcOTIyQoO0dPmdl6ysjShMtWYmzB+V21f6lG3C7by8YcJU/MUGICB5RTotW/6v3hDLEFJilL6I63Nb6PVJ8t7gaClJzfI4d8L99llOwU/07K65HrENV5XAm3F/efGFOYtjWWOyxMAOVf3z60hf4Yv0d5+mg8VhAnSwB1fd0D1+7awN4l9L9XvWg9xf9K8kdtwe5q0G78m0KakGm6cH+oV6VpQUUBNTjQahzf7uADC5vTVQs8ZnzcNyuBnn4lQmabVKf7A+iit3xeLHW7QJr6BYdXHaJbn/ffx8NV3CSkacP+lnEvEN4L65ELn+8+0SxL4VSLo0DD3CHuuEJI7OkXQHYwKLavSSuJ6xZ0NWpd75DxaavXpAtDaQ01QrqqdFQ/IF2VQrqaXVSOh9uSnTO0nTj2XqkWxQwzEhhWi5JY1fvCGZ5c1Sk/Ny6e2UIppWZSfba4E7Sq/2yrgR56o2rIEHz8+8HXq2jxNgOVN7j3dnF7cf+JMYVpX1OV3Idiu/AdC+xj+tzONbJET3X6WNyTGy2v15Vzm3BJqHtXvWA9SYq+VXYVVN1vd4HM34UHQukUIU1f3hciy/VUx7mbB/OOU7y+Wfm42BKf0033v1Y5ZEHHuIY7Z6bT3Dc20U3TC5Sn+wvPzs0iY/jEmkEYwrcEfXbJljtfrqDodMezwLb8fLrWHe/2+e0yi69aHAUSpm7xx6S5aZiQ+DqQM1tZ0oQJGSb1wphhVKBMVfW+cIam9n762cDnxh3ic6Pa4P5sji31xn56Y3mD8rPQCjq2zgvRu7yjqC3o2MzhHzGmMEU318uZOqoF8Gj8JnY3ff3gJpnhUJ3uCNOLEijCUEv1vV0TbkPuyUG1Y3F1fARNzvCstGBe1rcjtsjyPAy4/fcEnpeJsLCiUA7yVT0uoKTOTLM/44547mTOG5vp4NKH6Lbns5Wn+wtPzsmmlI17yDzOfU0HlkfQjdNLlJcdrDzzYQ0VVjvXqSqpxCwXPaff0UQLDnTLfQmqBVKg0NdnIUtbyzAZ8QfQZa+vSSf3Q3U06qm1Xk/6xja5Z6uqyULlOguVNJipSCyIrd0Isbnf2pEQmYW0Mq1hRkqpVpqVWMyNGoINV5Tj7Uvro68+ZKQv3GWgj/b0kOqzxV3oBqpYbp01dhULmuMcSnDf/ipUPblvIwqHK2NMYUppa6Kbx9HZDTOZfhK5g753eCtNnkDDgduzI+nFkiQKaSihiu52sozzpdXdq36xeoMlZSX053jPZpkA5BVd85Bp+qb4eY0XpOm+3BjKH2EvE2qJP1in4yYPHuCeF5Lo5un+30b74dm5cl+TSohGI9jaiDvDa0sbqKHZ8W9U39/dLYXposeNdDQ7sPcvAVNXt5AP/8sujYSlo13cL/UC2NqZ0NqVENnD5k6tG2FTW79cOKM5D8owIV3ouFiBZhmyDbyFCmoHW8APdibUZi6pFuKM74PnD68J1evFUfClyuvbu+iMOwz09YeNFFPg2XI8zHV8dYnjX8w+/X6NWxtBmMwDC1UOn44xhamws3XcrbCxnwnNBn54dLvydGeAtKFUb0F1LtX1Op/DNHp575Itpc29dGn0blkqp7qv7gTPyRfCN8g9Td8/ss0rt2F+RYHycdl2pI2msCx5jNfe3EjFoX/x+0zTTdOLaeNn0WQ+qJYje7r3h9D0uVnKy2JK5RcWmw+3Kt+j9jS0Ek36sF0K05/ntlKVCwZZ+jb91N9qHCYd/sxowjQe0BQDogWwMJaIBTYW2VasreEhX01iIYq9czWGfilbxUK2kN3KrtLmOCGTxRks3wEirHrenaFOCPb1H7TJz43fv9wqMz6qzxd3UVRjonvnOl72j89EnEd1Wa4A7xUO348xhUnf1zOh2UH/TNpPX9i9XnbPm0imyZZbsyPp7fIMim1ppNqeTuqxjK7n+MBWvUi9RU2rmaYkRtGVDsyscgfINJ0tpAmZJnQ09LQ04fVU2Nw95DFJLeylB16vUn5YMe7jlTe20AfvLpONICY/67/laZjXtHZ+jOx6p5IkK6YDG2nb4kguxRuDR9+upsyS3iHvURUJxWb61QxtH8KjK/yrnfh4MHd2DBMOf8fVwuQu8HccWa6WTtLav7f2i4W3haoN1lJCtIA3y6G3yGhlVQyWEaaXDZQSCvnCrKckUKxluljGHAePFbKLqufHGTBs+qLHjPJz48Nwz5bjgfwqE93iQDmeLVijqC7LFeALBA7fjzGFydRvoWk5UcqFr6P8OX4PnbtnI/06Nsyli3NknZ4tipctySONdVTb2zmsYA99I/ABq3qRegud+LB/Oy+XLo/drbxfnuBP4jmByJ62cy39NjZceYw7WVtddvLxqNZb6P21OpoyXf1Bxbifh186Ts/O8c/htlZueb6YFn8cRx2jdNAr2BxGj87OVZ6fGWTq82Wyve5YXfNCYnvpy/dpU/q3JfQpF0eBQh++Bm5RS4c/4y/C5CwQLCxET5YS2gw1hmxZywgx3LhK/A0qb9RKCbF/q6DWQnk1FpnlgnRBttDFDZIVzIIF+ZxoOR5YFdlLn7utSe5fyhWPs+qzxZ04m2ECRTXuKxvEa5TD92NMYUI8I6REteh1BsgBSsH+5Ia9O2h7Dql7KP84vV6eRoeNtdQ5kHXCm9PbrcRVhFZU0Y+P7PBoi3FbIK6/OLZTNoE4Z88G+lfyfuVx7mJGYRKVt2hzF/Ycb5dtjVUfUoxnePn1bRSx7H4hHf4tE1OfK6E330mh1j3qTNNb7yTLzkeq8zJDuWdO5agNIBpbiWZt7JKzl86cZpALUfuFUeDQL8SibZhsBAKaMKnuc3BhW0Z4snSwRysd7BALWixq27v7qa2rn1pkKWH/yVLCSn3/ySHHuWJhnVUpJEvIBfb7JCjEw1+BUOIxUj1+znDt+1o53r/faSPVZ4u7qdRZ6JVFju9hevzdarfuYYLQu3EEKYeLwiFh+rgqW7nodQaU4/0saiedHrZOZjfcXQZ2S3YkzS1LpZC6ckrUt8gSsAqxQK9rM5Ne8YL1NCcam+lXh3dPqIvgRJmUEXGy3fh3IrbITnqq49zBvbkxFNmop/xKE90xu0L5IcV4lufn7qWbpufLIbf+XJ43WUjTW+8my8YOGHLbJdCHbaF5HyYoj2dGZl5Ik/LzC6AN8F9fbZULn1s+cd2iW+6Bsfudt+nr6aX+FoNSOPwdzJNS3WfGNVgHHbcJ4cKeLXyxUG/dsyUW7pAQlBKiOQZEC+VqyGillZkotVTrRogyQsiXLCP0UikhrhOCqLqPzoDs3ucHhlwvjvB8OR6A/GyPbKWbZ479RS0Ge++N7VBejqtAa3ELD7D1+XBImPY2VSkXvc5yvViQ/+DoNvr87vX0u7hwj+2dwRypR/LiaE5xGs0rz6f11eW0p76eonVNlNbURkVCpuocGKjqSmpbzXRDXKR8PFS32VNA2M7Zs1GW5qEVvOoYd4DnZFFxCc1eWKf8kGK8x74lj9H0ufuUp/kTj76cS/97P1GK0tNz/LuxhbdAnX9upXoCf0alhc6+RyvHO5DuunI8bAjHnpRKvbY/pdaolU9hsYaubPhmH/sosPjEN7P45h+lV8gMqC5v4vSTpT0ws0sA+7LU95vxBlbB6uhBNks8ReJ1bhCvd1lKKN4DddYyQnQkFO+TskYLldSjFbxZNsuQe7hQSjggX6lCvKzt31Ui5Cgox2sVt0V1m51hwQFtyPU3HzVSYonnh9VaKWsw04frdMrPPSuQpY826OWAW9VluAqMvMHoGw7fDoeEqairVbnoHQ/IYvzQRppUx7gblPDdkRMlW1w/nBdLT+bH0/TCRJpdnErvl+XQ4soi2lhTQTvramh/fQNFNTZRgr6FMg0dQq56qLrVRDrFi95ZZmSl0hm71tEN6Z7L7Kj4/Yk9dPqutXRm2Dr6d6rnGlHcE51AN84uVn5QMd7jmVcO0mtvhtDNz3PbbaaUFm5RZ5k+CNfaiX/rMaOUFtXiyFkgPfh23bpIw7fo+GYbiz18u46FH75tx+Z9LARxLBaFWMxhrwk2+mNuEBaO+NYejQAgX1hcYqGJBSeEq7kDZTD9clE6lmhpe5cCp424PebOTuX9ZvwH21JCaxkh3pMoH8TrHCWE2MNlbQff0IIvIrQvJSBc6HyXX2OR7x20f8f7Cu83W2HCe2qi5XiQwT/O0bLS173fRiWNo++RdDflQppW726m2xQNIKZOL6NlO41SrFTndSVGIUwmFiafD4eEydTfLzvTqRa94wHS9N3DGKK6RmY1PN2lzRUgQzIt5xg9kHecniiIl3tyXilOo7dKsuh/Zbm0qKJQSld4fR0d0zVRuqGdioVslbf0ytLAKiFdGyor5R6iPwhhUV2Hp8DzgZI8lOZ94+Amzz0fyZE0eU7hsA8qxvvcOL2A7n8xnma/tp2mPMdSG8zcM7ec4nLah/yBR0nLb17UuuNNW+C6ki4s5uwXap4AQoZN/ZCvrCptw78mXGaqqTJQY5WODDV6aqnTUUeDnrr1GACrJ5MVgxAPGyxGDQyKlShExVcwd7EwMWogOJ09mnRh/5bqGGeAiJ3/gIFOu72J5m7t9ng78ZHA1oA1e5rp9WUNkrV7m93a5MEejL3p41lMPh8OCRPiheIk9aJ3nGAe0HcjtspSsJ9F7aDrvJxl8QQ3C8m6U0jWQ3mx9FxBIr1YlCozbf93eKsc9Ks6j6f4e+I+Oitsvcx4/d6Dmb8pn2UqF2mM90Gr8d2LnqKnXolQns4ECUKYV+3RDdn0nFpmoc/dbqDTxcJn+ZEe5eJoPKDEyJe6kCXmdlBKhn5E0jJ1lJmlp+wcPeXm6akgX09FBXoqKdJRebGeKkv0VF2mp9pyHdVX6khXpSd9tV7KV3MtBExPbfV6ahcS1tmopy6dnnr0euoVQMSkdCkkx2W0NMlBvKrngmFczfz9PXTWnQb62sNG2pmkLvUNRtCYjIXJ98NhYVpRW6Bc8E6E64Uk/SRyh1ykXxSxRf5fdVwg853DW+gr+0LoGiGQqtM9BbJKPzq6TWaZvnlwkxBYz9yeqTt5I74vc9fMVLp/Vjy9+dY65elMcDBzfjmV1Q8ucN4L08rxvvuEkWILTMrFkbOglAj7L1Ti4g0SCnooOcuoFKWJkJoJ0dJTuhCtjGw9ZQqyhHBBunJyNfHKH5CvQiFfRYV6KhaUFeukgNUIAaur0FNjpZ6ahHxBvCBdnch8CeHqbdKRWYiWUpDsgTB1u054GWYkUA5454J22ewBs9uKG7xbjudLQJh6WZh8PhwWpujmeuWCd6Jgof6zgfbWaDvurWGu3uJ3cbtllumvCa5vt+4s6JoHeT1VPBd/dkP7dyUJUcoFGuNbHFr2AO1c9JzyNCbw+e/TOZRW1CX/uKOM5qq3tbbAV77VStVNE5/8D7C5HXuTVPLiDRJz25XC4y9AzCBkkDDIV3GRkK4SHVWV6oRwIdulI0NdExmae+Wmc+x5wT4Y7FMZhnh+rKieO4YZCzSiuOQF65DrTrKXhmBGCpN4jDh8OxwWpoLOFro/L0a96J0gaDl+cfQuKQ4YpnrZ8TCPtrj2Jv9NP0Sn7lhDl8Ts8tpMJltwO3B7vrrfc3uZJr1WoFykMb4DyvPmfzCfps1M9/tZTYzzXPt0EX28qVz+cT9RZKYfP9MsB08+t7bTZd3p0AnPV8rxZHYp06AUkUAC9xH3dch9F88BmmugpTWaaaDVNVpeY9M/hrqiDba1iyG6taGZgOr5ZBhbdiX10Rfv1rpq7ksfeb5bMMLC5B/hsDDp+7ppTmmKcsHrCqaKxflfEvbK8jR0bPvmoc30z6T9PiER7gaSiJJEiKPqdE9yTdpBOnfPRilN7hgyrGLK4gzlIo3xPaY+V0grPn6HHnopVnk6E7j88/E4qmu20OqoXjrvPoOcpbI9wXXtxAtqLUMW7t4kKbtFKRiBBoQpvrBv2P13FHQwhDSpns/xgNdXvQCzeqzt49FwAINj0QGOM1z+y9OrO6Usff/pZvE8q8UhWGFh8o9wWJgs1E/LawtkS27VotdVYMGOTm3YS4M21788ttMvu+g5w9cPbKIvhW/wiawamk/8NGqHfPy/LOTVE80opmxOUi7QGN8EbccPLn1IeRoTuPzp/mRaFl4hs0pY+Jx3n9ElgywBFsJJJb6xfykhr1MpF4FIUhaESf04OAIyURAa1XPqLLgcZLdskS3lbZHdDE0D3QzNlIesV72ZShstVNnUL2d2oWU2ZhahxNNaZqi6Psaz/ECIEj43Zm7USnuZQQwCPEYcvh0OCxMiprmBbs+JUi56XQkyLb8QogSJQKYDWaffnwiXnfUCMeP0w6PbpaBcmeIb+7fQMQ/lkafvWkd/TXR/lmnqoVia9Jx6kcb4JrfNyKJpMzPohVd3yxbkqmOYwOI/T+TT5Q8fpj/P0fYh3DLPde3EUY6nWpB7moSCXkoWEqGSi0AEmTTV4+Ao2ZVm5fM5Hoob3Jdh1MoMMcRVmzNkLTMsqDVTsRAuzCKSg5LlvC5tQCyky9DeT0bQoc0ygtRhthFEDLOOMMcLma9uZL9YzEbkeIFZfmagQ15MvveG1foy+NKIw7fDKWEymHro4fzjykWvO0BJ3vcOb5UNIdB+/MIDoXKv079TDyqP91ewZwvCdHHMLuXpnmZSxmH62oFNUlZ/HLnd7Rm+qcejadIsnvXjb9wupGn5x+/SK69vVZ7OBB7nX7+fvnR3k1z87E5xXTleTpUvlOP1UWJOm1IsAhU0tlA/Fo6BjI7q+XQWCAeyVarr8CYQLTkwWQ5KHhiSPCBcGPJq3dsF8cL+rpJ6bRAs2uNjWHK1QRuYjEysDmWGQr6w50uba0TUGSSidddnHfIz4/cvt1Cpl4fV+iKcYfKPcEqYEKvripSLXncxWSze/yHE6YJ9oVIqZDe93evp+0e20dU+kpGZKOhIh/v19YOblKd7AwwUxuN9wf5QWSapOsZlxB+jya9zlsIfuWl6Pj38UqzgOM18NVx5DBM4XHBTmlz4XPCgUX7Dbr8wGg8YiIlyK9WC1ZMk5KPRQ5NSLAKVhPwu5WPhCJAJZFdUz6mzQCZU1+GvWEsKgbWUEOIl5QsIOUyxImQsrcxEmRUmyoGAQb4GxMtaZlg/UGaITFebeL9I0VI8jr6ITtzuc+81ys+NZ9d2ivuiloZghtuK+0c4LUy6vm66PSdSvfB1IyjT+11cOJ0vxAl7m7CYP3XnGpkJwe+RdUJmRHVeX+cfSdrQWDS7mOLlAbZWMBMLWT20Gf9b4j7lMS4jKYomf5CjXKD5FCgbnF6iPi3IeWbOQTq28k66d1ai8nQmMPjSbdVy4TNtQYdycTQeao0WSlAsOj1LHyVlNyulIlBJFkyk4QMyK6rnczwgM6O6DmZ0korNspuh3NN1sszQQsXi8SwXwlWlt1CtQctwWYULpYW25YVt3VpLeXwBgllokDFZZuiizNeWE310+h3Y82igtdG9pBKGYMcohIkH1/p+OC1MiE+rctQLXw+Axgh/OLGH/u/INplpkuIkOHvPBlm+9+vY3XRVygG/2uuE2VPniNuP+3J1iu+UG34nYou8TdhPpjrdZaRE0uRPs5QLNJ9heilNnp9Jkz/KVp8e5Ex+toQemx1F981KoNtnZNITLx9VHsf4L1c9VU6nClk65VY9rTjapVwcOQsWZYW13m/2EGyleACCqHosHAX7zlTPqbNgoZ5V4TsDiwMda5khMlupZVoDjUzx+GNOkm2JISR2ollkiNdjKzrksNpfPN9CiSUWUglDsANhMrEw+XyMS5jyO1vo3txo9eLXQyCbhKzSJTFhdO5eTTbAabvW0hfD19OFBzbRr4/vpmvTDynP70ug5O38/SHy9kMGVcd4gz8n7JG36QJx21Snu4y0ozRliQ+3Fp9TSFN2x0uxm7ImVX0MI4E4Pf5yJEWtuIvufiFZeQzjn/zq4RqZXfr8HbW0ObpJuUByFnzLjcWaamHnKVCWFmyleCAxr0P5eDgCBgzjuVM9p86CzIcv7l8KdtLKzBPOMmFm15/ntMrPjSn/a6fGVrUwBDsYHG2yDCywOXw2xiVMnRYTza/KdXuLcUdBU4I/x++R7chR2oZSspMCJf79zYObZdneNWmHZIbK17JP16VHyNbiuL1uz+Y4AW7XWWHr6FTxGLq15XmGEKZVacpFmleZWUxTPsmmG+OOabczU7zWfPF2+hiQppmv7qa7ZqYKaUqhm6fnKY9j/IcbBBfe1SAXPj99qoZCjlRTR/fE5+9g7wq+7VYt2DyC7IoXXKV4IDlTLzsCKh8TB8ivtbhk/xL24aA7neo6GO9SIZ4X1XPmDAcz+uhrD2v7lxYe6iGVLDBELUKYzCxMPh/jEiZEWlsT3Zvn3SyTCjSCuPR4mBwEizI3NFOwyhNaZX/r0GY52wlDcn0l+4Rs2bcPaeVv3z28VXmMN8DtQiMK3K7fxe1WHuMqpmxI8Z3W4s+X0OT3c2nqrgS6Mf3o4O2E2C1PV5+HUQJxWvHx27JMT3U64x/868ly+sIdOjr1Vj1NebeWDsTXUEFlq3KR5AzlOu8ulpNyWpVCEejIcryC8e1fQkkXOsCpnk9nQXc8lIGprofxHmhUgeYSqufMUZCdej+sW5bjfeEuA+XWcDneSLR0EVn6BxbXHD4b4xamvn4LragrHLLo9SWw2Mdept/Hhcu9ONZGEQB7npCJ+vLeECkoKIPz5tBYZLy+d3ibvG1ona46xhsgc/eTSG2ILR5D1TGuYsqmZN9oqDCriKZuSqIb4xXzxoQ8TVnsw6WDPgi66L3yxla654VkenT2MeUxjO/z60eq6fTb9HTWNB09t6yKDifVUkx6w4SyTGin7M1yvITcDqVMBAOJ4r6rHhNHQGc3tMdWPafOgmYDXs0wMkogsarnyxmw/+nKt9pkduna99pIJQqMRqsQpn4WJp+PcQsTAtL0VOGJ4QtLHwRd9n4vxOhrBzfJbnS2mSeAIa3ISiHzBHly9+whe350dPvJIb2TPHzdo4H24ijJ+0L4BuXprmLq1kSZ2VEt1jzCjBKa8lkmTU0ZpQNkaiRNFscoz8+MyaqP36JVn7xFN04vVJ7O+CbXC35wf61c+Fz4gJ42RtRJYTqaXEeVDZ3KxZIjYLGsWqx5goS8TqVIBAPJmQaKz+9WPi6OkFE+8b0tVqoNgdVOPFCoa554BrG+pZ/OussgG8Vsie8jlSgwGuhUyOH7MSFhQuR0NNODHhxm6wr+m3aIfhsbTv93ZCudLwQF2SZbefribq3j3uVxu+lfyftpkgeyTz+L2imF6by9G+lacftUx3iDPwuBxD4mCCYeN9UxrmDqjgQhLV4YXjurmCZ/kk1T9wvxz7Apv7PeLuxbsrZ6TxbCJI5VXo6HefydKrr1hXLlab4KROnD95bSAy+eoKdePkxTnytSHsf4Fv9+upwuGNi/9LuZejqWppPCBDKKjdTVM75sA+bMqBZr7iZByEJylkEpE8FAYk6r8nFxFDxvqufTWbB/KbOSy/F8DTT0QNtx1XPmDB+Gd8vPjG891kxVQoxVosBodPQOLKg5fDomLEymfgvt1lfSnTmKEiYfB6Vw6FCHOUMXx+ySjReQfbKKEyTh7PAN8vfY9+TOduW/it4pr++cPRtl9z/VMd7gCiGMeAxw29w5j2lqWDxNesGDwjS9RLYIn7JXiNIoWSVkJk+Wayb6zrwoCNN7qxpoiq/s+3KQKUKSwLKP3qc1816nW57PVR7H+A7/eLKCzrhdLxc/L600UEy6/qQwHc9ooKbWPuWCaTRQjoe2xqoFm3sJziYPVtANEI0u1I+NY2CDuuo5dRYsyrEfSnUdjPdAW3HMYlI9Z44CGf758y3yMwMz27g73uggY8vh+zFhYUKY+vtpfrX3ZjO5CsgQBraiDM3a5tsWDMq9YH+o3PPk6pI9NKqwChrETHWMN7gm9ZDc64Xs1+XicVEd4wqmhgthmuUZYZo8t5Cm7ouTXe9Ut8UWZNVOClP8MZr8tm90fJs6vYw+DWmkZz+sVp7u66CT3mtvhsh5TXfM4H1hvsyvHtKG1Z4upOlEVoeQpKaTwgTK65wfYtvU5o1SrD5KyjIqRSIYkJ3x8rsUj4vjYGaP6vkcDxVebvjBDEc29HBBd7ykErP8zDjt9iZacpiH1Y4FD631j3CJMCHQavzN8nS6KWt4WZO/8p/Ug3RpzC76xsHNMvNjm336ohCbH0dup78m7pOL6olmnn49IExfEpd7RbLvCBNk4atCEiFMyLKpjnEFU/e4WZhmFsvOd1O2Jcq5T6rboOIfNlm1qbHRNOnVAvXle4Gn3qumkH0GuvWFMuXpvk+JFKedC5+lzz78hG593jeyd8xQvjpQjveb53WUmtdJsRmGIcKUkKuX3yirFk4j4fFyvIJeSsppUYpEcNBEiblt6sfGCVzWHa+PKJvL8XwOzMMydky8HO+1rVo53g+ebqajOWgSohYFRoNbivtHuEyYEI193TS3NHXIgjMQQDbpSiExv43bTd8/spXO3jM4KBfNIjAkF/OTrk4dv+hYhQkihn1TqmO8AUTQ2locjSlUx7gCt2WYZhVpzRwweDbBubJRlEaiJNH6/6nRMTTpJd/Zd4NyvM826SgsqoWmTFcf4w/cPiOL3nhrvdzbNGNuuCzZUx3HeJ6rnyqn025rkoufVzc0S2GKyzQOEaYjyXWka+lVLpxUdPZ4erHcF7Ttw1PSdZSc1kCJ2S3jbiNuBd3sXDWsFovy1FIWJl8jS7wvJ9rQA4OIr3xTG1Z71dttVKbj/UujYegg4gZ5/hEuFSZEXkczPV4QN2ThGUhAnlC298f4PXTh/tCT4gTZOUPIE5pFIDOlOu9oDBGmJN8RJoDugbiP341w34wol+9hwtDZ5WkyKzRklpITQIJtM4dTI4UwebOTn4Ibny+jtPxOKU6q0/0FZJomP1dMG+a/QsdWTOO5TT7CxQPleOfcpaft0e1SmE5kNQtR0jrlWUnOb1IunlQY2j25WBayJGRBKROBiBCklNQGShHPSUpCNSXHV1FihkE+DurHx3FyqswuGVYLagwW3r/kg9QYJi7ExwtM9P2nmulztzXR7E1dpJIEZhDMYOLwj3C5MCGOtzT45FBbd4BBuSjNQ3c7a8kexOmHR7fLrBSaBqjOZ8+lMbYleb4lTMiq4X5huC66xqmOmSgYEgvJUS3aHEYI1+Q382nKuhS6MeGY8nocBdILibX93ZR9cerr9TL3za2gjMIueuGTGuXp/sas13bSky8foadfiaB7ZyUpj2Hczw2C8wfK8X47E/uWNGGKz2qRWSVbYQLGNpNyAWVPtacWyyjDC1RZghilNWqk1AlBqhGCVEUpJyo1hCglJ9VTYs745y3Zgz1HaNahek6dAdJVWMfZJV8Dw2qR/VU9Z46C18eSiB76/J0GOnOagSKyuBxvLNBgg8M/wi3ChPRiQmsjPZIfO2TBGchcM9CqHNkYCBME4wu710uZglSpzmPLr6J3SWHytaYPAKV4uD/fPLTZbfOppm5PlLOQVAu3sZj8upCkpelCupwvu1OBrBKacFyXPrSd/JQtvrt4X7JNT7Hp7TRttn+1Gh+ZEnr77TW0Y+Fz9OjsaMXpjLu54slyOvN2vfym+MEFzZSY3SmFKSG7Vc5gshemgspW5SLKFpT7FNS6f7GcUNAjZCmAuuFZM0cp9Vr2KBGCVD0oSDYki9MTM1tk+3TVYzMesLdF1+qacjzM30orU18P4z3wvlQ9X86Azod3L2yXX7L85LkWqmtWSwIziIn3L/lNuEWYEJCm+FYdPZAXM2TRGeigScI/k/bLbAwkQw593b2BLosJG7UxxM+idsjGCmguMZ6SPncC6ZPCdHCzwxkzZ5kSmixbfasWbkqQTZqfSVP3nZDd65xp5DAWePwvE8Jk/3xNWZmmvi0+wF2vVIgFbQcdS2mjyX7WanwkpjxXTPe/GC9586319MjsGOVxjHu47OFqOu02PX3priZ6J7RFyhLAHJ+jYuFuL0yJuXpq6xx90YVvsFPE4lu1YHMVkCX/n7M0IEhCTKUYxVdpKATJSrI4LjGjmeLze5SPy0TIqDAL0XGNMDUK8VJdB+NdXCHEtcZ++r+nmrU9j9u4HG8ssH+Jw3/CbcKEgDQdNtTS3bkTK4/yVzC3CB3mThPSBHH67uGtdM0IMoQSPkjJeXtDhmU2vM2PIre5V5gwHHZdqnLRNgmLf5TqvVREk18toCkLsmjKnniamuq+boy/PxEuB/ba/95XhtaOxEvza6m900Lrwg1yb5PqGH/lqVciKGP9NTTr1TC6cXqB3POkOo5xDdcLvndfnVz4fPcxA4XFtJ0UpqScNopUCFNUaj3VNnUrF1JW3L1YRttszBpSS4iPguyRNYOUrO09UgmREpTeJQpZTXfNPqWRKKpzTXc8UFDL7cR9DbSLR+ZP9Xw5w760PvmZcea0JsqtsZBKEphBWnn/kl+FW4UJYRHadMRYSw/kHR+2AA0GID/Yn3Tuno1SOtAoAhko22NQ5vadgcYK5+8LcVvZ23j5wRFNmL7lrpK8jKM0ZXUaTXpRSNErhTT5zTya/L9smrwwQ/5+yo4EmnpUvH5GGTDrKiCEyKihxHLYaa/7TkvxkVgV1kRNzSZ6f3WDX3fOU3Hz83mykx7kacn/PqB7XuD9Te7iqqfK6fy7GuXi52+zDZSSq8kSSM5tF8LUMEyYQE5ZC/X0jfxNdV6N+8rxEnM7hCz5QWYpvXFAjgbK66wZJJUQjYQ4PkmcPzGz2aWldyMB0VU9n86C/Rrotqe6DsZ7FNdbJtwdD9zyiVaO97fXWkklCMxQeP+Sf4XbhQmh7WnS0aMFwbOnyRaUdmFfEoQDZXdo7PBXmwwGuu5h1pNVSmzP6wug8x9u27fFbRutrHC8oJHE5BNRNPVYjGzdfWPcMboxMUors3NTk4mRQOv4X0YP7Y4nST/qXMmgl7hpRhnFpLZTdUMvPfZ2lfIYfwfzmj58dyl9+N5Suml6Pmeb3MBfHq+gM27Xy8XPCysMJ2UJpAgxiRILfpUwRac3UGe3OhvR0dMvN5arFmwTo0+WCab4bGbJrrwOzRmcFaQB0PUuKVVHCeI5cEfpnQoITpcLFtOgrpmzS75Gonh+64wTF2JI9ZfuNsrPjLd2dJNKEJih4HHj8J/wiDBZI7PdQA/nB2emCVyfEUEXRWyV0oSuetbmDtgz85V9IVJKkN2wP5+3gcThtkGcVKdPFGStfKEMEeL6BSGzqj1kcgaTYmHpi2Cgba2uj8pqeumOlwKrNM+ee15IppS119PMuWHK05nx8cuHauTCBzOYjqV1DBEmEJXaqBQmUFbXMWwxBWqNblgs+2InPGuJHRo0oDmDQnycAmV3CTWUmN4k7nPv8MfAzRTVT7wZgJXcau6O52ugAUeLC+ZrrYnqlZ8ZFzxopAMZ3B1vLIyd3PDB38KjwoQo6mylV0pT6KYs9+1B8WVuyDgs9zJBmiBPkAXMXfribm0Y7uWx4crzeQuUqGEwrztlbpJ4TLzd6ALPw0+jdtBPRriPU3ckKBeWvsjU6aW0ZKueenr7Zee8e+ZUKI8LFJ6Zc5D+9+5S+e/X3gyhO2f6bnMOf+Grd2vtxC99Vj9MlsCxNJ1SlsDxzEbqEq8928UU2g27uhwPpWhJWT7SCQ/tvVOFIDm7B2kkIEnisUxK01NiVqsUQ9Vj4G4SBBgya/tcjhcMvU0tVV8P4z3wvpxou3iUlk39SCvH++urrZRVxfuXxgL7lyw8sdavwuPChKjt6aT3KzLp5uzglCZkU75xcJNsI/77uHD6U/we+W9Iia+1FL8u/ZDcVwXB+1X0TuUxEwWdBb09ewrSCjFElkl1+pSlGcqFpa9y+4vlFJ3STn19/bTtsJFueSGwM01Wdi58lrYtnCHL9lSnM2NzzdNlsjseFj+vrW9WClNMul4pS1Zq9UObP2CxnFbmKmHqowRxG3xivxIySeL+ukSSBOh0l5TaSAk57eI+Ym+S+xo5OEJGudkle1sAyr5Q/qW6HsZ71DdPXIghXT9+VhtW+9jKTmpoVUsCM0hHz8CCmMNvwivChOi0mOiTqmy6SbE4DQb+krCXzgxbJ1uO//zYTilLZ4j/u2OP0ETADCk0rDh15xq5v0d1zESBQKKjoOo0T4DsEroUXjyKEKIRhWpx6cvcPLOMGgwmMpn76aN1DcpjApGpzxXJvU3HVtxJr74RynucnOSSh7VyvC/dqadDicPL8cDxDINSlKykFhqGNH/AosxVi+XE3Ha1vHgayJLtsNhxkgyS6igxq0XcP+8Kkj2lDa4ZVovLQGMB1XUw3gPvSVcI8YaYXjrvPgN96W4DrT3WSypBYAYxCHrE48bhX+E1YUJY+vspXF9JjxXEBZ04IZPxtYFSN7QSx0+U6qmO9Sb/ECLzxd3rZQbs726SGnQNtO8c6Ems7d+vThmhLDApSnbwUy0ufZ1XFtaSodVMnV0WenN5fcDMaHKE6XP30YZPX6HHZ0fS4y9HyQG4LE+jc4PgKwPd8X43s4miFfuXQFymUSlKVo5nNFBTa69cTGFBhoW3asHmFAU9lJjdqpYXT5PWMO7GDSkn0Aq8hpJSGigxw0gJeV3q++tlsJhuaHFNOR5mOGVW8P4lXwMSq3q+nAHtyKev66RTb2uibz1qpDxuJz4mxg4ux/PH8KowIcxCmtAM4sWSZPViNYCxDoS1luP9KWGP8jhv8ocT4XT6rnXyNl6bPrzVtivAkFhv7WFCdgsNN9AZD5km1TFTDx+Xg3JVC0xfB13zNu4zUG9fPzUaTPTq4jrlcYEM5ja9+NouCl/8FM15Y7MciKs6jimlK54sl40esPh5cmkLJeUMlyUQn9WsFCUrR5LrqLS2XWYWUHqSVTmxxTLmKyVlGdXy4mkgS+MowZOSlKajhOw2SsgVj6GPZZPsQTkeSilVi2RnaWp3V4dEZrwkiOfDFfvTKvUW+tOcVvkly63z2kklCMxQ2oRkcvhfeF2YEBDtdnMfvVueqVywBiq/FqIAUQKfD1s/4v4Zb4HywIujd8nb98XwDcpjXAG677llIK4DfP/INtnmHR0MVaeDKdsSadLz/puZwH6m7GJtQl5JdU/AthsfDWSWbp6eR9NmptP9L8ZTxLL76dHZx5THBjOXPlxNp4qFzzl36+l/W1uUsgQSclqVomRLSn6TbDHe3NkvFmfjFyZtv5JCXLyBk2V4WhvwBvF4dVB8AQTJtyXJlnwXNAOwUtbI5Xi+BjJ+aNager6cIbnUTJ+/0yCFaVdyH6kEgRkKl+P5Z/iEMFkDJXp7mqroiYI45cI10MAi/fRdWnYJ5XjekoaRwO35vyPaDCZ3lQsiw/NNL8yeggyi2cYXw9fLn6pjJJlCmFak0yQ/L2V7/J0q0hnE6kdEcm4n3f1KYHfOG4t331lNKz9+W4hUMc2Yu4fun5UQ9OV61z9TShfdWy8XPj9+ykC7YtqUsgSSctuUkmTL0ZQ6WZZXrhvnYrmglxJz2ihZJS7eAANnx5IldLdLrJWzklA+6K3udq6gxjDxci2AxaHrGn4wrgIS6wohnrulS35mfOuxZmrkZg9jgnI8rsbzz/ApYUKgRK+gs0U2hLg1O1K9iA0Q0PgB3ecgTe5qqDAR0L3OOh8K3fxUx0yU34rLRdML1Wnu5L9ph+iC/aH0g6PbRm+0kRxJkz/OVi4w/Y03ltVRS7tZvs9OZHQEfLtxR1n8v//Ryk/epvuENN03KzFoS/aufLKcvnyntn/p6tcMI5bjgZS8DqUk2ZNV2kzp41gsy5bh2T7SMhwgszTKTCWZSUILcJTbiduuuk/+BDKCKBtSLZCdBWVfqutgvEdyiUkOmlU9X84AGf758y3yM+OR5Z2kEgRmKFyO57/hc8JkjS6LmQ4ba+n+vBj1QjYAwGIdMoIudL7WThz8J/UQnbZzLZ0qgDypjpkoyC79JcHzHfL+78g2+rKQwX+PsXdqakw0TXojX7nA9DemPq/tZ0LXPIuF6GBcK906KzjajY/G1OcK6fYZmXKv02cffkJp666jZ+ccUB4byPzpsUo643atnfgLK4xKUbLlcHKdUpJs2XuijmLyepSLtpHQSvCa1OLiLcR9VYmSJKHGpuROfZ/8jewq12SXQFEdZ5d8DZTjoVmD6vlyhhNCrNFK/PQ7UI7Hw2odAY8bh3+GzwqTNYq7WunVslS6M+eYckHrr1gzHBCmbx/aMmLDAW9yWay2xwpZJtXpE+UaIWTYP+QuGVOBx/nXx3fLrB72kI3Vxn3qoVi/bfigAqV4yBwg0AhidViTHHSrOjZYeeSlGHr6lUM0+bkSWjfvVXpkdoz896QAL9n7xUNaO/HThTQdTGhXSpItR1PqlZJkS+jROtp5Au2y1Qu3IaAEL7dNLSzeBANpVaIkQDtwrYGD4v74MfXNrhGmrl6ilBL1dTDeo8gF3fHAM2s65WfGr2a0UFo5d8cbi2bxp9dskX9+OfwwfF6YED0WMx0x1tLskuSAGXaLVtaf371eCsmvY32vHA9Yhe5nUTuUp0+Uy8X9/uZBz+1fghz9MX4PnRW2nr4TsdUhUZu6KVm5uPRnnnqvmmoatf1MHV0WWrRZF1Ttxp3hk/cX0vvvrqCbp+fT0o/ep1mvhckZT6pj/Rm0E7/w7gZt8fOUTilI9kSlNiolycrBhFpasb+OVh/S0fG8MfbyyBK8FrWweJO0xhHbhycl1wekLKFcy1XDalH2xd3xfA9d28TL8fDc/mKgHO/OzzqoqqmfVJLADIKOobx/yX/DL4QJYREvs6a+HtqmK6c7cqKUi1t/4tKYMLl/CUJyTZp72nVPBJSqoRQPmRjstVIdMxEmZRyW3fEui/GcLKLs8by9G+mcPRvpOgdbpE/+JDD2L9nz/EfVJ/czdfVYaN7GRuVxTKnc04SGEC+/vpVWf/IWPfXKYbpzZrqc76Q63h+55ulSOu02rRxv7tqxy/FAdJpeKUpWdsfW0tK9dYJ62p/Srly4oWtcYl4HJWca1MLiTeS+JXX7cMxQSsh3rtTQXyiodV05Xil3x/M5kPFzhRDvT++j8x8w0BfvMtDHe3tIrxAEZhBDB3fH8/fwG2GyjZqeTnqjJIOm+WmZHsrCIAuQJQytVR3jbX5xbOfJcjx3zEi6WsgLLnusPUSuAtkkZMzOCltHVyQ7OCQ34yhNmuWfA2vHAhmlxVt01NOrfd+lM2ozmjjT5BgQppwNV9L8D+dLoUKziFufz/HbTnuXPlItZekL0/QUl6kWJHtiMwxKUbKyObKOFofX0SLBlhgjxdnv8RH/98kSPCsj7FuSmaU8/2/sMBL1za6ZvYRv03OqeP+Sr4GularnyxnQXe/VrV1y7xKG1R7LM5NKEphBUI7Hw2r9O/xSmPCia+wwU0SDjt4syfS7/U3IrqDRA4QEYqI6xptgHhRkBhkwzClyR7vzS4+H0TcObvbI/qVrhJR989AmOmPXOjkk19H9YlP3xykXl4HCtNnldPBEK/UPfIhjRtMzH1Qrj2WGM/W5IrptRpaUpJ0Ln6VF//uIps3MoDtmZMgZT2gmoTqfL/KVu7TueL+boaeEbLUg2ROXaVSKEkA53tpDmiyBVQcb6VjOYEbG57rg2ZPaoCzF02Spa8gCNJBILTNTswuGmQJDe78s71NdD+MdUB7Z5oJhxLXGfrr+/Tb5mfGXV1uprlktCcwg+AKBw7/Db4WptUt7EVa29NFhIU6zilKUi15fBA0fPrdTm790ZbLvdcf7c8Jeuc8H5Xh/ODHKjKJxAmFBadzFMbvGbLowUa4Vj/VFEVuk/P3o6HYpq6rjVEyen6lcXAYS982toKLKwU/yUiFND75eqTyWGZlbns+Vbclvml4gZzodXPaQLOHDaSjhg1zZn8dXuPKpcjr1tiY5sPb5lS2UkqsWJHsSsluUsgT2nqilZfsGhWnxnjram9SmLdp8tQTPCuYtqWQpgMvwrORVu2aYKahu4nI8XwMZP1fMXkopNdNFjzdLYXovrJvs5YAZCsrxuNmD/4dfChO+EbcKkxXUzx5saKTH807QzVm+3Rji90JCIEuQEncLg7NAZiAWuH1f2L3BKcFwlMtiwmR3vH85Who3TmxLH79xcJN4rB2/L1OTI2nSjOAYZDrtpXJqNIq/ggORVdRFd84uVx7LOI5VktLX/5cilj1ANz+fRzcOtDD3pVlPlzysleOdc7eePgtrVcqRiqSckYfX7oipPSlLVtYf0VNiTqvvDKJVop63lJQU2GV4IKHIRBUuKNeykiPkS3U9jPeobnJN9nDNsV75mYGW4nm13B1vLFp59lJAhN8KE4Z/qV6Yla19tK22mmYXpfpsc4gfDsxfuvAAFvHqY7wF9hSdPVAu+KvoXcpjJgIaXHwhfL3M+jhaGjcesO8K14FMHmY93ZDuXOnflLAEmhRE+3leW1JHjQbxl1CEydRPe6Jb6Dae0eQSULKHUr3JQpLQsnzXomflnCfseXr9zQ00fe6+k8fZn9fdXC/41j31cvHzi2cNtPv42O3ErSTntitlCayPGJpd2hBRT1GJQkaUkuJDpAzft5Qs7k8gdsOzJ7HYJMvoVAtkZ0H5EXfH8y1SSswue34nfdguPzP+9WYbqdZhzCDILvVq/ZU4/Dz8VpgwdE314rRS0txDBxoa6LWSDLrFx1qRY38QhASDa1WnexNIEsrXvrB7vdzLpDpmvEzNPCJblKP73j+S3JddQpnj14WM4jH+mvjpdGOJjCM0eXGGcoEZqNw0o4wWbtbJ2UwIdM7bsNegPJYZP5CiW5/PlrKEMr533l5Nn76/QJ720ms7KHT+S/To7Gi5/8kT7ctRjnfundr+pevfNlJijlqOVKTkdtARxfDaQ4m1tGSvJktLhCyFRTdQXKpKlhopLyaEMpLTFad5AUUpnpSlAN6zZEt6udll7cSruBzP50A5XqcQWdXz5QxoJ37OvUb5mbEoopdU6y9mEFRDcbOHwAj/FCZBu3jjq16c9uja+ymlqZVmF6epF8ceBhkl6/6lS4+7PoMzESZlRNAZYevkbfvlMdffNojM2Xs2yMyP6nRX8O/UQ3R2+AZ5H84R13XdOKRvatwxmvx2nnKBGcigQ96WQ0btTSYCX0wsCOV24+7Gmlm6eXoePTvnID3xylF64MV4il11K6Wtu1aK0zPi90+9EuHyUr7fP1pJZ9yul6U1s1Y61k7cCoRJNbx2e7RWjrdifz1FJgoJETKSml4rfjZQVmIsVe+eTLnHt4nf1VNh5AJKTykYKi7eImFoC/HkxJqgkSXgynK81DL1dTDeo8xFz+9iIUmQpQsfMlJ6BZfjjQW+hOAIjPBbYULKX/XiHInGtn6K0RnondIsejgvzmv7nFCShsU8sjh/jA9XHuMNIHI/idwhbxuEw9XtvnH5PziyTQ7rdUcrcXTb+21cOJ0phO9kGd44919N3XOCJr3gO3tMPAmk6WBcK/WZtK/EWjvM9PaKepoyXX084z4gR/e/mCB/vv7WBtqz+HE5SBenxa2+hRZ8+Cnd9UKqkKsTNPv1bfTwS8flaY+/HCnbnN84vUD+HyKmKvfDsNqfPlArFz+fn9ZEe2IdL8dLy9FTWnY9HUupEpJUQ3HHj1JMXDwdSaygXQeiKDJ8MSWfOCFFpGrPLVR85E1KSy2ljORsykqIGRAohbR4C7tSvOSEGkrMGWl2VOCB/Uuu6J4GjB39lKC4DsZ74Pl1RTleVy/Rn+e2ys+M695vExLGw2pHA63ETdzsIWDCL4UJgTeu6gU6FvVtFkpsaqE11WX0ZEG8csHsTv6euE9KCVpc/9UNA2HHCxowoAwPsvHTqB0u31/0OyEzuM8/j9opS/NUx4wXdB2EjOHyT92ptULH71THjom4bVOWBFc5nj33zKmguPQOsgx80FfU9tLzH9Uoj2W8w4uv7aTn5uyn22dk0WOzo2jhhx9LaYIYbf1sJq365M2TAhW++AkpWhCnma/upjXz3pB7qaY+l09PzV1Ft7ywiX7xlJ6yUlOpKGY5ZYufabktlCc+nwqOr6H0rFrxuxQqiXyHCmOWSWEqPvYxlR59i+JPHJeSlHfgRUqO2kDHEksp6XgE5R7fQukpuVJG0lPyxU8t0+ST2LUQTxb/TsjWOvoFC1mVZuUCeTxU6Lkcz9dwVbllRoWZzr3XIOcvvb6tmxpb1essRgOVUByBE34rTHjzq16gjoKMU1WrifbU19MT+Z4Tp9+fCJfC9MXw9fRPN+7jcQbMWcJ+KuvepatSXNvq/KqUg3SaELEv73X9EFxIJzruQZQA9mBNaG5UaiRNejEwh9U6w0NvVFJlXa98r6E0r0L8+7ZZ3DnPV4EoWcv1sEfqNoG1S99dL6TI2VA45t5ZSbLd+d0vJNMNzxbQHS9upFtfCKWXVhkoOyVeiNA8IUeJUphykw5TXvxumU1Kz6qi7LQUysgsl8KUnl0vfldHx9O0PUxHE0opWRxTVqKj1EyFlPgq6XZd8YQsJeYElywB7DlSLZCdBV9k5nJ3PJ/DVd3x5u3rpjOnNdE3HjHSzqQ+Uq2tmEE4uxRY4bfC1CPevOg+onqROkttq5n2CnGaVZhC9+bG0E1uLNfDwFZtf81Gn5nBhKzXWQN7l1w9SBdzkNCAAZmr38btVh7jLCjvu1pI2I8jt0sRg+jh8fyjC2ZGTdmcNGQhGsw8/X41NQx0zkNkF3fRvXMqlMcy/selA+3EPz9NT/HZHUNK7hzleEYTRafWUn5RA/U26YQwKaTEl0mpH5JZSsxsFgvMvmELzkAmqdhEzZ2uK8dLK2Nh8iXQ/bCzd+LPb0sX0W2fat3xfvNiCxXWcTneaKCTM0dghd8KU58ZH87qF+p4QbleVGMTfVZRSA/mxioX1BMFQgIxQbYFi37VMZ4E2Ri0N8dt+sq+ULkXSHXceEBZ308GpOZH4qcryvyQofqleAwx+Ba3+XM719B3IrbKksIJt2hHdmluoXJxGazMXVRHdXpt16rZ0k+HTrTSXS+zNAUCF9zVIBc/lz+vV8qQI2QXGKixupGoWU/dej3l5SmkxFdJG9oVLzHDQPEFvcpFZyCD7mnYE6xaJDtLndEi98uorofxDvk1rskeZlaa6eKZLfIz49EVHaRaQzEa+DKfs0uBF34rTJiajA11qhfrRKkT4lTQ3EXrq8vpgdzj6sX1OPlJlNZY4XwhJ64uTxsP2K+EDA32/yDTpDpmvGBA7Wm71tI3Dm6eWJmcALKFcjtkkqxdBr8YvkGWOLpK8qZuT1QuLIMZNHuYt7GR2ju1T3+0Hd+4j9uN+ztXP1VGp97WJBc/L65pUcrQaKTld1JVVQv1NjVRv5AlCFNrvZ7S/KUcD6V48YNd8ZLSm4QsBVdmyUpZo0VWbKgWyc7Q00dUWMf7l3yNumbXCNOu5D76wl0G+ZkRnsrleKOBvUta2ySOQAq/FSa8GJEiVr1YXUl5Sy+triqjh/Ji6dbsSOVC2xl+eHS7XOxfsD9UdsxTHeMp/pa4l04XQoO9P8gATVRqrEwVl2PdqwXBuWKcpYeTMg7LjnoQJXS/w+VB7vDv70Rsca1wJkfS5PdylYvLYGfKc6W0+aCRTGbtT4DF0k//W9tAU7lznt9y8UA53jl362nVgTalFI1ETlE7NdcbpSTZUluuEBNfJbl2UJZSdUErSyjHw1wd1QLZWbB/KaWUy/F8CZRHtrio3PKZtZ3yM+PrjzZzs4dRQOUTD6oNzPBbYUKgRlT1gnUHBcZu2lhdQTMLk+km1YLbQdDNDQv/rwphGncnNxeA6/76Qa0UD+VtV7uo0QNk6Q9CltA+/Mxd66Q4OVMqB2n7V9J++nVsGH338FbZhAK3EXw+bD19T/zurwn7Jl5+Z8fU8HiaNCs4W4k7AgbbhkU1k2mg3Xh3j4U+FNLE7cb9j+sFX79bK8e7dLqB9sQ51k48Pb+TKipaqVNvGCZLIC9XNZzWB0kb7IqXlNJACfndysVmMIAFtavK8SBequtgvEd+jVmKrOr5cgZkIH82XSvHe25dF6nWSIxGW5fWKIkj8MKvhWm8rcXHi66tn4qau2lXXS09mh+nXHiPxQ+P+oYwXRKzS+4twm2B4LhKQP4Sv5e+EK61J0crcUf2LUGS/pq4V5YHIvOGrnfW2yZFSUgTGjxgnxKG66ouY0KkHaXJn2UqF5fMILe/WE4RJ1pPTi2v1fXR7AW1ymMZ3+WKJ8vpS9N0dKpY/NzyoZGSctSCZEvuQFbJbGxSylK3TkepKjnxRRK1UrzkxFqKz+9RLjSDBZTQqRbI44G74/kW2Evmqu6HcYVmOu32JjrjjiaKK+JhtaOBx4sjMMOvhclkVr9gPUFpSy/Nryig27Oj1IvwEcDCHxKgleR5Zw/TtekRJ0vckLFRHeMsmK3054S9UpQgO5cdV3fEg5hBkK4TtwGi9u1Dm+m0XdptsYISQZQKnr1nI10aE0bXi2NVl+UyIo/T5BnDB3syw3ngtUrZLc8apdU9dCc3gfArLn+0is64XU9nisXPy2ualYJkBXuVSsra5F4llShZqS5ViIkvMjCgNjmxRiwqg6/Bgz36VtcsqJGlUl0+4z1Qbumqcrx7F3XI7NLls1upsom7441ES+fAH0aOgAy/FiZ80e2q1uLjJUZnoDnF6XSbg/ubfhGtdclD04drvND0AQ0SLjwQKm/DeXtDhDxNPMsFAfqNECRI2Gk718lOgNh/ZHsMBOlviftkZutbQpLOChsstcO+JGSRvrIvhC6K2EK/FI/RP5L2u3zArZJU3rvkLM9+WE1VDdqMJkR6QZcUKdWxjG+BcrwfPVArFz9fuc9AYcfV5XhpgrzidtLXNp9s6jASFqOeMrMVcuJroBTvRJWUpYTcDuUiM5hIKTW5ZJgpqDVwswdfI7vK7JJmHii1PO8+o8xIT1/XSQ0t6rVQsCM74/HepYAOvxYmRKsHGj+MRUlzD22oqXCoKcRlA3OYvizkAA0NVMe4EwgLrh9d8S6P3T3hUjycH4KEOU6n7lxLF0fvGiJLV6YcoJ9F7ZAliNiPhOwRrh+ZKOydwsDc38aGC0HaJ5s4uKrxhKNM2ZREk55TLy6ZkXlOSJO13TgiKrmNps3mwba+zn+eLqOvDuxfuuxZIRG5w2UJVFa0Upd+9KySFXTHUwqKLyEH1FZTshCmhGwMpg3OJg+2lDa4JruE7nh5XI7nc9Q3uya7tC2hV35enHefgTbE9JJqDcRonfE4Ajv8XpjwDZnqxesNYnVGuiNn9BK9P8bvkcJwrpCFq1zUaMFRcH3n7tHmF2GY7ET3A0FuMAPJKkAQH/x+atZh+kvCXilJOM0KZAmieImQKm/u3zpJ3DGa/GqBcmHJjM0nGxrlbCaEodVEmNmkOo7xHbB/CeV4WAA9v8wwTJSyCjuotUHd1GEk9NU6ys/XU26unrKz9ZSRpaP0LD2l+lKL8eQ6IUuVQpZalYvLYCOhyKx181IskJ0FX1qml7Mw+RIYVuuK7BJ4aJlWjocZTIklZlKtfYIdvJcwG5QjsMPvhQnzmLxdlmfLCX0zPVuQOGInPTQugDygsQG6wamOcQcob7POXDp91zr6xwRnLkG+sP8Il4fMEfYa/VPcn0vETwzlxe8xgwlZJJTZ/fp4mMyoubq73bhJP0pTVqfSpOm8d8lZ0GZ87uI6ajQMZphSxGL7wde5LM/XuWSgnfhZd+gpKnWwHC8jv4PKy1upe4y9Ss7Sb9ST2aAnU5OeevU62Ryiq1FPHYL2Bj211euppU5PzbU6MtNfoggAAG6uSURBVNToqalaT7oqHTVW6am+Ukd1FTqqKdNTtaCyVEcVJToqK9ZTqaCkSE/FhXoqAgV6KhQUCHEDEDgM0QW52Y2Uk1pNGbnNsitcaqlZtr9OLjFJsNcDYJGJjfLBMHg1s8J13fGQycDjp7oexjsU1ZmVz5WzlDZa6A+vaN3xbvy4neq5HE8Jz10KjvB7YUL7Rk/MY3IUfXs/JQhpejz/hHKhjr08ECbs98GeHtUx7uDK5AMn9w39XIjTRMQF2SPsN4IUQfx+ErlDNo84e88GefkYKItSOzR1QLtyRzrleZqpB+Jo0ktFykUlMzJoI/7x+kYytg5+ndbf0kTvL2Lx9Ae+ene9XPxcNl1/Upbyi9vJKDvgqaXHl4GQYQ+VlDJBnxAz0KvXU49AClpltZAzAzW3I6vSTwbxGd0E2vpJL9C19st9Go0t/dTQbBECYKE6o4VqBdUGi+w0Vqm3UIXOIoe8opStuN4iF6WFtRbKrzVTXo1ZdonDvpGsSjNlCCFB1uWkoA2IWaKPyFiJuP2u2L+Ey8DjoboOxjtA+NHRV/V8Ocv+9D762sNG+Zmx4EAPqdY8wY7cu6TNdecI8PB7YUJ0eri9+FjoBXnGLnog97hysX7Wbq3t9p/i9yhPdwdfPWCduRQyboGZkok9UGGyg501S4ZsErriQZ6+vG+jbCV+fUaET0qSlalpkTR5bqFyQcmMzOTnSum91Q3U3GZTe9AiFq4pR6lofxQ9NjdfeT7GN7jm6XK5cRuLn9lrW2Rjh/KKVuozuDar5FM01FC/rp56+ya2gER5k0QIgj2QhmGIv0kAoy9UdPYQtXdr5WzNnZrESXET0lYnhK3W0C9FrULfT2VC1EqElBQJySmQcmahHCFnWULOIGZp5SYhZVq2LLFo7NI4ZNLqjK5ZUON+IFuluh7GO2QIUceMStXz5Qx4Hb+3q5tOvU37zMDrTrXeCXaw/uQIjggIYcKb25fK8qwkN7XSE4pM0zcObpbCgTI1+9PcASQG1wfR+W2cut33WFybdoh+HLlDltnhsiB8KO2DNKHk7m8J+3xakk6SdpSmLOSZS84y9fkyemdl/XBZyowhSjwoSd8dTY/NYWnyVS55RCvHO/duPYUdb6WmOuOYHfD8mqYGsugaJixL/ggWuxAzlN21dfefFDOZYRNgkac6n7NA+jKRUROLdGDNqqWVaRIH0I0PGTZVCSQybsFSBukpkP3E8696vpwBLcmvfrtNfmZcJX6q1jjBTnMnl+IFUwSEMGEfE/rfq17Q3gRp8aON+mGZpl9Fa53qfhK5fcjv3QGaK1ywT2u+gEYP42kjjg52OC+64OFyAPYmoTse9mFN9QdRAhlHaeqWJJo0k8vHnOHmmWW0dJue2jtt6g6aG8VK6fhJWQL9gqw90fTkqyxNvsYNggsHuuNd+UoDVZfpBsUiEDHqyNKkoz6xclQtBhnXgAwbpAzihKxGa1e/XGiflLOB8kfb0seGln6576kOoPTRYKEaQXXTYPljuU4wUP6I8kGtBBIZNgvl1wyWQOYMlEAiy2VbBmndo2a7N00lF4GGlj10TfdDZDXPvU8rx9sU10eqNU4wYxBATDmCJwJCmBDYdKd6UXsbnfhjcaRRRzdnHT25cP9X0gEpHd88uNntTRB+E7tblswhI4RMk+qYkcBt+/2JcJlFsooS5iWhNTrEyy8ySjZMPRhLk2fzviVnuPH5Mlq+o4k6umxkyVBPlHJkiCzZgvK8x7k8z6dAd7wv3KGj027T09y1jXLfj1I0AoT+pkbq6+pRLgQZ32ekksdhpY1A/O0HEDcrEDiN/gGZ66c2q8wJkZMSN1ACCXmrNfZLYasUQNawV60YZZADkoa26bIMcmB/WpoQs1QhZrIM0oeEDBk93E/VY+osn+zrkbL09YeN3OxBAbK2A01iOYIkAkaY+sQbXPWi9hV21dXSHdlay3HMKYJ4fDF8vVuHs16fjiG12t6l8/eHOiU4GHCLmUqQLZwfTSr+78g2+q8LBt16hdhomvwK71tyBplZ2qoXi5aBvwrosGJsIEqPUoqSLWm7Y+iRV7hluy9w/+xCuvOVIvriNB2df6+Owo/UKiUjUOg36qivs1O5CGQYd4E9btYySEgasm0o2bJm2azZNexRqzFq2bSKgWyatZFI4cksmoVyq7QmIjJ7NlDuKJElj4MMlj6iCYlruuPhflw6S+uOd/v8DlKtaYIZbAHB880RXBEwwoQlHT6cVC9uX6CuzULLKovptuxIKS7fGmjJ/Z9U9wnIH0/skZkl8HcnOvKhs913I7ZIUcJt/JqQrj/F7/WdluBOMvVYDE1+izMeznDnyxW05ZCR+kw2X6E11RFlRCsFyR6U56WGxdCjc1iavMVtM4vpo3kZ4nk4Tk+9l0efu62JfvSkjmpL6odJRqCAjo2mzi7lIpBh/Blrtq2zt3+gaUj/wP60wcwZKm1U53UWZM/Q7OHMaQZacpi749mD8lN8f8gRXBEwwoToFm901YvbVyhv6aPXSzKleFj3MV3qpsYPGB6Ljni4DsxLclR20H78/H2hcsgs+P6RbbLhg+pYv+B4NE1+P5cmPadeVDLDueOlctob0yI3y8vAX4aGKvFX9KhSjkYC0pS/L5qlyQtgH1nctljqjI2gmqOR9M8Z5fLb4jverQ3ccjzIUle3cgHIMIzjvLa1S35e/ODpZorMNZFqPROsILvEpXjBGQElTAijD2eZQGlLLz2YFytnGZ0Vto6+uj9EvdCfIMguQZbQ1e6v4rpUx9iC0kBkoVB6h/OhAx6kzl+zSpLEKJr8dp5yQcmouW1WOR2Max14N4notxDpqkfdszQWyHA8OJvLId0N2r7fPrOYFn2WRu3HI04+/sm7Y+iCe7WGD9v3V6plIwAwd3EZHsNMFDTQ+uurrfLz4pp326i0ESWF6vVMMMKNHoI3Ak6YfG0mk4p4fQvdkXmMzsfw151rXZ7BmZx5WHa1g/ignG6szng4/vLY3VLgcJ5z9myUwqU61i8Q8jf1cCxNfp0zG87w+NtVFJfeMfBOEmERslRZLOcs2QqQs/QnHKTYbbF070ssTe7ixukl9M7/MiktbLDNu5VFy1Ll4ufLdzdSc02DUjb8mpYmMne0i8Ve8LUPZxhXczzfRN97oplOv72JXt7URao1TLDCjR6COwJOmDBx2dezTOict6Wmmn4RqZXljXc20kggU4SmEti75EiWCF3vrLJ0rpAltBF3ZzMKtyJu95S9J2jSayxLzvDEu1WUXtA1+MfAYibKSCQ6sX/YAnw8QJrQCOJ+liaX89Sr+RS9NY6aow8rH/v/zCqVwnTbW1Vq4fBzpCwF4awlhnE1aGSw6FAPnXWngb54t4EOZnA5nhVu9MARcMKE9Z6vthi3pbrVRE9mJ8qmChdFbHWZoECOMB8J+48+H7aerkw5oDwO4NjLYsKkKFkzS9elRyiP9QuQWdqWSJOe5zlLznD3nAqqrO/V3kAIs5Cl9ASi/ZuUC/Dxgj1N8Tti6a5Z3NrdFdwyo5iWLUodUn5nT/vxw3TmHXopTDsOVSuFw5+xtLVQX59r5s4wTLCD2Vl3L+yQnxf/91Qz6drU65dgBI0eOII7Ak6YEL1ivYdvA1Qvel8iuamVvrZ/s8zqoDOdUgKcBMLz9YNaOR5+jpRdQhkeMkvIQkGuULrnzo59bifuGE1ZkqFcWDJqMGPp1cV11GgQfymtYerTZGnrSqK4vcpF+EQwJxykQ6En6I4XipW3iRmbaeKxe+d/WZQZHi0lVPU4W1m5KkUufr71YANVlEx8WG2/UU+djXrqaNB+gi6g01O3oEev0Qua9NQ3gAkY9GQWoOkEwGX1K67DUfpbjdQnVnn2iz6GYcYHWpz/6Jlm+Zkxe1M3qdYtwYhRrCfNNqMIOYIzAlKYkGXCtwGqF76v8VFRoWzM4KqyPHS5szZu+MOJkQfV/iEuXJbt4bgL9ofQVS4SNm8wdf8JmvxeLk2azpklR0GDgA/XNlC93mYHa08PUewRonWfEQmBpoQDykX4RDHHH6KYbbFi4c+ZJmeZ+VYuxWyNo47j6vI7e6zd8W58s45aahuV4uEMXY06ys7RnyQnVyNXkJenkZ+vUTBAYYGeikChnooHKCnSKAXFeioTlAsqSwSleqoq1VFNmZ5qyzXqK/TUUKmjxiod6ar0pKsxUn1Tnxw6itk2GECqa+2npjZt5g1m3+DbcrRbRtvlti5tNk5HT7/c54o5M9i8jRIb1cKRYYKR3Sl9dNrtTXTGHU2UXmkh1Zol2DAI8NhwcASkMCGwF8MfskzYz/SDgzvooogtMuujEgJn+E3sbilB6HI3ZYQyv2tSD52UKkjTf/21bXhKJE1ZmsGiNA4+Xt842DYc0StWkNGHiFZ+QhS6lCjeNXuXRgKZkWNb4ujWmZxpcgRk5HavT6A+IZtjZZWslEZEyUYPmL/0XqjOJe3E6yp0lJKh9wqpA6RkNlFifhclFJnGRaKCpGIzpZSY5CBQDAfNqDBTZqU2ODSn2kx5NWY5UBSDRYvqzVTSYKEynTZ0tFLfT9VN/VRjsFCdsV9KnBQ4G3lrluKmfZGH+TmQNhY2xteYNr9dfsHyp7mtpFqvBCP4ooVnLnEgAlaYEJi4rXoD+Bqf5BfSl3ZvoKtTDqrFwAm+fUgbOPvtiM3K0yFH5+zZII/5UvgGmZFSHefTpB6lqfvjaPI7eTxfyUmmzS6njfsM4g+AzV+AbrGSQ8Zi5TyiVYKoncoFuKvpO3GIwtYmyAGrqtvKlNL9swvpswXpVH04UvkYjsaa1Sl01h16+toDjXTgWJ1SgJwB5XM5ud4TJg0hS7kdFF9oCigSi8xS2pKFtKWUmilVMETeBFlC4HKEwOWeFDgzFQqK6sxUXG+RElfaqElchRQ5C1UJkasWIgeZqzVahmXk9JC6ASB2VpCdAxiGKhHCh2ydNWOnZe0wOFUTQNAhM3gaGKxqzeTJbN6AIEpJZFH0SfBa+PJ9RjpVCNNbO7kcDzR3EpnMA38nOYI+AlqY0DEPL3jVG8GXSNG10eVH9tL3Dm9VC4KDYFjtWWFamd1vYocPxJ2UESEH0eJ0dMX7XVz4mB30fIoMIUqHhCh9lkmTXuRyLmfBQNp9x1upu8emGLvVSHQoTMssrfiYSMi0avHtLnqFNIWvT5ANDFS3OVhBRmnBgjTKCo8mU/wh5WM3GnhcH3k7X07rv+Q5HdWU1A+Rn/HQ0agSGM+SmNsuBKNvmHAwE0Nm3oqRadOAuGnyZpLylirkLa0MGTiTJnF2IgdkNg5CZ5U6Qb4Qu/xai5adOyl4FioGkDxBKbJ1ED0BRK9CiJ4mexYb2es/mb2zFT6ZxbORPVu504RuQOZsBK67r5+FTcGGmF6ZXbrgQSMdyuTueIBnLnHYRkALE8If5jLhQ/+17Gw6a9f6Ce0lwnkhQ2jkcIUic4TZSmfs0krxfiDEaYoLSgA9BsrvFmfQpFm8sB4P04QsZRZ1kdlsk1lqbRaCtEUTJbBpKdGJfcoFuDsxJxyi/SHxdBN3N5RMfz2PcvZES+lRPV6OUHE4kv4yvUIugO7+sFY2WFBJkDNUl3k3u5SY26Zc7DOBQQIQ4qZiSAmlEDorVsGzJRkMCJ8tKLk8iRBBTQYHBBDiV2GibGsWT4iezOKhBFNm8MwyeyfF7mT2zj5zZ6HGVouWtRvI0mEIrMzG2UmbLwrbpA/b5OfF315tpZxq3r/U0qXth+fgsEbACxPWh/6QZSo29tCPD+6k7xzeMm6RwfBZyNDZ4RvpP6lDy/tuyIigCweG2X4xfANdN8YwW58g/ShNjYmmKRtSaNIL2mL6hmd4Ue0MU54rpWc/rKaiSvHX2jZajEKWNg/K0upPiSK2KRffnqBHyEHIymS6OUilaer0Enr6tTzavzHe4T1Ko3FsRxxdeF+DXABt2Tfx+UtmIVy5eWqR8QQJmUaKL+hVLrQZxh+RImiVPClxA5m8cpPM4A2WYVpOlmEiWyf30Q1k6CBwyIKoBMgZkAH8/lPNcr/jEys7hfyp1ynBAmZ58oBaDvsIeGFC4Nsc1ZvC19hSXitbjP81Ya9aIMbgx5E7pBBdeCCUrrUTIjSDQPvw03aupb8m7htyms+RJkTpQBxNWZpOk+cW2OxTKqG/PphK1z3N5XiO8sbSOiqp6hnctIp/VJcT7Vg3KEtgx2q3N3oYi47YCFq3LFlKnuq+BCpPvppPW1cnUe2Ro3LAr+qxcZZ5S9LlXoSz79JRU1WDUoKcoa1eT5nZaplxNzGJDbQnvplOFHApHsPYgvJHlQA5y/qYXjr3XgOdI1h7rJdU65NgAc3CuBSPQxVBIUwIdDpRvTl8CZTmPZAcT989vJUmZTifZfrWoc1SmND4ARkl6+/xb+vepu9gSK7NeXyK9KM0ZWciTf4gd4Q9SiX0s1uP0C9ui1KcxtizcLOOWtptdqxCliqKiTavHCpLq+cTxbp+5tJ46Ik7RCErkmmy4v4EGsimrVySSjWHI+V8KtXjMV7++2KpzC7d9HqlUoCcpb5ST6mZaqFxJ/HJ9bR6fx2tidDRsZwe5aKRYYIV7ONSCZAzYG30zJpOud/x2481U15NcJfjoZEJd8XjUEXQCBOGjvlDaV5cQzP94NB2+luC81mgr+wLkVKExg62LcovjQmTv0cr8b+O43LdRsZRujE5Uiu7W5tKk14aO3P001uO0Jeu3EiX3xPP5XkjcNusctqw1zC0bbhFvAEqSonWLxoqS2j2cNh7pXgquuMiaOmiNLoxQNvF3zajmF5+J4eK9h9T3v+Jgkzdl+7UyQzTrkPVw+THWTBsFvOSVELjTuKTG2j9wTpaFF5Hi/fU0cG0wOuOxzDjBeV72A+lkiBnwJ6sP89plV+w3PxJB6nWJcECsks8oJZjpAgaYUIgzerrs5nq2yw0Kyudvn5gE93gZJbp7D0bpRj96Oj2k/ugbPcuff3gJt/Yu5QQJduCT1mXQpM/zKFJLzjeyOFntx6VwnT+f7bSnx9IoRueZWmy5Z45FbQ3poW6e20+9Xt7iLKSidYsGC5LO9coF93exnDsCH06P115H/0VZM1eeTeHjm4+Ifdsqe63K1i7Olkufr75QAPpqnRKCXKGbp2esnLUUuMuElIaaPtRTZQgTCAkskm5cGSYYAR7mNCiXSVBzhCTb6Jz7zVq+x3j+0i1LgkGsDbE48HBMVIElTAhzYrhgao3iy9xQtdMPz2yk35+bIdaOEbgC7u1+Uo/jhwUpr8n7hO/X0+n7lxLv4reNew8HkNI0pQdCTTls0ya/Ga+lk0ax16VX91xjM6+KkRK0zeu20VXP56rPC4Yeeq9asop6Saz7W7Vvl6ihGNEa+1kCYQsFn8tw5WLbl+gNeYwffJphvK++hsPzC6k/RsTSB91xGX7lEbiL89p3fFueauGuhonLkyGGp02MNZDJKc2UPixWlpqI0tgyZ56OpbdrVw8MkwwgW6B9c2WYfIzHl7b1qV9wfKokWqM6jVJMIAOhhwco0VQCRMClUnezjLp2vupsa2fGtosVNdqodpWM1W3mKmqxSSpaOmjR3PiZcbon0n7ZZYIXJ8eQdemHaKrUw/KgbNoHX5F8j66Qhzzr6R9dNbudXTK9tV00aHNsvTub4n76YdHt9Gp27VmD3+IC6d/i/NieC0u64ZRwMwmK5MzDmsICYOIgamZCinC71BmlyZIiaSph49rpXZv5SkXkePhsrti6ZwBYQLfumE3Xf9McLcaR+Zixsc1VFVv94lvEn8Nj4lFtL0ogVWfEB3aqlxw+xI9cRH03kdCsv20EQRapb/zv0xqOHpUef9cTfWRSFmKh/0I87c1ksUF7cRLi9Vi4xaELEXE1A4RJVu2HjcqF5AME0ygFTpmTakEyBmQobr4hRYpTA8t6yTVeiUYQAtxLsXjGCuCTpgQ6JrnLmmC8OQ1dVFSYytF1hpoT1UDba2oofWllbS8uIwWFBbTO7l59FJGBj2Zmkx3J8bR1LhjdGX0Yfrj0f3068N76BcRYfSNfVvojLB1srPd53aspVN3rJEyNIxtqzS2DrBlpcZmKyvolE3LNUIHCFk2wHI6VfA58e/TxM/TBWduWkGfF+f70taVdO7W1fQVIVsXiuv/+q719O3dG+h7e0Loh/s30c8PbaFLj2yjyyN30O8id9Efju6mP+7bR38JOUJ/XRhLf38jhf71YhZdPTOXrp1eqFxMjoff35tA514delKYwI9uOkT/fdJ11+FP3DyzjD5c20D1epu2Pv391G/QER3YqZYlsGstkZszHa6i7shReuODLOX991UgSi+9nUPHtsaNa/DseFm1KkX7tvjBRjoaN/Fhtdi/lJ6lEBs3gMzS4ePDM0u2LN/fQNG53PyBCW4Kas0uaSeOfVD4guXMaQbamRSc5XhcisfhaASlMKFgCUPkVG8eRyg29tLh2iYKKaumeQVFNDszkx5MTqBJsVF0RXQE/TFyP11yOJx+dHAnfWvfVrpgzyY6e/dGOlNIhxQfZxHSopQlMBFh2jjAhqUa65cMsm4xnbJ2gDVgkcZqsFBjpcbnVi6i01YspjOWLaWzliyjLywWwrVwFZ27YA195dMNdOHHofSND7fQRR9sp/97fzf9+N399Is3j9BvXj9Of56TQlfNcjwD9beH0um8f28aIkznXBUqS/Wuezq4Mk3TZpfT1kNG6uy2+2qsoZZod4i2R0klS3JArXdbiDsLpGmWEBDV4+Br3PFCMW1fk0iNkUeU98VdQMzufr1QCtMfZzVSTcnE24kbatRy43LSGuhYXA2t2q8WJSvY07QnkQfYMsENhuXay894eG5dp/y8+OXzLZRZGZzd8dA4g4PDkQhKYUJgmwfSsKo30Fj8KfKAFJ9xyc9E8Elh+kxjBVhApywfYNn8QZYKlnyqsXiexiIrn9AX5y+jK2ZlKxef9mDP0pf/vXmIMElpujqU/nh/kvI8gQgyS5FJbcPbn9bXEK39TC1KYO18oqidygW3r9MTH0HT33Bdeac7eOXdbGqOPqy8/e6mNCKKfvtMlVwAPfDJxGUJFBYo5MbVCFlKiq+iFfvUkmRPSKSBYvN5JhMTvHT2TLwcD/u5v/tEs/y8uGdRB1Ub+km13glk0EKcg8PRCFphQvSZiYxOluZF1hmEvKwdLjOeIgCF6bTP5tPFr0cqF6D2XP9MCV343+3DhAl85T9b6O8PB1ZnNXumTC+l6R9VU2aR+GtnG729RDlp2kwllSgBZJz2hRAlHFAuuP2BsoNRNPPNXJ+b04Ths2HrEqkrNkJ5uz3BgS3xdOG9DXIBtGXfxNuJ9+j1lOHuYbVCluJO1NC6A2o5UrHiQCMdzeTmD0xwkl/rmmG1BzL66Nz7DPSFuww0b38PqdY7gUxLJ+9b4nAuglqYEPjgcHQ/k17wQHKCWmQ8SmAJ0ykLP6Fvv7+N/vu8Y/uQfnjTQaUwga8Kmfr7w4HRWc2eqc+X0YdrGoY1d+g39RGdiCRat1AtSlZ2rPK7Ujx70GGuYN8xemxOgfIx8jS3zSymJQvTqFSInMWLe8LMCYfovc8y6XO3NdFZd+iosWLi+5eaqvWU5s5htemNdELI0uaIkZs8qGBhYoIZY4drmj3M2dxFp9/RRN953EhRuSZSrXkCFaz5sJedg8OZCHphQqCGVfWmsidN104/PbRLITCeRogSfgaQMH1+wVL616xM5aLUnt/fl6SUJSvfnhROVz/u26Vb42Hlribq6rH7SqxTfPKHbSRaOU8tSVZClvh1ZsmWfkFj5FG6f7Z3G33c91Ihxe+IpT43zlRylK64CLr2xVKZXbphbpVSgJyh36inihKF5LgKIUvJJ6pp19FaWqyQotEIiWrikjwmKEF3PJUAOUutsZ+ufa9Nfl78aW4rNbSq1zyBSgfvW+IYR7AwicB+JtSyqt5YtqwuqaDzwkPs5MXLqKRJitMAVmkCPixMp3w2jy6fc1y5MLXnuqeL6LyrhzZ+sAdZKBynOr8/gXbaD75eSRHx4i+abWDzUl010c4NakGyZf1nRMfClAttfyZnbzQ9Niff4+V5014ooo8+yZAzlVS3yxs0CIH8yj2NcgG0+1ClUoKcAeV4+fkK0XEFaUKWEmpo3zHnMksAs5j2p3QoF5MME+iUNbqm2UNCsfnk/qW3dnaTar0TqGDvFgfHeIKFaSBQyzpaE4j6NgtNT0+lz+304v4lR5Ad9RT/t4oVZAoShYyTTwnTJ/SNDzcpF6gqfjBKWR44+8oQ+ukth/1emmZ9WkMZhV1Dh9FazET5WURCiJWCZMvqT4kObA6Y7JIt5oSDlLjjuMz0qB47d/Dc63kUufkE9fpAVsmWtWuS5eLn6/c3UmdDo1KCnKGt3k3txJFZSqyhvVE1SiEai3VH9JxdYoKSpGIT6VsnXo4HVhztodNub6Iz7miitPLg6Y7H85Y4JhIsTDaBNWlzp/qNVmjopn8cOzRUTvwZKVCCTSt8RphOX7CQbnBwQCk64qlEyZazrwqhX94eRTc8U6K8DF9n3sZGMraahnbC6+0hij1CtGbBcDlSIectBZ4sWcG+oazwaLp1pntbyiPTt/CzNGo6dsSre5VG4oqZ5VKYbnmrhvoVAuQsdRUK2Zko6TpKSaimQ9E1tGyvWohGA9mlqGzeu8QEJ1mVZlkJoxIgZ5n6Ubv8vPjba62kb1OveQINnrfEMdFgYbIL2TlPIU3xDS305fBQtXz4OyjdQ6bJy8J0ymcf0x/nJCoXrPZc9ViObPCgEiVbzvv3ZvrdPfF0w7P+I013vlxB2yKMZDLbmpKIthaiI3tGnq9kC47ZuiKgZcmWpF3H6e4X3ZNNfHROgcwqoeGE6rq9TX3kUdnsASzdWacUIGfJyxNyo5Ke8ZLeKGUp+ng1LXewfbgtmL+0I65FuZBkmGCguN4imzXYy4+zNHf203n3GeTA2oWHgqc7Hs9b4phosDApAt1T7NuNLy0uU8tGoABpss0yeUmYvvtBmHLRag+G1P7klsNKSbLngmu20Z8fSFVejq/xxLtVFJPaTn0m2xI8C1FlKdHuULUcDUPI0hYhS3F7lQvsQARDWw+HnqC7ZrlOmm5+voQ+mpdBRfuP+awsgZWrUuS3xd9+qIHikiY+f6lbp6dUV3bHQ2YpsYaihCyNNZh2JNYd1lN0To9yIckwgU5ikYkaXVSOtzKyR35eXPiQMWiG1bZ3E9l9/cjB4XSwMI0Q+GCxbTd+V2KcWjQCiU0rvS5M58xbpVy8qvjT/cnKIbYqMKPpbw/57owmlHy9ubyeahr7hpbgmcQLMTOZKGSpQoxGYOMioujdysV1IINudUc2nRCP5cSzidgXdSgknjq9OFfJEVAeeNOcYrkA+tfLDVRbOnFhqilXSM+40WQpJraa1joxa8mWpfvq6WBap3IhyTDBQHKJSWZI7OVnPPxpTqv8vLju/TaqbAr8YbVo8mC7BZiDY7zBwjRKINMEacL8pe8f2KGWjEAC+5qspXleEqYz5y2kq2fmKhex9iDL9M0bwpSCpOLCa3fQFY9mKy/Lm9w0o4zmh+iorcM88MpDiE947Fc6ftixEjwraPJwbJdycR0sHBbSdMuM8UnTVCFbGEKLrJLqsn2N0kNR9KsnqunU25roqYWNsh24SoIcBfufMrNdVY6nyVJ8XBWFRqhlaCzQcjws1qBcRDJMsFBS75p24rnVFvr8nQZZvvvm9m7SBfj+pWaxfjPZ/lnl4JhAsDCNEvimv6uPKEPfoRaMQARd9FCa5yVhOm3+fPrt3DjlYlbF7+9NVMrRSHxn8h66+nHHhMwTPPRGJe2KbKaeXpvWPWbxCV9VRhQWopaikVi7gOjIduXCOphApmnX2kS64wXnGkFgD9SqJSnUGiMkVXG5vkhYSAJdcE8DnTVNT1sP1AwTIGdBdzyXlOOhDC+phhJPVNGWw863DwdLsG/psLiMFJ1yEckwwUBCkYlaOl1Tjvfpfq073jcfNdKu5D5SSUagYBBgzxcHh6uChWmMgDStKw/w/Uu2oAU5ZjV5SZg+t2Ae/fyNg8oFrYrrny6mi24IV8qRirMF35m0h659yrtDT8GMj7WW4bYleP3Yr5R6gihkmVqKRkK2D9+kXFQHIxjkun2NYw1EwCOvFFDctljq8bF24aOBfVuvf5olvy3+8r1NVF9er5QgZ6gpU8iP0wzK0qaI8ckSMkvbImooIa5SzmyKz+f9S0xwgu54KvlxlpZOolvmad3xfvtSKxXUBfb+JXzZzcHhymBhciBezElVy0WggnbjG5Z4RZhOWfAx/eDt3cpF7Uj885FMOueqEKUgjcR3p+yla700own7lTBfydBiVyuALniODKJVEbKEKHaPcmEdzOxYmygfb9XzAHDaS2/nUFuMb+9VUmGMOUz/fbFULoBumFulFCBnMBv0VFyoZZgcRgjSMIQsJZ+opB1HamV3O5UQjcWWQzWUJC4jBcRXUUJ2m3IxyTCBTlWTa4bVZlSY6eIZLfLz4uHlnaSSjEChvWfgbyoHhwuDhcmB+G/cYbVYBDJbVmqleV4Qpm+/t5Wum+64zGA47Q9vOqQUo5GAYP30liMezzTdM6eC1u8xUE+fTVqpt5eoIIto80q1DDlCyGKi4yxM9pgTDtGWVUl0h2JO092zimjD8mSfb+wwEsWHouir9zbIBdD2/RMXJnssRk2iTE066hP06nXUI+jWAT11NeqpU9AhaG9AOV8jtVbUUHNxBaVnVFPY8VraGSOIrqUdgu3RdZJtx2ppK4iqpS2CzZEamyLF6eL/x+OrqSKrgioF+FmeWUklRQYqqDGfJF+QV62RC6rMlDNANqjUwLfzWWKhmDkAFo0Z5RrpoMxMaWUmSSooNVGKlRJtsz1IAsUaiaBIK5UCqkUuw7gCvPaMHa4px9sa30tn32OQnxc7k0ykEo1AQDZ54OG0HG4IFqYxotNsop9F7FRLRaAjB9uiPG+JR4Xpgv+td7jxg5W/PJBKX/nPVqUcjcS5V2+in98W6bEZTY++XUXH09qp11aW9A1Eh3cTrftMLUKOgpK8w9uUC+tgB0K0fU3SkEwTZivF74ilnjj/KcGzZ81AO/EL7m2k9rpGpfR4lMYa6q+poJKCWjqaXEuHk5wjNrWG6osqyVJVTlQ9FEtjPfX1DpYmoSFPd58GuoeBTtBD1DEAWgm3d/dL2kBXv1hMaWBPCMBMmmaxIMWiFBjaB2lq09APoGsdpLFFowE091O9DXXGfqoV1Bj6qbqpn6oElfp+qgC6firXWais0UKlDRYqEWC+ThGos1ChoKDWQvmCPCGFUgYFVhGEAGYKIH5S+ARpQvpSBSmlGsklZiF4ZiF2giKzkDqzcjHO+D547vFathWf8YD3x7NrO+XnBfYvVYvXpko2/B3M0DSxLHG4KViYxoii9la6aP9WtVAEC9jXtHkg4ySlyb3CdPa8FfSvFzOGyMZY3PBMidNZJnD2VSFSmlSX6UpmzUMJnmlwv1K/hfoLc4g2OtEufCxQlhe/X7m4DnYsCYfoyOZ42QVv7nvZZIw+TP2K4/yJawbK8W550/XZJadpqKb+6gqqLW2iY2k6pRCNRlpmNXVXVAwTpZPUVlJfV49yMegvQPKGIYTPGayS6DBioWwFi2arSOJb+BYBuohpMwcHpRAiWC+oE/JnFT8pfYIKIXsQvlIhfCdlD5InyK+B5FnkIj9bYC93UuwGpC4JMlfMGbqxwGOtei05C57zX8xolp8XT60JzHI8dDQ2syxxuDFYmMaIOIOOvr53s1okghG0Ht+0QtvjhGyTG4Tp858upr+/5Pyg2asez6Uv/3uLUoxG45yrQumSaTGyTbnqcifCnbPLaXVYE3X1aJ/kaOrQL15TFHWAaOU8tfhMhC3LeS/TKJQfiqJmIUuq0/wJXdQROvMOvWz4sGZ37XCB8RRG8VpGZknIUn2ZntLzOyg6Xa+UInuQhUrKqKHawkpxfoUk2WFubVUuBhn/xyqDMlNokyFEZtCaEUQ2UGYBBUMET4BMn8zuWSVvWIbPclL2hmX3hOzJ7F7tQHZvoNzTmtmT2T0hfkPKPMFAmefJck8hhUPKPYEs+RwEwmiVRolN2aeq9BP3U/V4OUuSuK5ThSydMc1AsYVmUgmHPwNZwhcQHBzuDBamMSK8vpq+sidULQ/BDMQJWae1A9LkQmE6fcEC+stLSUoBGYvL7z4hs0YqMRoNDMC97M7jysscL4+/U0Uxqe3UPdAy3NLTQ5aMZCE1q9Wy4yq2riCKCVcutJnAYNVAOd63H2ygtAxvleMJWWqoIXNNFVWWGigtv5NS8zopNsOgFCQrUUKU0jOrhShVjZ5VssPSWKdcDDKMO7FmAq0Zu5HLPyF4gi5k8EYo+xwo97SWfNqXe0L+bEs9cZ2q2+QsDy/rkJ8Xv57VIqRSLR3+DJ6PIQPfOTjcECxMY8SaimI6e/cGtTQw2j4nlOm5UJhOXTCP/jQ7QSkhY4HOdxdNcrzNuC3nXh1Kl7hAmrBX5p0V9aRv7jv5Id6pE3+ldodqe41UkuNKMOg2FF3z9ioX24z/c91LWjnef+bWUUN5g0Jm3I2QpfpqMlVXUWlxsxQlK3GZRqUoRafUUHFuFbWXVZBJsU/JEfrE6s9+McgwzMig/PKce43y8+L59Z1CzNTS4a9AVNmVODwRLExjxEdFOXTmrnVqWWA0UKLnQmECl8+JUcqII/zhvkQ67+pNSikaC2SnLp12fNzledNml9Pa8Cbq6NKySj1tndSVkkz9axao5cadoJFE1E6ihAPKRTfjn5RGRNEPHq6V5XgvLG8kM0o8lVLjJoyNRHVV1FtVRWUlQ2UJJGW3UFxaDcUL0rOqqaKgilqFJPWPU5JsMTU3KxeFDMOo2ZnYJ2XpnHsMtCmul1TS4a+0sixxeDBYmMaIublp9Lmda9WiwGhsXUWnrEKWyXXCdPHrR5VC4gjXPFlA35uyVylEjoDyPOxpcqZ73hQ5W6mWTmR2kNncT13dZjLmlVBbmBCWVW7Yq+Qoa4WoHdhMFM/SFChs3ZBIX767kc69W0fbD3l4/5JByFJ9FXVW1VBRccswWQLZ+a3UXVGu7HY3USz1NbLLpGphyDDMUFDSZy3Hu+SFFkosCZz9S8iccZMHDk8GC9MogW8uZmQlqyWBGUSW5S12qTD97K0IpZg4yp8fSFbKkKOg5fhPbjlC1z8ztjRNmV5KC0J1VK8Xf51ElFR30cI1KdSyf5d3ZckKygD3bFAuvhn/whR/iGZ9lCOzSxc9oqfa0nq12LgDQ4PsVtdeWUt5ha1KWQIZ+R1K2XEJNRXU19WtXBwyDDMUNLj43WxtWO3Nn7RTfYtaPvyNZm4fzuGFYGEaJfosFnoyI0EtCcwgbhCmH72zXyknzvDN68OUMuQMaFWOjJXq8rFX6e5XKuhAbIvMKrW0myj0YAP99Lb98ry/v2sT5W7aQqa1C9Ui42nC1nGmyc9piDpKV88qkwugKW94MLvUJGRJyAoySzmF7UpRssVS5XgzB2cxc1kewzjE3tQ++vrDRjrt9iaav7+HVPLhb6AjXp+4bxwcng4WplGiy2ymB1Nj1ZLADIKSPLQYd6Ew/d8H4UpJcYa/P5RO54yjY54t2NP0f1P30T8fyRxy2TfOKKN3V9VTYUW33K90IM5I0+am0vl2w3N/flMoLf9gM3WErNCaMahExlMg27U3hKXJj8naF01fu69eCtPmvR6av6Sro/7aSmquqKesgrFlCfRUitumkB1XYNE1Um+va+bTMEyggm5+b+/slrL0pbsNlF5hIZWA+BOYGcbtwzm8FSxMo0SbqY/uTI5RSwIzyBbXN3246H87hwjKeMAw2+9N2TdEYMbLV/+7XbYsx2Xe8VI57Y1pIUOrSS4OZ35SQRffGSHL+FTn/eZ1IXTX05uofrOQlTXz1TLjKbCnKXKncjHO+D4rVqbIeSrn3KWj1joPdMdrqKH+mgpqKm+kTAdlCXRU1ChlxxX019VQn1gNqhaJDMNoYIbTf95pk1+uXPFWG+nbhguIP4HMEvZkcXB4K1iYRomWvj66PemYWhKYQTYsdbkwffujHUoJcpY/3p804SyTlbMFP745gjbs05Gx1UwLQhvpyscz6CsODsv96U2hFLViC5nXeblEL2Sxf3fOSzpElBxBlBFNVJhGVJlPVC8W0/paIqOQCHRxw34bnVi015QQFWcQpR8T5xPnUV3eSOB6MmPFZRSLy6sXf7XriEqziVKOqI/3ADe+UiwXQDe+7ubsEgbSClmCoDRXNlCaQopGo7lcPFZ2ouNKTO0dykUiwzAaGNKLznj4vFgb7f/d8Tp6BxZmHBxeChamUaKlr5duS2RhGhWU461c6HJh+uZH25UC5CxXPJpNX7t2h1Jgxsvl90TSrS8Wyk566KinOmYkvjcplD54ayvVrllJtMYDM5lGYsdqovj9ykW5TwJByjwuBCmVqKpQyBDkSIiRw6BhQSlRfpJjwpMaSVSRp7gcQbUQKC9J08VPVskF0AfrKtWi4wpkJ7xqMldXUmO57uRAWmfQl4nHWyE6rsLSpFcuEhmG0cCeJXxWXPiQkWqMagnxFzAcmIPD28HCNEpAmG5lYRqd9UuEMEGWXC1M25QC5Cz/faqQvjt5/C3GVWBfExpKnHN1qPL0sTjv6hD670ObKGrxRrKs91K2Cfup9oX4fqYJWZ6cE5okNVarBcYKskDIMiGzhJ/IMtkf0ySOwWWlCSFSXR9AJgqyZD0/Mkvl4v+QNUgX5AuZLdV53czFT1a7V5jQ3KG2UspSbVmT05klK3UlOqXouIr+2iqxKOT24gwzEpe/pHXHu+3TdlJJiL8AWbIOgOfg8GawMI0SzUKYbkmMUosCQ6dswfylhe4Rpo+3KgXIeUroRzcdUoqLt/nGtSG0/JPtRJuWqqXG3WA/EwbbKhbmPgGyONVFQ4XHljohLyi3y4rTjoVcJdqA/6MUr0QcA4myPS+EaiRpyhaCdvJYIRAQNutp6VFa+V+jEBbb83iImwZK8ibPdYMwQSZrKqhfCElVqVEpQo5SWdw0THJcjamjU7lQZJhgJ7vKIj8nsN9x5VH/LcfDrCULyxKHjwQL0ygBYeIM0yhsXKbJkhuE6Vsfu6YkD/z0liNKYfEVbn96C2WsWEemNUJgVGLjTkKXEMXuVS7OvQZEJzdBSEnVUHHB/6sKiPIShSAdVp93JJA1QjlenVhsWzNHdWVa6d2QY8V111dopyNjlSuuy/70shzt9gz5vWdYtyaZzrhdLzkSU0v9RoX4OAv2K+mw56iCequqqHyCsgRKi4zDBMfVWHQNysUiwwQ7r2/rlsL0g6ebKTrPP4fVtmAwLcsShw8FC9MoIbvkJXGXPCXbV9Mp6wbK8dwgTK7okmfll7dH0dlXuqbxgztAM4nLbgulRW+HkmnzcrXYuJMt4jpP7FMu0L1CfvLQjBD+XZxJlBEzkEVSnMdRkFWqyNekCRSnD71MZKSs14vslu15rSCrhdukOs3NVB2JpD89VyEXQz95ooHCjtRRr14Ij0qEHMGmuUN3VTWVFDcrBchZCgtbZKbKXnJcSo0QPLE6tF8sMkwwY2zvp7++2io/I659v41KG/tJJSS+DDJLZh5My+FjwcI0SnSaTXQ/z2FSg2G1a90nTN/9YLdSfsbDJdOOy31HKlnxJc7/Twj9+4FNVLd5I9FqDzeEQBOIBB9oApETr2V2rNLSUCkkJnriomQLslMNA1kkZJlsGzgge2W9buxZsj0fwO3A/qby3OGneYD+hIO0Y2MinX9Pg9Ze/G49XT+3mpZuLqft+ysp7GAl7TtcQQePVtGRY5V07HgVxcZVU3x8NSUnVVN6Sg1lp9dQflYNFefUUFlKMVWlFFB1RjEdTWymgwltdCS5naLTOigus5OSctRCNBb5QpjMbhxea8XU1q5cNDJMsBKTb6KLHjfS6Xc00Subu0ivEBJfprmTZYnDN4OFaZTosZjp0bQTamEIdtwsTD94f69SfsbDZXf6hzBZwbDbzR+HUseaRZ4bdouhtnuEqHmzCQSyP9YyPGR/0I1urFbgqUeF5CQRlWVrElOSKS4nSn2sLdlx2vVg347t8ZAkqzBB3qy/R5c+lO+hRA9txoeV8nmWzeuT6CeP1tCZd+jlN8nuBnL2udv0dJrg9Nv1dKbgLHHdnxd8cZqevnSnjs65U0/n3qWj8+7W0dfubaBfPlxOv360lH77WCn98YkS+suTxfT3p4vpX88U09XPFtE10wvpuucLadLMQrpxVgHd/GIB3T67gO58OZ/unVNAD7yaTw+/lk+PvZlHT76dT8++m0/Pv5dHL3yQTy/9L59e+TiP5iyrpjlbuuj1bV301vZuendXN32wu5s+3ttDn+7voc8O9tDiiB5afqSHVkX20NpjPbQhppdC43ppa3wv7Ujso7DkPtqb1kcHM010ONtEkbkmis7TwOLzuCC2wERxghOFJoov0kgoNlFiiZmSBMmlZkoRpJaZKQ2Umym9wkwZgsxKM2UJsqvMlFNtptxqC+XVWCi/1kIFgsI6CxUJiusFDRYqEZQ2WqhMgNbQFYJKvYWqmixULagx9FOtsZ/qBPXN/dQAWvpJ16qhb0NGoZ8MAmNHv1iA9lOLWITiW/s2QXu3tpG+s1cbborZNj0C1eKb8S/w3M7e1EVnCFn68v0GOpBhIpWU+CpG8TrtMw8swDg4fCxYmEYJU38/PZ2RqBaGYAcledYOeW4Qph+9u18pP+Phsrti/UqYABpCPPb8Zkpfuob60ZxBJTmuBlmtvSHKBbrbQeYGpW7W/UW1ZWOLD2QKrcZRRieFRshTQbLWyW6stt/Jh7XrwfXZXg/ObxUmZJvwO9w2lANiD1RRmvZv6/FeJP/AMXr/swya/HIJXfZkFf30sRr68aO19MNHaun7D9fS9x6qo4seqKNvPVBP37i/ni4UEnPBPQ30lTvr6bxp9XTOHfV01u06IUKaDEGKVLIUrOBxOe32Jrn4POtOA33hLgN96W4DnX2Pgc69zyAXpOc/YKSvPmiUrZu//oiRvvmokb79mJG+87iRvvdkM33/qWa5j+RHzzTTT55tpp8910y/eL6FfjWjhS55oYUum9VCv36xRXY0+93LrfSHV1rpT3Na6S9zW+lvr7bSP15vpX+90UpXvNlGV7/VJgeRXvNuG137Xhtd/0EbTfqwnab8r51u/Kidbv6knW6d1063f9pOdyxopzs/a6d7FrbTfYvb6YElHfTQ0g56ZFkHPbaigx5f2UFPre6gZ9Z00nNrO+n59Z00Y0MnvSB4MaSTZod2yuzEXCGjr23toje2CyHd0SWEtIveD+umD8O76aM93fTJ3m4ppgsO9NDCQz20RMjpssM9tEIKai+tieqlddG9tOF4L4XE9tKmAVHdntBHOwdkNTy1j/YJYT2Q3keHIK1ZQlpzTHRMiCuEFbIKUU0oFmIq5BRSChmFiOYICYV8QjyLhHBCNiGZEMxqIZaQSimTAxJpFPIIcYQwQhYDSRQhwIvEc4DXIF6/eF3UNavFxBdBZollicOXg4VplMB+w1nZKWphYOiUjcvdJkw/fytCKT/j4dd+KEwAe5t+dXMobfgolEzrF6klx9Ug0xS+gShBvUh3G5AdDJmFqKCNN+REddxYQG4gWxAf1elWrJkklPzhuq2/t2aeAATO+nvIGaTMlaWBLsAUf4iM0Yep9uhRqj4SKfc4VYLDkVQhKAcRUVQmKD14lEpXbqSSBcupeP5yOjA/nP79VBld+WQ5XWHHPwX/eKKC/v54Of3t8Qr6y+OVkj8N8MfHq+gPj1XS7x6tklwu+M0jVfTrR6rpsoer6S+PldKrL0XRZ6/uo/lz99PHcw7SB68condfjqA3Zx8Rpx2lV16MpBdfPEYzZ0XTczNj6OmZx+mJGXH0yPQT9MD0eLr3uUS689kkuu2ZZLr5qVSa+mQa3fBkOl37RCb9+/EsuvLxbPrHY3n0x5kN9FshHJCPi2e2SCH5iRCTHwpJ+T8hLRc93iwWkc30tYeb6QIhN1++zyikxygF6MxpBvrc7dpwT0bjVCnQAiGLEEaA8i6I4xnTmsRjBgxSIj8PxOOIxxJ8UQglpNIqlhices69QjCBkMzzBkQTfEUKpyadeF4gnl8V4gn5/Bp4WEio4BtCRME3B4T0WwNSClB6BjkF331CSCp40iied6OUVauw/nAAiOuPgZBXCOxPxevkZ8+10C8HBPY3Ql4hrn8U4voXIax/F8J6xZut9O+32+i/QlSvf79NiEgb3fSxJqcQ07sXddB9QkgfFEL66PIOemJVJz0tRHT6uk6auaGLXgrtojlCPl/b1k1vbu+mdwayoBDOefu66TMhmxBNZEFXR/VIwYRcbj7RS9uEWO5K6qM9Qir3p5ukUB7NRvbTTHGFZimRJ4pM8jz/FjKNxxrP4Y/Efcur9Z+9SyxLHP4QLExjxNsFmXT6znVqYQh2xmorDlGy4qQwXfJapFJ+xsNv7orzS2Gycs5VG+nxF7ZS9dpVZF7lgb1NsjxPSJMnB9tin5K10QPmLdlKjLMgM4RueFmx2uUgmwSQdZJtxjO1zJKq6QP2N9lmuXxMkMYF5Ddmt9YRUTy/phWfUupi18w5G4l7ZuRR6jzxGrJ/bbmBrhNx1NRmUS7EnKGxTTzlzURVBqJyXT+VNPRTQX0/5dZYKKvSQmnlFll2l1BiplixWI3JN1Nkrpkissx0INNM+9JMtDvFRDsSTbQtvo82neijjbF9cjG7KqqXlh/tpaWHe2jhQa1cENkZZGreC+umt3Z20+tiMT13azfN3tRNL4Z00Qyx2H5uXRc9vbqTHl/ZSY8s76QHl4nF+eIOumthB90xX1u03ygW75P/1y4X81jUXy0Wzle8pWWnsPkfGavfzW6l37zUSpcKKUB2C5IAaYBAAMglhAJyYRUNyCZApgwyAqxyAlGxSsu3BBAZYJUbiA6A9ECAAIQIYgQgSQDSBCBQkCkAucLCH0C6AAQMMgascgZZg7QBCBxEDlIHuQNW2YP8QQKDIYOK+/+bl1rka1P1GvdFjB0kM2QcHL4eLExjxGclefT5sPVqYWDolPVL3SJMv3slVrkQGw+X331CSIf/CpOVy28PpfXvb6C2tdrC162s+kRrBBETrl6EuxqU1llFBW29Vcc4CjJBpVmaeEGcqoo0UKqH+Uu4Dp04DeKkKt3DYFscA8ab6fIlIrYSbdQylL1Clg7MC6e7ZhYo3yuu4o7nCyj2o83DX1duoG/XZjI09w1biDFjoxeS2NAq3iZCFGuM/UIW+6miqf+kMBYJYSyo65dlbznVFsoU4phRYaFUIY/JZRa5fyu+WMt2HC8wU7RYqEcJiTyao+0HQ0YE+2ggk+GpJgoTQomMCfaObRVSuVlIZWicEMvjfbQ+ppfWCrlcLeRyZaQQzCMQzF5aFNErJXP+gR6aJ0Wzh/63p4c+2N0jZRMZm7d2dMuyQZQPoowQ5YSzQ7tolhDPmRuFfK7vFPLZKUsQkf15cpUmoShPfGR5Bz0kRPSBpZqM3rOog+4WQoqSRkgpBr9CTFHyiNJHlLpN/lAI6gftdB0k9b02+g9E9e02uuotIatvttE/X2+T2SkI65/natKKcktkr5ANRSYLGdFLZmoCi6zoz6a3yIwXRBYCC3nVZBVZUk1MvyGkFCIKAYV4fuUBIZwCHPP311rlfcZ+OtVz7YtgzxLLEoe/BAvTGLGusoTO3r1RLQsMnbJtFZ2yepFLhelU8e8/zk5QLsTGw+/uTRDCFKqUEH/jm9eF0G2PhVJ96DotE6RYQLoULLSx4HZ3MwgIk1VSIDmqY5wB0oS9RoVpRJUFmiwBtBRHuV7GKJ33cD5rpz4IFjJVquN8HTxnYeuJ1syXz2X/yk9o28eHaNoM98oSuPm5Ior4cPvw15Mb6F/1KTXXGoctxhhmJCCKOkGjkMWGFqJ6AaQRGUbxUhLySHIPVJWQx0pBhV5IpKBMiGRZY79s1Q2hLB6QykIpllojDwDBRGYSkpktyKoakM0B4UwXIGOZKqQzRZBcKuRTgCYiAKV2ENETRZqMxgoZhZAicwRQkndMEJVrkuAYXB/uj+r++iLc4IHD34KFaYwIq6uir4SHqGWB0di8gk5ZudBlwnTagvn059lJyoXYePjDfYkBI0xWvn7tRtoyL5S6Vy9ULiJdykoBZjVF7tTmNblDniAp2LsESUGnPJTQqY7zBBAp63Ba3B7srRqriYSvEbuHaNvKk89h78oFtOrDKOX7wx1MFux+L2zo68iNdMafUC7KGIbxPbgMj8Mfg4VpjIhpaqCv7d2kFgVGw9oxz0XCdOb8RfTXl1KUC7Hx8NcH0+jcqwNLmMCF14TQk89votSFK6l/jYc66W1YRLRrLdGhLUTHdrlu4C061aEBg8uyOkJ6Uo5qmaSs49rlIYuF63FkXxKOw4wm3B6InLVjnq+D/UqRO4g2LT35nLUuX0xL3z1GN00vVr4/3EXIO/vJvNwzbfHNm1ZRU6v/lCIxTLACWephWeLww2BhGiMK2lvpov1b1aLADGJtAOECYfrivGX0jxfTlYuw8XDVYzlCmDYppSMQuOTWUPr09Q3UsW6xcjHpFlAOuP4zolCxMIdAoWzvxF71It4R0GzBuncIe5mwB2lcDRfEeXJOaMNlITyQMOxXAshc1WNPk7iefCFAY12+7RBb7IEa1+3xIPEHiPaFEtm0oe9bvZDeeyOebvawLIFlbxym3uWeG8DcUl6rXKAxDOMbQJa4DI/DX4OFaYww9vXSDw5uV0sCM5SNS10iTOd9vJqueCFLuQgbD9c9XUzn/XuzUjYCicmPbibj5rXUr1hMegQM2UVmA9mn8WSesN/I2vhBZpmOq48bCWSFsE/JKjljgWPHGkAL0bIej8G6qmN8Ablfad2QQcddqxfTE7Ozle8JT/Dxa8eoS3wODHmNuJGu4zHKRRrDMN5HluGxLHH4cbAwjRGYxXTZ0XC1IDBD2bZa28s0QWH66ocb6N8zcpWLsPHyrRvClJIRaHznhhBa9V4INSxfMmTx7HEwBHfLCqIDm4iOhTnWohzygoYPVkFBm3F0qRtLarDfKS9hsKTPGbA/abQW5vk2g2zLc9XHeBOIEkojscfM5vGvXraaXp6brHwveIo35pyg9qUeKhUV9O0MJYOhe9hCjWEY78J7ljgCIViYHIgb4yPVgsAMZ8NAlmkCwvStd7fQtdOLlIuw8fLru+KUghGIXHBNCE19KIROLFpLtNZz3/CPCEr30IDgyPaxG0Zgr5G19TdAxgmZoNJsrUQuM0abpYS5TdkniIrSiaqLxF/lgYYRVvB/lN5hzhKkJ0+IV9FAxzy93bEo/1PdFgAZs94eXCa676mO8wZ4LA9uJtowtPFHzcq1NOMV15W0jpdZs5OpZYkHmpIMYAlZTi2l1cMWawzDeA8eSssRKMHC5EC8nJuqlgNmOJtXTliYfvBWmHIBNhGue6qIvhwEZXlWzhZ89T8bafbLm6hHSKxqgelxMNtp87KxZzuhOYN1iK0tkCe0+24S4KdkoITPFsxxGqltOH6XFaddhvV4XMaIXfDE8dXFg8fitimP8wK71w9rLV+wNIRufd61XzaMlydmZZJhiTb/ySOsnEcdqalikdY/bNHGMIzn4T1LHIEULEwOxKbqcrUcMMPBXCbMZBqnMJ26YB797I2DygXYRLn4juiAGGDrDOdctZGufXATHft0NfWt9lx51KigKcHhbaNnmyA8yBCpxEmJkB4MqnW0WQT2S9mevyBFfRxAKZ71OF/olheze1gJnmXFJ5S4YAs98mKO8rXvDe6ZkUe6xR5sRCLoObiXDMZe5eKNYRjPwXuWOAItWJgciLy2FrUcMMOZoDCdNv9T+vXcY8oF2ET5z5P59L0p++jsK4NLmsD3JofSSy9soNJlyzwz8HYsVovbgP1No0lTUgRRdhxRcYZWdocud9aBsgCZIUhSTbF2DLI/jnayQ6mdbXYKpXqq45BhwmnW43ITFMd4kMNbiTYOlRAMpD08L4weetG1+/4myk3PFVP9Is9mN80hy8XT1DZs8cYwjOdo4TI8jgAMFiYHwtTfT58P26AWBGYoWydWknfGpwvory+5b7P6v5/Io4sm71FKRaBz7lUb6Te3hdDRhRt8Q5qwvwqZJpUY2AIJguCgOQMaQKAbXtox7d/4HU5zVJRssW0SgXbjqmNwuTjNetyE50ONEzTN2L1Oa6Zh8xj2i+dx60cHfaYMz57iBauG3F738wm15RYqF3EMw7ifli6xZrIMLJ44OAIoWJgcjN9wpzzH2LxiQsJ01rxFdM3zBcrFl6uY/FwpXX7PCdk57/xrttJX/rOFzgfXjM0FVv47Ml8dxtZBrh3kQke4bit9zQm+bs/1w/nmDdvojTd2UsPaVWTxtjitX0gUHaaWBHdTOzCYFkCeVMdAyqyZKPwcraOeLWhOgdlN1mYUyIwhQ4Yyw8JUrXGFow0ksOcLTTPsuh5iWHHihiM0+5NKmvFRjcbHg8xU8IItnwxnlgLr8faXZXtdSsTtydp4kEw7Qsm0M5TMQwgZzg57No7ABjJvH2CblfUaW9dRV2wMNbX1M25HvLzdjf2CfLTTGK/DssQRyMHC5GA8nBanFgRmKOuWTEiYLlq2hj7d0EjzNzbSghCNz0IbaeEm3UkWCRZv1tGSLRpLtwI9LQPb9LRcsGK7YIeeVgpWgZ0aqwVrdgnCmsRpDTQvpIw+3lAiKKWPN5bSJzbMAyFD+TRUY74tmzQWWNlcSp/ZsHBL2UkWWdmqsRhs01hix1KwHZRr7CinZbbsLKflNqwAu4ay0kqYxqoBVu8up8jIYmo7foz6MXzWZiHucTYs0lqPq2TBndi2MB8pw4QBuNZjcLzqGHtQSoh25RAszHGyLSO0gs57uGyIleoyAMoVI7YRhSwZ9pj1C9HsSEklo76bDIY+ZkxM46ZJ8bvRGM/xzpxHHmscBSePbxpAdZoV6zHyuGZbzBpGszhtKCdPs6HJjtFOtz9tIqfb/t4WQ4tGkxXb04adbhmCwe7/9uD0kY4Z7TRbDK3OYWxzln5JM2gfHy1WOvqpq6ef+vocx2RSYzZjoAsHh28FC5ODsaqiWC0IzCCYw4T9SxMQpuvCwqmhsVfSCHSD6KzoNfT6vkGaNJpsUS6cGFuM+i5qragj04Ed2r4iu4W5xwgVUjBW9zxXYzuUFpkf+9MzhMzYyg5mQtkfowKZI+veqvQorYEF2prjOmz3TQFktlQDelGCF75+WAke6N+4lNryisjQ1Kt8ThmGCU6MRt+iuRmYnKalxcTSxOFzwcLkYGS0GOn0nevUosBorB+YwTQBYXrxeLzyDwHjXoy6TupOThCLcS8OvEXZWdy+4fLgDiA1tuKCphH2p1cLwbGeDrlC5sj2mJHAcZgdhQyS/WlpkdrvbedG4bJTDg8eE7eXaDtK8IY/RpaQZdSeV6h8DhmGYZxFJTreBtKETBMHhy8FC5ODUdnZQT84uF0tCgydsmUlnbJqILs0AWHalV8mPsR7qcmBb8/xwYpvolpbTdTWZqL2djN1dJipsxNYRsB6+nBw3vGA61XdPr+jqY/aSquo98g+WfJlv1h3OxC1nWs8I015CYPCAuznKyEjdHL/UYM2ABcd82yPsQcNIqxUFRCVZKqPw+XkxA/NcGEwb/xACR5KFBWPj2n7OmovKFE/d4xLsV/AuRPtW/jRUH8L7yj4jPQU+Cx2Bfg8V2N2GHwuuwPV3wBnUP3tGY7qb5dGV5fzdHePTE/P+OntHYv+YahK8+zh7BKHLwYLk4Oh7+2h/8RGqGUh2Nm+Wtu7tGJAlsYpTJ9fMp+qGzulLDkK5Mq66Ghp0WhtFQt/8ce1vV2jo8Mk/tCYxR8Os/gDAdQf9tYPa2sdtfXf+PC2WKw/ifr7+wX4SfJ0XKfqtvkrxoZ26sjKJss2IS+KhbtbgTTJTNNehWi4CiEsyABZZQVlcbZd9jDEFsNvrafj32jSMOQyFOAYSFJlPlFd2dhDbouEhNleB0rw1sxXPy77tpKlqfHka9RZVAsXV6K6Tn/G+hngi+BzyJfBZ6X7IIewfj57Gg4OjsANFiYHo0d8Ck/PSlILQ7CzaYWQpc8mLEy/DN2gXMAzngci2tPRQ3T8gFjEe2HgLUrSTrgp04RZSrZ7k+yH1pblDJ4GitKGnj4WEC5bARsJ7ImS19EgREtIlupxAHs2E7W1DHwScXBwcHBwcHg6WJiciBXlRfQFnsc0FAyqXb3IJcL08OGjysU741mQsUMGTobFTFRRJDMcqgYE7uMTIU2rXN8IAm3Ba0sGZQiZJgiO9XQMyoXA2J6OOU+2l2EL9ithX1J6tNYkAg0ekGmS86FG2fMkb4e4bF0tUXW5kMOo4Y8BWr4f2U3U0aY9FxwcHBwcHBxeCRYmJ+J4UyNdtH+rWhyCke0ClOKthCxNTJg+t3AebcouUi7gGc+B8sK+vgFZso32VqK8dKLNy4cv7N1JyGJtuC1abKvEw1kwA8maXUJrb+wlsp4GMUI7cKss4XQMybU9vxUIDzJP6HyH8juU9TVUaT9RXgcZqi4mqiwgKs0S15uiZbZyThAVJGsd9Ooxl0mct1Qcs2nF0PsNOY0X19HbPfAEcHBwcHBwcHgrWJiciKbeHrr0yG61PAQjKMVbtdAlwnT+iiV0vLReuYhnPAP2fY1Zh99qJDq0feji3t2g3fn+ULW4OAPK5CBBViGyb8oAodHbdK8bqRTP/jiHQeZK0CSEraZcyJSQqgohaGjpbn+fTwhZQnaPg4ODg4ODw+vBwuRkTEuKVstDsGFt9ABZcoEw/WZzKGVWGZQLeca9oGEGGmI4vGkZC/k8IRO71mtlY/aLfXexdQVR5E5tRpFKZMYCgmSVl+qiofuMUFpnu3cJmSJVowdkqGxbgltB1goyZgXHqAbWWkvwyouFeKUL+dwlHkObUkd0J0yJEQ8y7yDn4ODg4ODwlWBhcjJWlhepBSLYQBtx7F1ykTDduf8gVTU41yGPmRho7IAugui8Na5oaRKiIaRi/WdDxcadrF0gRG0t0XEn9zZBiKzZJQyVtS+1Q4kdSuusYlOeO1SoAMr37GWpoUITsbxErdwuW4CfyEKhNTkaShRliJ9CMJOECMUeIYo6QLRvm1aGZzvzKnSZOI84loODg4ODg8OngoXJyajo6lALRLCxcZkQpYFyvAkK0+mLP6VXjycoF/WMe0BjB7RSn3ArXLOZLMYm6g/bKBb9Hhp4C8nAHp99IY5nm5AtsjZzwMwjexmCQFmFCpkhCJDt6RAu27lJAPuQIFpjdcSL3i1kaImWjQOqwcBrhXSWF2o9kTk4ODg4ODh8KliYxhE/i9illohgYt1ilwnTecsX0eqMfOXCnnEtECXMpBpJlPB7oM0zGZytgiwUBAtzrHB+7HdCKd/JIcMNbdQdH0uWULusibsJXUp0dMfYLcgxE8kqTPZtxIEUqgERQhbJvhxPtiK36Z4HebLtrqcCtyliy8izlQAeqy0riWorBp4BDg4ODg4ODl8LFqZxxKzsFLVEBAvbVtMpqyFLrhGm765dScmV+mGLe8a1YKAvhAdd8AAECO3D8TvsYYIIYcgvyvQgRJjcDykyGtWXN5weai2ppJ7IQ9SPvTgqQXAHyDahBXmkEKeRuukhg3RSmJKHn26bgUKmyb6VODrdWWUJYOis7en2xOwm2rF6dHnEaeGbiBrF9XFwcHBwcHD4bLAwjSPiDTq1SAQLW1a4VJj+tmMb6fQ9igU440qQDUKGCQKEf9uiOn68GBo7qS2/iCzb16pFwV0gk7NzDVHc3qHyknyEKCuWqFlP1N4iBKVKa/eN1t/4t6GOqEWc1ttD1NcrED/bm4k6Wok62wVt4rQuIlPfwOmCVoMmWE1CdtAgAuV5FXnafqbME0QHhbxtXjn67KqwDeJ6xeVMuC6Sg4ODg4ODw53BwjSOaBYLpl8eDlPLRDAQutylwvRGQpJy4c34NwZ9F/WeiCQKWeqeMj3IyLqF2uVDTsI3Ex0/TJSdKkSoRpMds2ngXevF6Ook0tULmRKSlhZPFLWfKGKXEDAhXhwcHBwcHBw+HyxM44gei4WezkxQy0QwgIYPLhKms5YuoKwao3LBzfgvGICLEj8ThuA2VAtJ2Df6Xh5HkPt9Vmlzi+KOaGJUiUGzTUS9LB8cHBwcHBwc7gkWpnEECmg2VZfRObs3qoUi0Fm/1GXCdPnWzcoFN+OfYJ8U9kahYcSQ6OnWGhtgdpOz2Sa0346P0uYXNRu0jA13k+Pg4ODg4ODwULAwjTNy25qDtyxv/RKXCdM7CSnKhTfjP2APFJpEoJHEmAFxSojU5imN1oZ89XyisBBtwCsG5XJwcHBwcHBweClYmMYZKMu7JTFKLRSBjouE6dwViympQqdchDO+DSTpZNndeAbf1lcRHd1LpOqmtzuUqCSfxAUPHMzBwcHBwcHB4b1gYZpArKooUgtFoOMiYfrTti1UWNuqXJAzvglECW3HkU0aVnbnbCDbVFZItGvdoCyhcUOLceAADg6OQAjrfLfxos2Fcw2qy3clHBwcgRksTBMIXW8PnbpzrVoqAhkXCNOpQphejI6jRm4n7hegHXlPDwbeumlFkB6rlenVVg78wp2B+2DFGra/G+33tqchRjuNwx/DfgFsv+A2m60MDnW20tc3lN7eoWDumS3d3cPp6hpKZ6ctmJU2lPb24bS1Dae11YrpJJi1Zk9zsxqjcWQMBgyxZhxF9RgC1eMOVM8TsH0urc+v6rlXvUbsX0cAr6+hr7ehr0X716r967mnZ/hr3v49Yft+Adb3kfV9Zf9+s38/cnB4K1iYJhhTEyLVUhHIbJx404cvr1xCoYVF8oMbpV1YkKsW6ox3sJbcYZAt/sh5JHS1ZOloH/iPY9FvMZGlu5lMrdXU21RAPfWp1FUVQ52lB6k9byu1pC4jQ9z7pI+cTY0Hn6aG8PupbsctVLPpv1S7dRIZkxZQW942qlr3Fypf8lMqX/RjKl/6C2pO/oxaM9ZQ2cIfUNln39N+LvoRVSy7mHRHXqDOsqPUXryP6sPvE5d1DdVuu5Hqd99DjQeeIP3RWWSIfYeaUxZTW+4m6izZT12Vx6i7Lpl69Xlkaqkgc1cT9Zud7+yHZyIYFg24j1igYW+cLbYLRNUC0or9glO1OAWqxSzDMP6D6n1txf5zQPVZYcX2swXYf/ZAJlnYgjtYmCYYkbp6OlUlFYFM6MTbil+ydSNVDSyOUdqFRXl3N74NwyJGvYhn3Ased/yh6Ooyi+fDBSV344h+s4X6RunxYBGi0V2bSG05oWQ48QHpIp6TolK7dTJVb7ySKlf/XgjPz6lswfeodP5FY1IuBKhmyyQhSz+3+f135O8gUvXhD9j8fuA8S35GjRHTqaPkgBSuaiFf9scMYcF3qXzxT6ly5eVUveGfVLvlBqoPu1MI3FPUdPwtas1cK4QqmszttXgABu7p8MAf6z5TcAgTvnHGAke1QGIYhvE0+DxCRowjeIOFaYLRa7HQpUd3q8UiUNk08cG1D0VHKguYsBjEYgn7ZFSLesb1GI298tszPO6+sBjv7iPq7B0Qg34L9TRkkFHIUU3Iv6XYlC3+scz4lDooReNCSE7DvoepNWu9+vTPvkc1QtJaszaQMXG++hhHENdT9tn3qQyZLSFi1ev/Tk1RrwiBiqF+U5f2gIgQHkmt4r94bIIlsDjp7gaDJUC25UH2pUMdHVaGlhnZlyLZlirZl6nZf+ts++00sP8GW7WwYhjGOezfV/bvO9v3pPW9qjH0/Qzs3+/2nwfWzwn7zw/bzxZg+7mDUkOWJQ4WpgkG3kLvF2bTacG0l2nrygkJ02ni/7GN9doDOEog08HZJteCx7O5uU/8oemTj6/JJFbiPhZIbDV3EvVADoQw9RkKZRamcf/jVLPleqoSUlGx4tdSnEoXfEctIn7Bd4Qo/ZAqll9CVWv/SjWbrqWGvQ9Sc8pC6q5PJVNfj8wotXcTGTo0vJD043AyIPpW7PdjDMV2/8Yg1r0dVmz3fwwi3hcDYO6ZLcP3lWjYLgBHw37haMV+gWllUFSHy+po2C9sR8N+UewqVNflCKr74xjqxboV1eNuRfVcqVA99/avESu2ryPV68z+tWj/WsVrWEP1+h76XgAcHP4cLEwuiASjnr5/cJtaLgKR7asnJEy/2R5K4rPUoeBM08TB/jCUOkKQ8EcSf+h8OXDrOnuIWoQ02f+RtfS2yb1KXRVRsmQO+4Saol8VMvWY3JtUvfEKISCXyqyNWlK8wILvUcWyX0nRq902VUjRQ3JPVXPSfGrL2USdZYepV5dNpk4DWcwohdQySm1ClJraB+no1X7fIySqS/wbWbguIZWjlTBycHBwcHBwTDxYmFwQHWYT3ZQQZDOZ1iwatzBtKi0aeOTGDnyrhYyISgSYkRls2KDtRfK3b/cgAcaOgSzTaNFvoX5zjxCpdrJ0G8nc2UimtloytZRTT0M6dZZGUFv2Riknhpg3SXd4hhQWyFXt5uu1fU9r/kwVKy+Te5/KF/+Eyhf9iMoWfp/KUC634DtCvv5PZoLKF6Ns7udUseJScZ4/UvWGf8msUO32m2QzCeynaop+jYyJn8iMWEfxPuqpS6a+5jJxm2rI3NFA5i4hRUL6LH3d4qYP/9oATxN+DWHE/bcVJqMQSPwOmSbb3+P/kCvOPnFwcHBwcLgnWJhcFBsqS+mMXevUchGIrFs8LmH63sbV1NrreHcwtLFG+ZhKCoIdlNdh/xEySFZBQgbJG80a3BEoRUNp3kRkz9dFEbcPT5dJCCKyRi1dQ2XIVoqswmTFXpxaWZo4ODg4ODjcEixMLoqm3h76/sHtarkIRDYsdVqYThU/nzsRQ32Kb9ZHCy7L08DmWGTbUF4HOUJXQWSQfL3EbrwBiYAUjJll8pOAHKGkDtkz3CeU1CEzBCm0FR978Big9A7nBdh2Zr0MNII4eZwgmJpCcHBwcHBweCpYmFwYHxZlq+UiEAlZ7rQwnb9mKYVXlA08Wo5HsAoTMkfoBGS79wj4etbEldHeo0nFeO8zztchLkPu9xFAKLAHqFcA6YCUAauMAPg8MjU4ry22Yft7HIvzWEUGl43rsHb7w32A2GBPFuRIZocGJMcRcB7cLlXgOm2FCxkqDg4ODg4ODtcGC5MLo8tspvP3hKoFI9DYtMJpYfrb7m1U1yVWd04EystQbqYSikAAZXVaaR3K6rTMUSCV1U00IAooRYOIjCcgNPala/4GhG+0wOnWY3FfOTg4ODg4OFwbLEwujuezkoNjkO2WlXTKKjR+cFyYXktLGniUHA+0RA2U1uLYbwT5s5bU2WaO7DMYHFrgYUGGZixpGCnwuI5V8ubrjNX5nYWJg4ODg4PDvcHC5OI4YdDRRfu3qiUjkNi6aqBTnmPC9IUVC6nE2CYFCLMiIAugs9MkwE9tTgXK72zx9w55uP1WMbLOsXByC1fQR69Zk57xJN1wFtt9Pv4GGjmMFnhMbBtFcEkeBwcHBweH64OFycXRYTLR3ckxaskIJLZBmNApzzFhuu/oUaVQBDpozMAxsUCWCNKDrnnjCdsMjL/RN4ZcY5+U7fHYp8XBwcHBwcHh2mBhckPsqa+mc3dvVItGoLBtNZ2ydolDwnT+mmVUVNemFIpABZklZJU4XBNoogAhMI/DPyERtlLhLyBbNFpSTZVdGqk5BAcHBwcHB8f4g4XJDdFpNtFVxw+pRSNQ2C6EaR1ai48tTI9ERimlIlDBPqW+vtGWuhzOBh7NZiEEGOjqbFhly98Yq0W4fXYpUNqvc3BwcHBw+FqwMLkpUpsNdOrOtWrZCAQgTOvHFqavrVtJewsrlWIRiECWeI+Se8K6l8nZLAo67KGVt61c+Dq4n2h3PlIgu2Tb/Q8lixwcHBwcHBzuCRYmN8YDqbGB2zFvu2AMYTp16QK6/eAhqmrsVMpFIIFOfmhcweHegBiMlXmxDwisbemaP4D9WiN1TsSvbfdloe06d6Hn4ODg4OBwX7AwuTFSmpvouwe2qYXD35EleaPvYfriysW0q6BcKRiBBNqFo/sftwZ3f6C8DtLk7GPtb40fcD9HCmTarBkzZJm4FI+Dg4ODg8O9wcLkxui2mOmZzEQ6dUcAluY50PThqr3h1KjvUUpGoNDa2idbhXN4JpBJgTD1jiIUqkB5m72U+CqQoZHCvtEDZlSxqHNwcHBwcLg3WJjcHElGPX3/YABmmTC4dvXIc5jOXbuMMmuMSskIBFCCh7lRvFj1fKDrHfb4OPPQ43mylRJfZqSSQ9wHlOpZj5P7nHi/HAcHBwcHh9uDhcnNYRHLujfzM9TS4c+ELKNTVi1UCtPnxL9nxp5QikYggMYOaBnOsuSdQJYFWRhnS9EMNlLiq4wkgkhittnIEvYtoZkFBwcHBwcHh/uDhckD0W4y0aVHd6vFwx/Zumogu6QWpp9t2UgnyhuVsuHPWLNKFt5h7/VAlsmZvUz+kmHqUAyeRVdA3FfrMZBFliUODg4ODg7PBQuTh+JYUwN9KRCG2UKW1ghZWg1ZGi5MZ6xcRHPik0ivEA5/xmjsk40dOHwnWjrJ4b1M/iBMaOBgK0K4zfh/s/i99RjIkrP7tzg4ODg4ODgmFixMHgoMs30yI4FO37lOLSL+APYtoTMeZGkEYbp02ybKqg6cvUtaVsnEjR18MLr6tO53jjwz/iBMKLmzJi8hSmjoYDtryRlB5ODg4ODg4HBdsDB5MLJbm+lnETvVMuLrILO0drFWijeCMJ2+alFAtRHnvUq+HdZSNUcH2WJ/kK2g+BLYX4VmD7gvkEBkkmxPhzw5O7CXg4ODg4ODwzXBwuThWFZeSJ/b6WdtxjGkFi3EZSmeWphOXbGQ7ouMVIqHv2HNKnH4fnT2CoRMOBKYbWQrIb4EMkkQJduMEkBzB2cH9XJwcHBwcHC4NliYPBx9/RaalhRNp6rExFfZuEyTpVGE6dLtm/2+jbjB0EdtbSbq6+OUkr8E2mojc+RI9gWZQtvmCb4Ksku4nZBB7i/CwcHBwcHh/WBh8kLUdnfSn4/tU8uJr4FSvHWLRxWm89Ytp8UZuX49pJbL7/w3UK6G7IwjgQG2vliah2G0uB/IJmH/EosSBwcHBweH7wQLk5fiQGMtXbh3k1pSfInQ5YOyNIIwTTl4wG+74iGr1NWFAbS8QvXXgFw4mmVCQEjsS9+8CZo9cHBwcHBwcPhusDB5KXotFpqTm+bb+5m2r6ZTNiwdVZh+uT2UCupalDLiy6BNOHe/C5zA/CLMZnI0kM1RyYunQbOHXiFwHBwcHBwcHL4bLExeDENvj9zPpJQVX2CrECZ0xhtBmL67aT0dKK5WComvgoYO7e3aPiVOKgVOYC+TbVvusaKnTy0wngaleFx+x8HBwcHB4dvBwuTl6Dab6R8xB9TC4m02rRhRmL64fhl9mpZFuib/2bfU2moik4lFKdACwoEyOzRKcHROka8IU4PBRI06vDb7qLvbTBZuHc7BwcHBweFzwcLkA5HS3ES/PBzme53zUI6nEKZTBfdFRVJ1Y6dSTHwJZJQgSmjowOF/AbmFEGF/Eho2QIhQeoeSOmRn7PciYbirI9EtLsP2fN6gsaWfsgu7KSmjg5IzOyg1q4PSszsor7CLSsu7qbZOvIaNfdTeYabuHovMilo4HcXBwcHBweHxYGHygTCLVeHe+mr6xr7NanHxFuiOZydMkKUpEQcov7ZVKSi+AkQJLcK5853/BeTopBh1a5kjNHXAfh+VeNjjSJbJFzJM1TqzFCUIk4pkQYo4PU1IVHZ+JxWWdlFFVQ81NKKro4m6uy0sUBwcHBwcHB4IFiYfCUhTlL6Bzt69US0v3mD9kmHCdOX+PVRc36aUFF8BosSld/4VKKlDa3CIEeYQTaSLHbJMYz31uD7VeT1JXomWXXIGW4nKERJVVNJF9Q091NGBcj5+wXNwcHBwcLgjWJh8LLbVVPhOu3EMrLURpt+EbaPj5Q1KSfE26HqniRKX3vl6YFlv3XeE0jpXt/jG5SGDNFrg+lXn9RT1RouUH5UUOQuyVBCo/MJOqqvvoc5OM39hwMHBwcHB4cJgYfKx6LFYaENVKX1r/xa1xHiS9YN7mC7btZUiSmuUsuJNMHDWukDk8O2ApKBczppJUomEq0AZ31gJFxyjOq+70bcR5Zf2KOVnoiD7hH1QJWXdpNP3yvcGixMHBwcHB8fEgoXJB6NPSNMRXR1duNeLe5q2rNRkSfDH8J2UVm1QCou3gCj19Fh4jpIfBBbs3X3qJg3uAvudcJ2jRY+QN9V53U2t3kyp2Z1K4XEVyF6hiURuQSfV1HbL9woHBwcHBwfH+IKFyYcjvcVAvzoS5vnhthhYu3EpnbZuCf1r/x5KrzYqpcXTGI3a/iSWJP8JVEhClFTi4C4gSxAzYDYP3BBFoLmE0c2ZLnv0rf1UUNozarMHV5Oa3UHlld1k4vcNBwcHBwfHuIKFyYcDy5usViPdkhjlOWmCLIUupy9sXEH3HTtGWTXelSXr3iR0BGNR8p9AOVxnr/szSpAjNHnA0Fp01APYv2RtIgFZgxipApkvnE91ue6iVtdHhUWdlJffQdm5HZSRIxBCgzI6ZIRUwjNeIGVZBd1UVtNHOiFq2C820mPBwcHBwcHBMXKwMPlBNPZ00wd52fTVPW5uBrFdIGTp29s20PyMHKr04pyl5ubBvUn9vAnDrwJPF2TF0TbgzoL9T5AxqxhBAlQvEfwOx0GKRhIFlO15qkyw3mCmktJOKirqGEJhoUZ+QQflCpHKyeugTCFS2I+kEiFHyCnqpsp6EzU09w+5DaMJJAcHBwcHB4c6WJj8JLBnJ6qigS4+FEaf2+GGbJOQpc+FrqCLd2+j4+J6VBLjbgyGPmpv5053/h5o7GC7SHcVmMtkGcdLo0OcDw0eVFKFTJi7G1CARqOQpZLhsjQaVolCFkolRfakZHVSfmmv7MCnug1WGprM1NureDA4ODg4ODg4lMHC5CeB0jRIRVF9G81NT6dfR4TT53etV8uPk5wpBOyy/btobnIq1ei6homMu8BwWYggJEkbMMuLuEAIV+1ZQuYH2SEI2EReGr19/aRrNlOzuDxkpOzD3VmmOiEopWVdSilyFMhTdl4HpWVpDR2sgpSR10V5JT1UXjs8m6QCpXll1b3UzU0gODg4ODg4HA4WJj8JZF9sZSOl2kAfZuXQX47uozN2rlOK0FhAuP5yZB99kJFFiVV60ul7hlyHO4AktbaaqKsL33JbeNhmAIYrGilgXxJK7lzh0LgMvOYqa8Tru9UiM1W2l4t/Qsqw/8mV4oQGD9X1vcoyvIlQXNZNxZW9VNVgpnqDhfRtY4uSlWqdWZ4XEsnBwcHBwcHhWLAw+UlgT4+9fOiaeqhW10UxlTq6Lz6WvrI7VClG9nwlPFQef1ycD+fH5dhftiuBJKFxQ0+PmQUpCGKi842MI2SCJhp4DyHTg8YLKMMzKa4DL09knCZaptdgMFNZ+cSySlZQyldf3yMzsShJhOzhNqqudzRqhCzlFnWL+2/ifUwcHBwcHBxOBAuTnwQyMioZsUUviKvS0aLcAnolLY2eSIqne+KP0+OJ8fRyaiotzMmn2MpG5XldBeQIC9PWVq1pQ18fSu0G7gRHUARkB9KjWrQ7AmTFXa+Zjg4zVVd3U3lFN9U09JGxzUzdvf3KxhG4HygJdCTrhGxSY7OF6vQmqqjqpqJitfyMRLE4vrS0kyoquuTta2jooZYWrTuk6rHA71S3QwVK9cpr+2QjiNLqXurs4TckBwcHBweHM8HC5CeBzAwWUCpJ8SbYW4VyJyxEu7u1Mju0/+b9SMEbeOa7JrAvCLLlzgwIOi/iNYusTbkQlIrKbqoV/9bpe6kVLex7LPIYs3jP4X0HoTJ29MvSN4iRrkXIkdFMdU0mqhXSVV3XKyWptLxLio9KiGzBMWVlg2KE9xHe23gPYcCsI40tkB1TPXa2QJQq6k1UUNZDucXdVCakqa1L3Cd+a3JwcHBwcDgVLEx+FFjEqUrzPAkEqb1dkyOIERaUcCP2Iw7bwMuhF5mmcZa2YT+Ruxf2EBNkQCFPtbVCeEo7qbhEy/SAsrJBsA9JUqJRDIqBWooATisXElVT002Njdb3jkle50TeO2giOVrJYEOzhUqr+yivpJtyirqkLKEcDy3W+W3KwcHBwcHhfLAw+VlgkYVvorH4QvmbSmrGAy4L4HIhZehe19amldWhLAiLPFw3B4czgZcMBqaOp0QPUtBncr842QZe5/hCAO8Bna5XZqEgU8gGVVZ2UVUV/q1JUF1dj8wQ6fV47+A9Y5JChPLZvj5NhlwZeBzQCMP2sdS3kcx4NRgtcu5SQXkPZRd2SSBKJZU9ZGgT71/Ffi0ODg4ODg4Ox4KFyU8D31BDZDo6THK/EBZ49hI1KEHavqJBETJJsLiDEGGBh1IglNMhizWeWTccHCMFvAELdgyzHU8zBTSR6BTnRRlasGUycX/RwQ+PHToH4vFAaSAECR3vUGZXKCQpt0iTJE2UuuReJX2zeF+7qNMgBwcHBwdHMAcLk58HFkPI/ABI1EhYjwE4jxUODk8FXm7i5Uc9QgAwq8nZPU7IrEC4UK4HAQvE16/2ftYeI4gi7i8eJ8xPqtFbqKxGE6S8gXI7qyRZM0qVdX3U2mERcun6DBcHBwcHB0ewBgsTBweHVwLyhJlIkCfI0HiaROB8yL4gC4MMFJpF4HIhC77qC7hdUowEuL243cgEtaEde1u/lCM0bLBmkNC0wVaMTgqSECaIE8ruGg1m8Rj46j3m4ODg4ODw72Bh4uDg8HpAHJBVgfyglbc1s6KSpLFA6RouA5cFIQOYW4TLR2bKKlZD5GqCrmG9DKsEWUUI1wcZst4OlBa2I3PULsSo2UK1TWYpRuhmV1rTR0WVvZRf2jMse2QVpMKybiqv7qXaxj4ytJipq4czSRwcHBwcHO4OFiYODg6fCgiAVTggGxAflKeNV6CsGATISFlL+wDkChkugOsYL9bLQPtxA7JELRZqNFqoDkLUaKKKOk2IioUQoaQOWaP8km5ZRof5SPZypAlSNxVX9FBVPfYjmaij0yJbnGOfIUsSBwcHBweH54KFiYODw28CIoV25cjW2GaiJHaCZI+co9Q20FmuVaMRHeaatSYK9QYhOILaJotsw13VIESn3kwVtSa5d6ikqpdKhPBAeoqEyBQK6SkoFeIj0MRnuPSowHFWkDVCkwZc1mDmCLOgWIo4ODg4ODh8JViYODg4/DqGZKRMWvkdhAqZKTSIgFghC9TUYqEGg5lqdSaqqjdReW2f7CYHEUImB5kfiEt+abfcG2SVIImt8AxIj1V2cCyyRTgfSuaKyrXMUGmVJkEVtb1UXdcnZahRbyK90UzGVjO1I2MkxAi3nYODg4ODg8N3g4WJg4MjoAOJGuwtGrK/aECwsMeot6+fenr75X6gLrTq79Jo77BQW4eZ2trN1GoHfofT2gUolcPxnQKcv7vHIi8Pl4tudbIzpXZTODg4ODg4OPwwWJg4ODg4ODg4ODg4ODhGCBYmDg4ODg4ODg4ODg6OEYKFiYODg4ODg4ODg4ODY4RgYeLg4ODg4ODg4ODg4BghWJg4ODg4ODg4ODg4ODhGCBYmDg4ODg4ODg4ODg6OEYKFiYODg4ODg4ODg4ODY4RgYeLg4ODg4ODg4ODg4BghWJg4ODg4ODg4ODg4ODhGCBYmDg4ODg4ODg4ODg6OEYKFiYODg4ODg4ODg4ODQxlE/w87jLEI32hmyQAAAABJRU5ErkJggg=="},"componentName":"Block","css":".home-content {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n text-align: center;\r\n height: calc(100vh - 262px);\r\n \r\n}\r\n.home-content .btn {\r\n margin-top: 24px;\r\n \r\n }\r\n .home-content .btn button {\r\n border: none;\r\n border-radius: 30px;\r\n background: #5e7ce0;\r\n \r\n font-size: 14px;\r\n color: #fff;\r\n \r\n cursor: pointer;\r\n }\r\n\r\n .home-content .text {\r\n font-size: 18px;\r\n }\r\n\r\n .home-content .account {\r\n margin-top: 16px;\r\n \r\n \r\n }\r\n\r\n .home-content .account .sub-text {\r\n color: #575d6c;\r\n }\r\n .home-content .account .login {\r\n color: #1890ff;\r\n cursor: pointer;\r\n }\r\n .home-content .logo img{\r\n border-radius: 50%;\r\n overflow: hidden;\r\n }","props":{},"children":[{"componentName":"div","props":{"className":"home","style":"height: 100vh; display: flex;"},"id":"357534ab","children":[{"componentName":"TinyRow","props":{"align":"middle","flex":true,"style":""},"children":[{"componentName":"TinyCol","props":{"span":6,"style":"text-align: center; display: flex; justify-content: center;"},"id":"f01b66ea","children":[{"componentName":"div","props":{"style":"width: 90%; height: 50%;"},"id":"8197d016","children":[{"componentName":"Img","props":{"style":"width: 100%; height: 100%;","src":{"type":"JSExpression","value":"this.state.loginImgUrl"}},"id":"471e30f3"}]}]},{"componentName":"TinyCol","props":{"span":"6","style":"text-align: center;"},"id":"781d5b46","children":[{"componentName":"div","props":{"className":"home-content","style":"font-size: 14px;"},"id":"08638b8a","children":[{"componentName":"div","props":{"className":"text"},"id":"18712ee2","children":[{"componentName":"div","props":{"style":"font-size: 16px;"},"id":"07e6794c","children":[{"componentName":"div","props":{"className":"logo"},"id":"07cad264","children":[{"componentName":"Img","props":{"style":"width: 105px; height: 105px; border-radius: 100px;","src":{"type":"JSExpression","value":"this.state.logoUrl"}},"id":"f4489e27"}]},{"componentName":"Text","props":{"text":"TinyLowCode 低代码平台","style":"display: block; font-size: 28px; margin-top: 12px; margin-bottom: 12px; font-weight: bold;","ref":"","className":"title"},"id":"e82108ce"},{"componentName":"Text","props":{"text":"致力于通过友好的用户交互提升业务的开发效率","style":"display: block; margin-bottom: 12px;"},"id":"65a2f1ad"},{"componentName":"Text","props":{"text":"欢迎一起来解锁~~","style":"margin-top: 12px;"},"id":"bb879abb"}]},{"componentName":"div","props":{"className":"btn"},"id":"44b2bcbd","children":[{"componentName":"TinyButton","props":{"text":"立即体验","round":true,"type":"primary","style":"margin-top: 40px;"},"id":"9580c5e7"},{"componentName":"div","props":{"className":"account"},"id":"6a8ffa3e","children":[{"componentName":"div","props":{"style":"font-size: 14px; margin-top: 4px;"},"id":"bfc6eb6c","children":[{"componentName":"Text","props":{"text":"已有团队?","style":"color: #777777;"},"id":"3d993264"},{"componentName":"Text","props":{"text":"立即进入","style":"color: #5e7ce0;","onClick":{"type":"JSExpression","value":"this.handleClick(event)"}},"id":"21390118"}]}]}]}]}]}]}],"id":"4545fea2"}]}],"methods":{"handleClick":{"type":"JSFunction","value":"function (event) {this.emit('goto-home', event)\n}"}},"fileName":"PortalHome","meta":{"id":1722,"parentId":"0","group":"staticPages","title":null,"occupier":null,"isHome":false,"description":"","router":"/","rootElement":"div","creator":"开发者","gmt_create":"2022-06-08 03:25:51","gmt_modified":"2022-06-09 05:19:09"},"id":1722,"schema":{"properties":[{"label":{"zh_CN":"基础信息"},"description":{"zh_CN":"基础信息"},"collapse":{"number":6,"text":{"zh_CN":"显示更多"}},"content":[]}],"events":{"onGotoHome":{"label":{"zh_CN":"点击立即进入触发方法"},"description":{"zh_CN":"点击立即进入触发方法"},"type":"event","functionInfo":{"params":[],"returns":{}},"defaultValue":"","linked":{"id":"21390118","componentName":"Text","event":"onClick"}}},"slots":{}},"dataSource":{},"i18n":{}},"description":null,"path":"common/components/home","screenshot":"","created_app":null,"tags":"","categories":[],"occupier":null,"isDefault":null,"isOfficial":true,"created_at":"2022-06-13T07:56:51.000Z","updated_at":"2023-01-13T08:12:51.000Z","assets":{"material":[],"scripts":["http://localhost:9090/assets/js/989web-components.es.js","http://localhost:9090/assets/js/989web-components.umd.js"],"styles":[]},"createdBy":86,"current_history":1655,"public":1,"tiny_reserved":false,"author":null,"content_blocks":null,"current_version":"x","is_published":true,"_id":"ALvDb0JD8atzd3nA"} +{"id":"V85zd9sWEya25Kxh","label":"PortalBlock","name_cn":null,"framework":"Vue","content":{"state":{},"methods":{},"componentName":"Block","fileName":"PortalBlock","css":"","props":{},"children":[{"componentName":"div","props":{"style":"font-size: 18px; height: 40px; border-bottom: 1px solid rgb(223, 225, 230); margin-top: 20px;"},"id":"d38cea57","children":[{"componentName":"Icon","props":{"name":"IconChevronLeft"},"id":"86c6e6b0"},{"componentName":"Text","props":{"text":"编辑物料资产包 | ","style":"margin-left: 10px; font-weight: bold;"},"id":"38d9fbc8"},{"componentName":"Text","props":{"text":{"type":"JSExpression","value":"this.props.blockName"},"style":"margin-left: 10px; font-weight: bold;"},"id":"6cd76396"}]}],"schema":{"properties":[{"label":{"zh_CN":"基础信息"},"description":{"zh_CN":"基础信息"},"collapse":{"number":6,"text":{"zh_CN":"显示更多"}},"content":[{"property":"blockName","type":"String","defaultValue":"MT0526-React 1.0","label":{"text":{"zh_CN":"区块名称"}},"cols":12,"rules":[],"handle":{"getter":"","setter":""},"hidden":false,"required":true,"readOnly":false,"disabled":false,"widget":{"component":"MetaInput","props":{"modelValue":"MT0526-React 1.0"}}}]}],"events":{},"slots":{}},"dataSource":{}},"description":null,"path":"portal","screenshot":"","created_app":null,"tags":null,"categories":[],"occupier":{"id":86,"username":"开发者","resetPasswordToken":"developer"},"isDefault":null,"isOfficial":null,"created_at":"2022-06-28T08:59:54.000Z","updated_at":"2023-01-13T08:20:09.000Z","assets":{"material":[],"scripts":["http://localhost:9090/assets/js/1005web-components.es.js","http://localhost:9090/assets/js/1005web-components.umd.js"],"styles":[]},"createdBy":{"id":86,"username":"开发者","resetPasswordToken":"developer"},"current_history":1665,"public":1,"tiny_reserved":false,"author":null,"content_blocks":null,"public_scope_tenants":[],"histories_length":1,"is_published":true,"_id":"V85zd9sWEya25Kxh"} +{"$$indexCreated":{"fieldName":"label","unique":true,"sparse":false}} +{"$$indexCreated":{"fieldName":"label","unique":true}} diff --git a/dl-flow-frontend/mockServer/src/database/defaultData/default.db b/dl-flow-frontend/mockServer/src/database/defaultData/default.db new file mode 100644 index 0000000..e9fbf49 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/database/defaultData/default.db @@ -0,0 +1,4 @@ +{"name":"createVm","id":"NTJ4MjvqoVj8OVsc","app":"918","route":"createVm","page_content":{"state":{"dataDisk":[1,2,3]},"methods":{},"componentName":"Page","css":"body {\r\n background-color:#eef0f5 ;\r\n margin-bottom: 80px;\r\n}","props":{},"children":[{"componentName":"div","props":{"style":"padding-bottom: 10px; padding-top: 10px;"},"id":"2b2cabf0","children":[{"componentName":"TinyTimeLine","props":{"active":"2","data":[{"name":"基础配置"},{"name":"网络配置"},{"name":"高级配置"},{"name":"确认配置"}],"horizontal":true,"style":"border-radius: 0px;"},"id":"dd764b17"}]},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"id":"30c94cc8","children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"计费模式"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"包年/包月","value":"1"},{"text":"按需计费","value":"2"}],"modelValue":"1"},"id":"a8d84361"}],"id":"9f39f3e7"},{"componentName":"TinyFormItem","props":{"label":"区域"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"乌兰察布二零一","value":"1"}],"modelValue":"1","style":"border-radius: 0px; margin-right: 10px;"},"id":"c97ccd99"},{"componentName":"Text","props":{"text":"温馨提示:页面左上角切换区域","style":"background-color: [object Event]; color: #8a8e99; font-size: 12px;"},"id":"20923497"},{"componentName":"Text","props":{"text":"不同区域的云服务产品之间内网互不相通;请就近选择靠近您业务的区域,可减少网络时延,提高访问速度","style":"display: block; color: #8a8e99; border-radius: 0px; font-size: 12px;"},"id":"54780a26"}],"id":"4966384d"},{"componentName":"TinyFormItem","props":{"label":"可用区","style":"border-radius: 0px;"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"可用区1","value":"1"},{"text":"可用区2","value":"2"},{"text":"可用区3","value":"3"}],"modelValue":"1"},"id":"6184481b"}],"id":"690837bf"}],"id":"b6a425d4"}]},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"CPU架构"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"x86计算","value":"1"},{"text":"鲲鹏计算","value":"2"}],"modelValue":"1"},"id":"7d33ced7"}],"id":"05ed5a79"},{"componentName":"TinyFormItem","props":{"label":"区域"},"children":[{"componentName":"div","props":{"style":"display: flex; justify-content: flex-start; align-items: center;"},"id":"606edf78","children":[{"componentName":"div","props":{"style":"display: flex; align-items: center; margin-right: 10px;"},"id":"f3f98246","children":[{"componentName":"Text","props":{"text":"vCPUs","style":"width: 80px;"},"id":"c287437e"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}]},"id":"4c43286b"}]},{"componentName":"div","props":{"style":"display: flex; align-items: center; margin-right: 10px;"},"children":[{"componentName":"Text","props":{"text":"内存","style":"width: 80px; border-radius: 0px;"},"id":"38b8fa1f"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}]},"id":"cd33328e"}],"id":"2b2c678f"},{"componentName":"div","props":{"style":"display: flex; align-items: center;"},"children":[{"componentName":"Text","props":{"text":"规格名称","style":"width: 80px;"},"id":"d3eb6352"},{"componentName":"TinySearch","props":{"modelValue":"","placeholder":"输入关键词"},"id":"21cb9282"}],"id":"b8e0f35c"}]},{"componentName":"div","props":{"style":"border-radius: 0px;"},"id":"5000c83e","children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"通用计算型","value":"1"},{"text":"通用计算增强型","value":"2"},{"text":"内存优化型","value":"3"},{"text":"内存优化型","value":"4"},{"text":"磁盘增强型","value":"5"},{"text":"超高I/O型","value":"6"},{"text":"GPU加速型","value":"7"}],"modelValue":"1","style":"border-radius: 0px; margin-top: 12px;"},"id":"b8724703"},{"componentName":"TinyGrid","props":{"editConfig":{"trigger":"click","mode":"cell","showStatus":true},"columns":[{"type":"radio","width":60},{"field":"employees","title":"规格名称"},{"field":"created_date","title":"vCPUs | 内存(GiB)","sortable":true},{"field":"city","title":"CPU","sortable":true},{"title":"基准 / 最大带宽\t","sortable":true},{"title":"内网收发包","sortable":true}],"data":[{"id":"1","name":"GFD科技有限公司","city":"福州","employees":800,"created_date":"2014-04-30 00:56:00","boole":false},{"id":"2","name":"WWW科技有限公司","city":"深圳","employees":300,"created_date":"2016-07-08 12:36:22","boole":true}],"style":"margin-top: 12px; border-radius: 0px;","auto-resize":true},"id":"77701c25"},{"componentName":"div","props":{"style":"margin-top: 12px; border-radius: 0px;"},"id":"3339838b","children":[{"componentName":"Text","props":{"text":"当前规格","style":"width: 150px; display: inline-block;"},"id":"203b012b"},{"componentName":"Text","props":{"text":"通用计算型 | Si2.large.2 | 2vCPUs | 4 GiB","style":"font-weight: 700;"},"id":"87723f52"}]}]}],"id":"657fb2fc"}],"id":"d19b15cf"}],"id":"9991228b"},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"镜像","style":"border-radius: 0px;"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"公共镜像","value":"1"},{"text":"私有镜像","value":"2"},{"text":"共享镜像","value":"3"}],"modelValue":"1"},"id":"922b14cb"},{"componentName":"div","props":{"style":"display: flex; margin-top: 12px; border-radius: 0px;"},"id":"6b679524","children":[{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 170px; margin-right: 10px;"},"id":"4851fff7"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 340px;"},"id":"a7183eb7"}]},{"componentName":"div","props":{"style":"margin-top: 12px;"},"id":"57aee314","children":[{"componentName":"Text","props":{"text":"请注意操作系统的语言类型。","style":"color: #e37d29;"},"id":"56d36c27"}]}],"id":"e3b02436"}],"id":"59aebf2b"}],"id":"87ff7b99"},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"系统盘","style":"border-radius: 0px;"},"children":[{"componentName":"div","props":{"style":"display: flex;"},"id":"cddba5b8","children":[{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 200px; margin-right: 10px;"},"id":"a97fbe15"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px; margin-right: 10px;"},"id":"1cde4c0f"},{"componentName":"Text","props":{"text":"GiB \nIOPS上限240,IOPS突发上限5,000","style":"color: #575d6c; font-size: 12px;"},"id":"2815d82d"}]}],"id":"50239a3a"}],"id":"e8582986"},{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"数据盘","style":"border-radius: 0px;"},"children":[{"componentName":"div","props":{"style":"margin-top: 12px; display: flex;"},"id":"728c9825","children":[{"componentName":"Icon","props":{"style":"margin-right: 10px; width: 16px; height: 16px;","name":"IconPanelMini"},"id":"fded6930"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 200px; margin-right: 10px;"},"id":"62734e3f"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px; margin-right: 10px;"},"id":"667c7926"},{"componentName":"Text","props":{"text":"GiB \nIOPS上限600,IOPS突发上限5,000","style":"color: #575d6c; font-size: 12px; margin-right: 10px;"},"id":"e7bc36d6"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px;"},"id":"1bd56dc0"}],"loop":{"type":"JSExpression","value":"this.state.dataDisk"}},{"componentName":"div","props":{"style":"display: flex; margin-top: 12px; border-radius: 0px;"},"children":[{"componentName":"Icon","props":{"name":"IconPlus","style":"width: 16px; height: 16px; margin-right: 10px;"},"id":"65c89f2b"},{"componentName":"Text","props":{"text":"增加一块数据盘","style":"font-size: 12px; border-radius: 0px; margin-right: 10px;"},"id":"cb344071"},{"componentName":"Text","props":{"text":"您还可以挂载 21 块磁盘(云硬盘)","style":"color: #8a8e99; font-size: 12px;"},"id":"80eea996"}],"id":"e9e530ab"}],"id":"078e03ef"}],"id":"ccef886e"}],"id":"0fb7bd74"},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-color: #ffffff; padding-top: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; position: fixed; inset: auto 0% 0% 0%; height: 80px; line-height: 80px; border-radius: 0px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[],"id":"21ed4475"},{"componentName":"TinyRow","props":{"style":"border-radius: 0px; height: 100%;"},"children":[{"componentName":"TinyCol","props":{"span":"8"},"id":"b9d051a5","children":[{"componentName":"TinyRow","props":{"style":"border-radius: 0px;"},"children":[{"componentName":"TinyCol","props":{"span":"5","style":"display: flex;"},"id":"02352776","children":[{"componentName":"Text","props":{"text":"购买量","style":"margin-right: 10px;"},"id":"0cd9ed5c"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px; margin-right: 10px;"},"id":"2f9cf442"},{"componentName":"Text","props":{"text":"台"},"id":"facd4481"}]},{"componentName":"TinyCol","props":{"span":"7"},"id":"82b6c659","children":[{"componentName":"div","props":{},"id":"9cd65874","children":[{"componentName":"Text","props":{"text":"配置费用","style":"font-size: 12px;"},"id":"b5a0a0da"},{"componentName":"Text","props":{"text":"¥1.5776","style":"padding-left: 10px; padding-right: 10px; color: #de504e;"},"id":"d9464214"},{"componentName":"Text","props":{"text":"/小时","style":"font-size: 12px;"},"id":"af7cc5e6"}]},{"componentName":"div","props":{},"id":"89063830","children":[{"componentName":"Text","props":{"text":"参考价格,具体扣费请以账单为准。","style":"font-size: 12px; border-radius: 0px;"},"id":"d8995fbc"},{"componentName":"Text","props":{"text":"了解计费详情","style":"font-size: 12px; color: #344899;"},"id":"b383c3e2"}]}]}],"id":"94fc0e43"}]},{"componentName":"TinyCol","props":{"span":"4","style":"display: flex; flex-direction: row-reverse; border-radius: 0px; height: 100%; justify-content: flex-start; align-items: center;"},"id":"10b73009","children":[{"componentName":"TinyButton","props":{"text":"下一步: 网络配置","type":"danger","style":"max-width: unset;"},"id":"0b584011"}]}],"id":"d414a473"}],"id":"e8ec029b"}],"fileName":"createVm"},"tenant":1,"isBody":false,"parentId":"0","group":"staticPages","depth":0,"isPage":true,"isDefault":false,"occupier":{"id":86,"username":"开发者","email":"developer@lowcode.com","resetPasswordToken":"developer","confirmationToken":"dfb2c162-351f-4f44-ad5f-8998","is_admin":true},"isHome":false,"_id":"NTJ4MjvqoVj8OVsc"} +{"name":"ComponentsSetting","id":"fh7U0xYetFGA5Ieu","app":"918","route":"componentsSetting","page_content":{"state":{"components":[{"name":"表单","text":"由按钮、输入框、选择器、单选框、多选框等控件组成..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."},{"name":"按钮","text":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..."}],"pageConfig":{"component":{"type":"JSResource","value":"this.utils.Pager"},"attrs":{"currentPage":1,"pageSize":50,"pageSizes":[10,20,50],"total":0,"layout":"sizes,total, prev, pager, next, jumper"}},"componentsTotal":0,"renderf5956ed2":[{"label":"按更新时间","value":"updata","_RID":"row_6"},{"label":"按创建时间","value":"create"}],"renderb52aeac9":[{"framework":"","materials":"","name":"表单","description":"由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据","id":"021fd6b6","_RID":"row_1"},{"framework":"","materials":"","name":"按钮","description":"常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型","id":"84d239bb","_RID":"row_2"},{"framework":"","materials":"","name":"表单项","description":"Form 组件下的 FormItem 配置","id":"490f8a00","_RID":"row_3"},{"framework":"","materials":"","name":"开关","description":"关闭或打开","id":"c259b8b3","_RID":"row_4"},{"framework":"","materials":"","name":"互斥按钮组","description":"以按钮组的方式出现,常用于多项类似操作","id":"083ed9c7","_RID":"row_5"},{"framework":"","materials":"","name":"提示框","description":"Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画","id":"09136cea","_RID":"row_6"},{"framework":"","materials":"","name":"文字提示框","description":"动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信","id":"a63b57d5","_RID":"row_7"},{"framework":"","materials":"","name":"树","description":"可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单","id":"a0f6e8a3","_RID":"row_8"},{"framework":"","materials":"","name":"分页","description":"当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件","id":"d1aa18fc","_RID":"row_9"},{"framework":"","materials":"","name":"表格","description":"提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等","id":"ca49cc52","_RID":"row_10"},{"framework":"","materials":"","name":"搜索框","description":"指定条件对象进行搜索数据","id":"4e20ecc9"},{"framework":"","materials":"","name":"折叠面板","description":"内容区可指定动态页面或自定义 html 等,支持展开收起操作","id":"6b093ee5"},{"framework":"","materials":"","name":"对话框","description":"模态对话框,在浮层中显示,引导用户进行相关操作","id":"0a09abc0"},{"framework":"","materials":"","name":"标签页签项","description":"tab页签","id":"f814b901"},{"framework":"","materials":"","name":"单选","description":"用于配置不同场景的选项,在一组备选项中进行单选","id":"c5ae797c"},{"framework":"","materials":"","name":"弹出编辑","description":"该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件","id":"33d0c590"},{"framework":"","materials":"","name":"下拉框","description":"Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件","id":"16711dfa"},{"framework":"","materials":"","name":"折叠面板项","description":"内容区可指定动态页面或自定义 html 等,支持展开收起操作","id":"a9fd190a"},{"framework":"","materials":"","name":"复选框","description":"用于配置不同场景的选项,提供用户可在一组选项中进行多选","id":"a7dfa9ec"},{"framework":"","materials":"","name":"复选框按钮","description":"用于配置不同场景的选项,提供用户可在一组选项中进行多选","id":"c9071a7b"},{"framework":"","materials":"","name":"输入框","description":"通过鼠标或键盘输入字符","id":"d4bb8330"},{"framework":"","materials":"","name":"时间线","description":"时间线","id":"ced3dc83"}],"render7e97d9c7":[{"name":"标签页","description":"分隔内容上有关联但属于不同类别的数据集合","id":"a2b3e681","_RID":"row_1"},{"name":"走马灯","description":"常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现","id":"311fd1ae","_RID":"row_2"},{"name":"日期选择器","description":"用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式","id":"8d38b248","_RID":"row_3"},{"name":"布局列","description":"列配置信息","id":"1f6940d8"}]},"methods":{"linkClick":{"type":"JSFunction","value":"function linkClick() {\n location.href = 'http://10.37.114.118:3000/my-platform/create';\n}"},"query":{"type":"JSFunction","value":"function query(name) {\n this.state.components.fillter((e) => {\n return e.name !== name;\n });\n}"},"getTableData":{"type":"JSFunction","value":"function getTableData() {\n return new Promise((resolve, reject) => {\n this.dataSourceMap['timeData'].load().then((res) => {\n resolve({ result: [], page: { total: 0 } });\n });\n });\n}"},"clearSelected":{"type":"JSFunction","value":"function clearSelected(event) {\n this.dataSourceMap['selectedComponents'] = this.dataSourceMap['selectedComponents'] || [];\n this.dataSourceMap['selectedComponents']?.map((e) => {\n this.dataSourceMap['componentList'].push(e);\n });\n this.dataSourceMap['selectedComponents'] = [];\n}"}},"componentName":"Page","css":".components-box{\r\n height:900px;\r\n display: flex;\r\n}\r\n.components-box-left{\r\n width: 270px;\r\n}\r\n.components-box-right{\r\n width:50%;\r\n}\r\n.components-box-right-add{\r\n width: 100%;\r\n height: 200px;\r\n}\r\n.mgr20{\r\n margin-right: 20px;\r\n}","props":{},"children":[{"componentName":"div","props":{},"id":"2a5d4622","children":[{"componentName":"TinyGrid","props":{"editConfig":{"trigger":"click","mode":"cell","showStatus":true},"columns":[{"type":"index","width":60},{"type":"selection","width":60},{"field":"employees","title":"员工数"},{"field":"created_date","title":"创建日期"},{"field":"city","title":"城市"}],"data":[{"id":"1","name":"GFD科技有限公司","city":"福州","employees":800,"created_date":"2014-04-30 00:56:00","boole":false},{"id":"2","name":"WWW科技有限公司","city":"深圳","employees":300,"created_date":"2016-07-08 12:36:22","boole":true}]},"id":"3635454e"}]},{"componentName":"PortalHeader","props":{},"componentType":"Block","id":"60284cf1"},{"componentName":"portalBlock","props":{},"componentType":"Block","id":"6911db84"},{"componentName":"div","props":{"style":"height: 80px; width: 87%; margin: 0 auto; margin-bottom: 20px; margin-top: 20px; padding-left: 20px; padding-top: 30px; background: rgb(242, 245, 252);"},"id":"436ecc4a","children":[{"componentName":"Text","props":{"text":" 物料资产包简介","style":"color: rgb(138, 142, 153);"},"id":"16ad7aa9"},{"componentName":"Text","props":{"text":"调试构建报错","style":"margin-left: 10px; margin-right: 10px;"},"id":"ab44d8ea"},{"componentName":"Icon","props":{"name":"IconEdit"},"id":"8b6be3c2"},{"componentName":"div","props":{},"id":"848e3e8a","children":[{"componentName":"Text","props":{"text":"发布地址","style":"color: rgb(138, 142, 153);"},"id":"cd51ad2c"},{"componentName":"Text","props":{"text":"http://10.37.114.118:3000/my-platform/create","style":"margin-left: 20px; margin-right: 10px; color: rgb(36, 150, 255);","onClick":{"type":"JSExpression","value":"this.linkClick"}},"id":"3ed13633"},{"componentName":"Icon","props":{"name":"IconEdit"},"id":"16b75d9f"}]}]},{"componentName":"div","props":{"className":"components-box","style":"width: 88%; margin: 0 auto; border-width: 1px; border-color: rgb(223, 225, 230); border-style: solid; padding-top: 40px; padding-bottom: 40px; height: 1200px;"},"id":"c880007b","children":[{"componentName":"div","props":{"className":"components-box-left","style":"border-right-width: 2px; border-right-style: solid; border-color: rgb(223, 225, 230); position: relative;"},"id":"3525fc52","children":[{"componentName":"TinyTimeLine","props":{"active":"1","data":[{"name":"添加组件"},{"name":"添加区块"}],"horizontal":false,"className":"components-box-left","vertical":true},"id":"1e391ed7"},{"componentName":"div","props":{},"id":"81ccd767","children":[{"componentName":"div","props":{"style":"height: 300px; position: absolute; bottom: 20px; left: 20px;"},"id":"bc11d593","children":[{"componentName":"div","props":{},"id":"50ed6e39","children":[{"componentName":"Text","props":{"text":"组件示意图 "},"id":"fa6b920c"}]},{"componentName":"div","props":{},"id":"9ca346e6","children":[{"componentName":"Text","props":{"text":"组件是构建物料资产包的必要元素\n","style":"margin-top: 10px; color: rgb(173, 176, 184); margin-bottom: 20px;"},"id":"d0ac5a34"}]},{"componentName":"Img","props":{"src":"http://localhost:9090/assets/images/f750dc319828b039af713c643aad02bd_222x134.png","style":"margin-top: 20px; width: 95%;"},"id":"3eac458c"}]}]}]},{"componentName":"div","props":{"className":".components-box-right","style":"padding-left: 50px; border-radius: 0px; height: 100%;"},"id":"d0890144","children":[{"componentName":"div","props":{"className":"components-box-right-add"},"id":"0c79b824","children":[{"componentName":"div","props":{"style":"height: 50px;"},"id":"5dd75633","children":[{"componentName":"Text","props":{"text":"已添加","style":"font-size: 16px; font-weight: bold;"},"id":"e534646e"},{"componentName":"div","props":{"style":"display: inline-block;","onClick":{"type":"JSExpression","value":"this.clearSelected(event)"}},"id":"1f3f03e5","children":[{"componentName":"Icon","props":{"name":"IconUndelete","style":"margin-left: 10px; font-size: 20px; color:rgb(94, 124, 224);"},"id":"1ea6eea4"},{"componentName":"Text","props":{"text":"清空默认","style":"color: rgb(94, 124, 224); border-radius: 0px;"},"id":"4f143cd5"}]}]},{"componentName":"Collection","props":{"style":"height: 140px; display: flex; border-radius: 0px;","dataSource":151},"id":"9b4f4898","children":[{"componentName":"div","props":{"style":"width: 300px; height: 70px; margin-top: 20px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-width: 1px; border-style: solid; border-color: #dfe1e6; display: flex; flex-direction: row; padding-right: 0px; padding-left: 0px; margin-right: 25px; margin-left: 0px; padding-top: 20px; margin-bottom: 20px; position: relative; background: rgb(242, 245, 252); border-radius: 2px;"},"id":"b5f585f9","children":[{"componentName":"Img","props":{"style":"width: 50px; height: 50px; margin-left: 20px; margin-top: 0px;","src":"http://localhost:9090/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png"},"id":"ee90fa60"},{"componentName":"div","props":{"style":"width: 200px; margin-left: 12px;"},"id":"7735e4da","children":[{"componentName":"Text","props":{"text":{"type":"JSExpression","value":"item.name"},"style":"font-weight: bold;"},"id":"068127b6"},{"componentName":"Text","props":{"text":"默认","style":"position: absolute; right: 2px; top: 2px; font-family: \"Microsoft YaHei\"; color: rgb(255, 255, 255); background: rgb(80, 212, 171); border-radius: 4.5px 0px;"},"id":"6d0281d2"},{"componentName":"TinyCheckbox","props":{"text":"","style":"position: absolute; right: 10px; bottom: 10px; color: rgb(82, 110, 204);","checked":{"type":"JSExpression","value":"item.isSelected"},"modelValue":true},"id":"622d9bdf"},{"componentName":"Text","props":{"text":{"type":"JSExpression","value":"item.description"},"style":"display: block; margin-top: 10px; text-overflow: ellipsis; width: 90%; overflow: hidden; white-space: nowrap;"},"id":"eb87da78"}]}],"loop":{"type":"JSExpression","value":"this.state.render7e97d9c7"}}]}]},{"componentName":"div","props":{"style":"width: 98%; display: flex; margin-bottom: 22px; justify-content: space-between; margin-right: 0px; padding-right: 0px;"},"id":"c7f80c55","children":[{"componentName":"Text","props":{"text":"选择组件","style":"font-size: 16px; font-weight: bold;"},"id":"2ebef929"},{"componentName":"div","props":{"style":"display: flex;"},"id":"00a6fb16","children":[{"componentName":"TinySearch","props":{"modelValue":"","placeholder":"输入关键词","style":"width: 295px; margin-right: 12px;","onChange":{"type":"JSExpression","value":"this.query"}},"id":"d7364e4d"},{"componentName":"Collection","props":{"dataSource":129},"id":"03a2f95b","children":[{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":{"type":"JSExpression","value":"this.state.renderf5956ed2"},"style":"border-radius: 0px; margin-right: 0px;"},"id":"181b5ab7"}]}]}]},{"componentName":"Collection","props":{"dataSource":150,"style":"margin-left: 0px; margin-right: 314px; display: flex; justify-content: flex-start; flex-wrap: wrap; width: 98%; over-flow: hidden; border-radius: 0px;"},"id":"2b24a6d3","children":[{"componentName":"div","props":{"style":"padding-top: 20px; padding-left: 12px; padding-right: 12px; width: 280px; height: 92px; background: rgb(255, 255, 255); border-width: 1px; border-color: rgb(223, 225, 230); border-style: solid; border-radius: 2px; padding-bottom: 20px; display: flex; margin-right: 0px; margin-bottom: 20px; margin-left: 20px;"},"id":"8a6e5b83","children":[{"componentName":"Img","props":{"style":"width: 40px; height: 40px;","src":"http://localhost:9090/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png"},"id":"474ffcb2"},{"componentName":"div","props":{"style":"margin-left: 12px; border-radius: 0px; width: 90%;"},"id":"99944a57","children":[{"componentName":"div","props":{"style":"display: flex; justify-content: space-between;"},"id":"b5c88120","children":[{"componentName":"Text","props":{"text":{"type":"JSExpression","value":"item.name"},"style":"font-weight: bold; border-radius: 0px;"},"id":"a747169d"},{"componentName":"TinyCheckbox","props":{"text":"","checked":false,"modelValue":{"type":"JSExpression","value":"item.isSelected","model":true},"style":"border-radius: 0px;"},"id":"72cee0e5"}]},{"componentName":"Text","props":{"style":"display: block; font-size: 12px; line-height: 17px; color: #333333; margin-top: 10px;","text":{"type":"JSExpression","value":"item.description"}},"id":"1aed3258"}]}],"loop":{"type":"JSExpression","value":"this.state.renderb52aeac9"},"condition":true,"loopArgs":["item","idx"]}]},{"componentName":"TinyPager","props":{"layout":"sizes,total, prev, pager, next","total":{"type":"JSExpression","value":"this.state.componentsTotal"},"pageSize":10,"currentPage":1,"style":"margin-left: 314px; margin-right: 314px;"},"id":"ff96cc4e"}]}]},{"componentName":"div","props":{"style":"height: 100px; background: rgb(255, 255, 255); filter: drop-shadow(rgba(0, 0, 0, 0.1) 0px -1px 4px); text-align: center;"},"id":"616d5f40","children":[{"componentName":"TinyButton","props":{"text":"创建物料资产包","style":"background: rgb(245, 245, 246); border-width: 1px; border-color: rgb(173, 176, 184); border-style: solid; border-radius: 2.5px; opacity: 0.6; margin: 0 auto; width: 200px; height: 32px; margin-top: 30px; max-width: none; margin-bottom: 10px;"},"id":"e6abff72"},{"componentName":"Text","props":{"style":"display: block; color: rgb(173, 176, 184); margin-top: 5px; width: 380px; margin: 0 auto;","text":"组件或区块未添加,请切换左侧步骤条去完成添加"},"id":"f3a123ba","children":[{"componentName":"Icon","props":{}}]}]}],"fileName":"componentsSetting"},"tenant":1,"isBody":false,"parentId":"0","group":"staticPages","depth":0,"isPage":true,"isDefault":false,"occupier":{"id":86,"username":"开发者","email":"developer@lowcode.com","resetPasswordToken":"developer","confirmationToken":"dfb2c162-351f-4f44-ad5f-8998","is_admin":true},"isHome":true,"_id":"fh7U0xYetFGA5Ieu"} +{"$$indexCreated":{"fieldName":"route","unique":true,"sparse":false}} +{"$$indexCreated":{"fieldName":"route","unique":true}} diff --git a/dl-flow-frontend/mockServer/src/database/pages.db b/dl-flow-frontend/mockServer/src/database/pages.db new file mode 100644 index 0000000..103c886 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/database/pages.db @@ -0,0 +1,4 @@ +{"name":"DemoPage","id":"5bhD7p5FUsUOTFRN","app":"918","route":"demopage","page_content":{"state":{},"methods":{},"componentName":"Page","css":"","props":{},"lifeCycles":{},"children":[{"componentName":"div","props":{},"id":"85375559","children":[{"componentName":"TinySwitch","props":{"modelValue":""},"id":"33433546"}]}],"dataSource":{"list":[]},"utils":[],"bridge":[],"inputs":[],"outputs":[],"fileName":"DemoPage"},"tenant":1,"isBody":false,"parentId":"0","group":"staticPages","depth":0,"isPage":true,"isDefault":false,"occupier":{"id":86,"username":"开发者","email":"developer@lowcode.com","resetPasswordToken":"developer","confirmationToken":"dfb2c162-351f-4f44-ad5f-8998","is_admin":true},"isHome":false,"message":"Page auto save","_id":"5bhD7p5FUsUOTFRN"} +{"name":"createVm","id":"NTJ4MjvqoVj8OVsc","app":"918","route":"createVm","page_content":{"state":{"dataDisk":[1,2,3]},"methods":{},"componentName":"Page","css":"body {\r\n background-color:#eef0f5 ;\r\n margin-bottom: 80px;\r\n}","props":{},"children":[{"componentName":"div","props":{"style":"padding-bottom: 10px; padding-top: 10px;"},"id":"2b2cabf0","children":[{"componentName":"TinyTimeLine","props":{"active":"2","data":[{"name":"基础配置"},{"name":"网络配置"},{"name":"高级配置"},{"name":"确认配置"}],"horizontal":true,"style":"border-radius: 0px;"},"id":"dd764b17"}]},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"id":"30c94cc8","children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"计费模式"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"包年/包月","value":"1"},{"text":"按需计费","value":"2"}],"modelValue":"1"},"id":"a8d84361"}],"id":"9f39f3e7"},{"componentName":"TinyFormItem","props":{"label":"区域"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"乌兰察布二零一","value":"1"}],"modelValue":"1","style":"border-radius: 0px; margin-right: 10px;"},"id":"c97ccd99"},{"componentName":"Text","props":{"text":"温馨提示:页面左上角切换区域","style":"background-color: [object Event]; color: #8a8e99; font-size: 12px;"},"id":"20923497"},{"componentName":"Text","props":{"text":"不同区域的云服务产品之间内网互不相通;请就近选择靠近您业务的区域,可减少网络时延,提高访问速度","style":"display: block; color: #8a8e99; border-radius: 0px; font-size: 12px;"},"id":"54780a26"}],"id":"4966384d"},{"componentName":"TinyFormItem","props":{"label":"可用区","style":"border-radius: 0px;"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"可用区1","value":"1"},{"text":"可用区2","value":"2"},{"text":"可用区3","value":"3"}],"modelValue":"1"},"id":"6184481b"}],"id":"690837bf"}],"id":"b6a425d4"}]},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"CPU架构"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"x86计算","value":"1"},{"text":"鲲鹏计算","value":"2"}],"modelValue":"1"},"id":"7d33ced7"}],"id":"05ed5a79"},{"componentName":"TinyFormItem","props":{"label":"区域"},"children":[{"componentName":"div","props":{"style":"display: flex; justify-content: flex-start; align-items: center;"},"id":"606edf78","children":[{"componentName":"div","props":{"style":"display: flex; align-items: center; margin-right: 10px;"},"id":"f3f98246","children":[{"componentName":"Text","props":{"text":"vCPUs","style":"width: 80px;"},"id":"c287437e"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}]},"id":"4c43286b"}]},{"componentName":"div","props":{"style":"display: flex; align-items: center; margin-right: 10px;"},"children":[{"componentName":"Text","props":{"text":"内存","style":"width: 80px; border-radius: 0px;"},"id":"38b8fa1f"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}]},"id":"cd33328e"}],"id":"2b2c678f"},{"componentName":"div","props":{"style":"display: flex; align-items: center;"},"children":[{"componentName":"Text","props":{"text":"规格名称","style":"width: 80px;"},"id":"d3eb6352"},{"componentName":"TinySearch","props":{"modelValue":"","placeholder":"输入关键词"},"id":"21cb9282"}],"id":"b8e0f35c"}]},{"componentName":"div","props":{"style":"border-radius: 0px;"},"id":"5000c83e","children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"通用计算型","value":"1"},{"text":"通用计算增强型","value":"2"},{"text":"内存优化型","value":"3"},{"text":"内存优化型","value":"4"},{"text":"磁盘增强型","value":"5"},{"text":"超高I/O型","value":"6"},{"text":"GPU加速型","value":"7"}],"modelValue":"1","style":"border-radius: 0px; margin-top: 12px;"},"id":"b8724703"},{"componentName":"TinyGrid","props":{"editConfig":{"trigger":"click","mode":"cell","showStatus":true},"columns":[{"type":"radio","width":60},{"field":"employees","title":"规格名称"},{"field":"created_date","title":"vCPUs | 内存(GiB)","sortable":true},{"field":"city","title":"CPU","sortable":true},{"title":"基准 / 最大带宽\t","sortable":true},{"title":"内网收发包","sortable":true}],"data":[{"id":"1","name":"GFD科技有限公司","city":"福州","employees":800,"created_date":"2014-04-30 00:56:00","boole":false},{"id":"2","name":"WWW科技有限公司","city":"深圳","employees":300,"created_date":"2016-07-08 12:36:22","boole":true}],"style":"margin-top: 12px; border-radius: 0px;","auto-resize":true},"id":"77701c25"},{"componentName":"div","props":{"style":"margin-top: 12px; border-radius: 0px;"},"id":"3339838b","children":[{"componentName":"Text","props":{"text":"当前规格","style":"width: 150px; display: inline-block;"},"id":"203b012b"},{"componentName":"Text","props":{"text":"通用计算型 | Si2.large.2 | 2vCPUs | 4 GiB","style":"font-weight: 700;"},"id":"87723f52"}]}]}],"id":"657fb2fc"}],"id":"d19b15cf"}],"id":"9991228b"},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"镜像","style":"border-radius: 0px;"},"children":[{"componentName":"TinyButtonGroup","props":{"data":[{"text":"公共镜像","value":"1"},{"text":"私有镜像","value":"2"},{"text":"共享镜像","value":"3"}],"modelValue":"1"},"id":"922b14cb"},{"componentName":"div","props":{"style":"display: flex; margin-top: 12px; border-radius: 0px;"},"id":"6b679524","children":[{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 170px; margin-right: 10px;"},"id":"4851fff7"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 340px;"},"id":"a7183eb7"}]},{"componentName":"div","props":{"style":"margin-top: 12px;"},"id":"57aee314","children":[{"componentName":"Text","props":{"text":"请注意操作系统的语言类型。","style":"color: #e37d29;"},"id":"56d36c27"}]}],"id":"e3b02436"}],"id":"59aebf2b"}],"id":"87ff7b99"},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"系统盘","style":"border-radius: 0px;"},"children":[{"componentName":"div","props":{"style":"display: flex;"},"id":"cddba5b8","children":[{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 200px; margin-right: 10px;"},"id":"a97fbe15"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px; margin-right: 10px;"},"id":"1cde4c0f"},{"componentName":"Text","props":{"text":"GiB \nIOPS上限240,IOPS突发上限5,000","style":"color: #575d6c; font-size: 12px;"},"id":"2815d82d"}]}],"id":"50239a3a"}],"id":"e8582986"},{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[{"componentName":"TinyFormItem","props":{"label":"数据盘","style":"border-radius: 0px;"},"children":[{"componentName":"div","props":{"style":"margin-top: 12px; display: flex;"},"id":"728c9825","children":[{"componentName":"Icon","props":{"style":"margin-right: 10px; width: 16px; height: 16px;","name":"IconPanelMini"},"id":"fded6930"},{"componentName":"TinySelect","props":{"modelValue":"","placeholder":"请选择","options":[{"value":"1","label":"黄金糕"},{"value":"2","label":"双皮奶"}],"style":"width: 200px; margin-right: 10px;"},"id":"62734e3f"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px; margin-right: 10px;"},"id":"667c7926"},{"componentName":"Text","props":{"text":"GiB \nIOPS上限600,IOPS突发上限5,000","style":"color: #575d6c; font-size: 12px; margin-right: 10px;"},"id":"e7bc36d6"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px;"},"id":"1bd56dc0"}],"loop":{"type":"JSExpression","value":"this.state.dataDisk"}},{"componentName":"div","props":{"style":"display: flex; margin-top: 12px; border-radius: 0px;"},"children":[{"componentName":"Icon","props":{"name":"IconPlus","style":"width: 16px; height: 16px; margin-right: 10px;"},"id":"65c89f2b"},{"componentName":"Text","props":{"text":"增加一块数据盘","style":"font-size: 12px; border-radius: 0px; margin-right: 10px;"},"id":"cb344071"},{"componentName":"Text","props":{"text":"您还可以挂载 21 块磁盘(云硬盘)","style":"color: #8a8e99; font-size: 12px;"},"id":"80eea996"}],"id":"e9e530ab"}],"id":"078e03ef"}],"id":"ccef886e"}],"id":"0fb7bd74"},{"componentName":"div","props":{"style":"border-width: 1px; border-style: solid; border-color: #ffffff; padding-top: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; position: fixed; inset: auto 0% 0% 0%; height: 80px; line-height: 80px; border-radius: 0px;"},"children":[{"componentName":"TinyForm","props":{"labelWidth":"80px","labelPosition":"top","inline":false,"label-position":"left ","label-width":"150px","style":"border-radius: 0px;"},"children":[],"id":"21ed4475"},{"componentName":"TinyRow","props":{"style":"border-radius: 0px; height: 100%;"},"children":[{"componentName":"TinyCol","props":{"span":"8"},"id":"b9d051a5","children":[{"componentName":"TinyRow","props":{"style":"border-radius: 0px;"},"children":[{"componentName":"TinyCol","props":{"span":"5","style":"display: flex;"},"id":"02352776","children":[{"componentName":"Text","props":{"text":"购买量","style":"margin-right: 10px;"},"id":"0cd9ed5c"},{"componentName":"TinyInput","props":{"placeholder":"请输入","modelValue":"","style":"width: 120px; margin-right: 10px;"},"id":"2f9cf442"},{"componentName":"Text","props":{"text":"台"},"id":"facd4481"}]},{"componentName":"TinyCol","props":{"span":"7"},"id":"82b6c659","children":[{"componentName":"div","props":{},"id":"9cd65874","children":[{"componentName":"Text","props":{"text":"配置费用","style":"font-size: 12px;"},"id":"b5a0a0da"},{"componentName":"Text","props":{"text":"¥1.5776","style":"padding-left: 10px; padding-right: 10px; color: #de504e;"},"id":"d9464214"},{"componentName":"Text","props":{"text":"/小时","style":"font-size: 12px;"},"id":"af7cc5e6"}]},{"componentName":"div","props":{},"id":"89063830","children":[{"componentName":"Text","props":{"text":"参考价格,具体扣费请以账单为准。","style":"font-size: 12px; border-radius: 0px;"},"id":"d8995fbc"},{"componentName":"Text","props":{"text":"了解计费详情","style":"font-size: 12px; color: #344899;"},"id":"b383c3e2"}]}]}],"id":"94fc0e43"}]},{"componentName":"TinyCol","props":{"span":"4","style":"display: flex; flex-direction: row-reverse; border-radius: 0px; height: 100%; justify-content: flex-start; align-items: center;"},"id":"10b73009","children":[{"componentName":"TinyButton","props":{"text":"下一步: 网络配置","type":"danger","style":"max-width: unset;"},"id":"0b584011"}]}],"id":"d414a473"}],"id":"e8ec029b"}],"fileName":"createVm"},"tenant":1,"isBody":false,"parentId":"0","group":"staticPages","depth":0,"isPage":true,"isDefault":false,"occupier":{"id":86,"username":"开发者","email":"developer@lowcode.com","resetPasswordToken":"developer","confirmationToken":"dfb2c162-351f-4f44-ad5f-8998","is_admin":true},"isHome":false,"_id":"NTJ4MjvqoVj8OVsc"} +{"$$indexCreated":{"fieldName":"route","unique":true,"sparse":false}} +{"$$indexCreated":{"fieldName":"route","unique":true}} diff --git a/dl-flow-frontend/mockServer/src/middleware/ErrorRoutesCatch.js b/dl-flow-frontend/mockServer/src/middleware/ErrorRoutesCatch.js new file mode 100644 index 0000000..b1d4244 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/middleware/ErrorRoutesCatch.js @@ -0,0 +1,22 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const { getResponseData } = require('../tool/Common') + +module.exports = function () { + return function (ctx, next) { + return next().catch((err) => { + ctx.status = 200 + ctx.body = getResponseData(null, err) + }) + } +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/detail/918.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/detail/918.json new file mode 100644 index 0000000..efd46d5 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/detail/918.json @@ -0,0 +1,78 @@ +{ + "data": { + "id": 918, + "name": "portal-app", + "app_website": null, + "platform": { + "id": 897, + "name": "portal-platform" + }, + "obs_url": "", + "created_by": null, + "updated_by": null, + "created_at": "2022-06-08T07:19:01.000Z", + "updated_at": "2023-09-04T08:55:40.000Z", + "state": null, + "published": false, + "createdBy": 86, + "updatedBy": 564, + "tenant": 1, + "home_page": "NTJ4MjvqoVj8OVsc", + "css": null, + "config": {}, + "git_group": "", + "project_name": "", + "constants": null, + "data_handler": { + "type": "JSFunction", + "value": "function dataHanlder(res){\n return res;\n}" + }, + "description": "demo应用", + "latest": 22, + "platform_history": null, + "editor_url": "", + "branch": "develop", + "visit_url": null, + "is_demo": null, + "image_url": "", + "is_default": true, + "template_type": null, + "set_template_time": null, + "set_template_by": null, + "set_default_by": 169, + "framework": "Vue", + "global_state": [], + "default_lang": null, + "extend_config": { + "business": { + "serviceName": "", + "endpointName": "cce", + "endpointId": "ee", + "serviceId": "ee", + "router": "ee" + }, + "env": { + "alpha": { + "regions": [ + { + "name": "", + "baseUrl": "", + "isDefault": false + } + ], + "isDefault": true + } + }, + "type": "console" + }, + "assets_url": "", + "data_hash": "ae128e37f6bc378f1b9c21d75bd05551", + "can_associate": true, + "data_source_global": { + "dataHandler": { + "type": "JSFunction", + "value": "function dataHanlder(res){\n return res;\n}" + } + } + } +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/extension/delete.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/extension/delete.json new file mode 100644 index 0000000..a41dcbb --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/extension/delete.json @@ -0,0 +1,20 @@ +{ + "data": { + "id": 245824, + "name": "Input", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Input", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_at": "2023-09-04T08:32:38.000Z", + "updated_at": "2023-09-04T08:32:38.000Z" + }, + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/extension/list.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/extension/list.json new file mode 100644 index 0000000..d3f2008 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/apps/extension/list.json @@ -0,0 +1,127 @@ +{ + "data": [ + { + "id": 176, + "name": "axios", + "type": "npm", + "content": { + "type": "JSFunction", + "value": "", + "package": "axios", + "destructuring": false, + "exportName": "axios" + }, + "app": 918, + "category": "utils", + "created_at": "2022-10-27T11:02:26.000Z", + "updated_at": "2022-10-27T11:02:26.000Z" + }, + { + "id": 104, + "name": "Button", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Button", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_at": "2022-07-06T10:17:31.000Z", + "updated_at": "2022-07-06T10:17:31.000Z" + }, + { + "id": 101, + "name": "Menu", + "type": "npm", + "content": { + "type": "JSFunction", + "value": "", + "package": "@opentiny/vue", + "exportName": "NavMenu", + "destructuring": true + }, + "app": 918, + "category": "utils", + "created_at": "2022-06-24T06:40:52.000Z", + "updated_at": "2022-06-24T08:03:13.000Z" + }, + { + "id": 103, + "name": "Modal ", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Modal ", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_at": "2022-07-01T03:21:19.000Z", + "updated_at": "2022-07-01T03:21:19.000Z" + }, + { + "id": 146, + "name": "npm", + "type": "function", + "content": { + "type": "JSFunction", + "value": "''" + }, + "app": 918, + "category": "utils", + "created_at": "2022-08-29T06:54:02.000Z", + "updated_at": "2023-01-05T01:00:52.000Z" + }, + { + "id": 102, + "name": "Pager", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Pager", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_at": "2022-06-28T08:17:38.000Z", + "updated_at": "2023-03-21T12:13:04.000Z" + }, + { + "id": 106, + "name": "test", + "type": "function", + "content": { + "type": "JSFunction", + "value": "function test() {\r\n return 'test'\r\n}" + }, + "app": 918, + "category": "utils", + "created_at": "2022-07-06T10:21:02.000Z", + "updated_at": "2023-03-21T12:12:49.000Z" + }, + { + "id": 97, + "name": "util", + "type": "function", + "content": { + "type": "JSFunction", + "value": "function util () {\r\n console.log(321)\r\n}" + }, + "app": 918, + "category": "utils", + "created_at": "2022-06-23T11:13:07.000Z", + "updated_at": "2023-04-06T02:31:44.000Z" + } + ], + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/i18n/entries.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/i18n/entries.json new file mode 100644 index 0000000..84127ff --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/i18n/entries.json @@ -0,0 +1,33 @@ +{ + "data": { + "locales": [ + { + "lang": "en_US", + "label": "美式英文" + }, + { + "lang": "zh_CN", + "label": "简体中文" + } + ], + "messages": { + "en_US": { + "lowcode.c257d5e8": "search", + "lowcode.61c8ac8c": "testi18n", + "lowcode.f53187a0": "test", + "lowcode.97ad00dd": "createMaterial", + "common.index.fullName": "zhangsan", + "other.utileName": "getName" + }, + "zh_CN": { + "lowcode.c257d5e8": "查询", + "lowcode.61c8ac8c": "地方", + "lowcode.f53187a0": "测试", + "lowcode.97ad00dd": "创建物料资产包", + "common.index.fullName": "张三", + "other.utileName": "获取名称" + } + } + }, + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/source_tpl.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/source_tpl.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/source_tpl.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/sources/list/918.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/sources/list/918.json new file mode 100644 index 0000000..6329279 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/sources/list/918.json @@ -0,0 +1,671 @@ +{ + "data": [ + { + "id": 132, + "name": "getAllComponent", + "data": { + "data": [], + "type": "array" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T06:26:26.000Z", + "updated_at": "2022-06-28T07:02:30.000Z" + }, + { + "id": 133, + "name": "getAllList", + "data": { + "columns": [ + { + "name": "test", + "title": "测试", + "field": "test", + "type": "string", + "format": {} + }, + { + "name": "test1", + "title": "测试1", + "field": "test1", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "test": "test1", + "test1": "test1", + "_id": "341efc48" + }, + { + "test": "test2", + "test1": "test1", + "_id": "b86b516c" + }, + { + "test": "test3", + "test1": "test1", + "_id": "f680cd78" + } + ], + "options": { + "uri": "", + "method": "GET" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T07:32:16.000Z", + "updated_at": "2023-01-19T03:29:11.000Z" + }, + { + "id": 135, + "name": "getAllMaterialList", + "data": { + "columns": [ + { + "name": "id", + "title": "id", + "field": "id", + "type": "string", + "format": {} + }, + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": {} + }, + { + "name": "framework", + "title": "framework", + "field": "framework", + "type": "string", + "format": { + "required": true + } + }, + { + "name": "components", + "title": "components", + "field": "components", + "type": "string", + "format": {} + }, + { + "name": "content", + "title": "content", + "field": "content", + "type": "string", + "format": {} + }, + { + "name": "url", + "title": "url", + "field": "url", + "type": "string", + "format": {} + }, + { + "name": "published_at", + "title": "published_at", + "field": "published_at", + "type": "string", + "format": {} + }, + { + "name": "created_at", + "title": "created_at", + "field": "created_at", + "type": "string", + "format": {} + }, + { + "name": "updated_at", + "title": "updated_at", + "field": "updated_at", + "type": "string", + "format": {} + }, + { + "name": "published", + "title": "published", + "field": "published", + "type": "string", + "format": {} + }, + { + "name": "last_build_info", + "title": "last_build_info", + "field": "last_build_info", + "type": "string", + "format": {} + }, + { + "name": "tenant", + "title": "tenant", + "field": "tenant", + "type": "string", + "format": {} + }, + { + "name": "version", + "title": "version", + "field": "version", + "type": "string", + "format": {} + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "2a23e653" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "06b253be" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "c55a41ed" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "f37123ec" + }, + { + "id": "7a63c1a2", + "url": "", + "name": "tiny-vue", + "tenant": "", + "content": "Tiny Vue物料", + "version": "1.0.0", + "framework": "Vue", + "published": "", + "components": "", + "created_at": "", + "updated_at": "", + "description": "Tiny Vue物料", + "published_at": "", + "last_build_info": "", + "_id": "7a63c1a2" + } + ], + "options": { + "uri": "", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-29T00:57:50.000Z", + "updated_at": "2023-05-15T02:37:12.000Z" + }, + { + "id": 139, + "name": "treedata", + "data": { + "data": [ + { + "label": "level111", + "value": "111", + "id": "f6609643", + "pid": "", + "_RID": "row_4" + }, + { + "label": "level1-son", + "value": "111-1", + "id": "af1f937f", + "pid": "f6609643", + "_RID": "row_5" + }, + { + "label": "level222", + "value": "222", + "id": "28e3709c", + "pid": "", + "_RID": "row_6" + }, + { + "label": "level2-son", + "value": "222-1", + "id": "6b571bef", + "pid": "28e3709c", + "_RID": "row_5" + }, + { + "id": "6317c2cc", + "pid": "fdfa", + "label": "fsdfaa", + "value": "fsadf", + "_RID": "row_6" + }, + { + "id": "9cce369f", + "pid": "test", + "label": "test1", + "value": "001" + } + ], + "type": "tree" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-30T06:13:57.000Z", + "updated_at": "2022-07-29T03:14:55.000Z" + }, + { + "id": 150, + "name": "componentList", + "data": { + "data": [ + { + "_RID": "row_1", + "name": "表单", + "isSelected": "true", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据" + }, + { + "name": "按钮", + "isSelected": "false", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型" + }, + { + "id": "490f8a00", + "_RID": "row_3", + "name": "表单项", + "framework": "", + "materials": "", + "description": "Form 组件下的 FormItem 配置" + }, + { + "id": "c259b8b3", + "_RID": "row_4", + "name": "开关", + "framework": "", + "materials": "", + "description": "关闭或打开" + }, + { + "id": "083ed9c7", + "_RID": "row_5", + "name": "互斥按钮组", + "framework": "", + "materials": "", + "description": "以按钮组的方式出现,常用于多项类似操作" + }, + { + "id": "09136cea", + "_RID": "row_6", + "name": "提示框", + "framework": "", + "materials": "", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画" + }, + { + "id": "a63b57d5", + "_RID": "row_7", + "name": "文字提示框", + "framework": "", + "materials": "", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信" + }, + { + "id": "a0f6e8a3", + "_RID": "row_8", + "name": "树", + "framework": "", + "materials": "", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单" + }, + { + "id": "d1aa18fc", + "_RID": "row_9", + "name": "分页", + "framework": "", + "materials": "", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件" + }, + { + "id": "ca49cc52", + "_RID": "row_10", + "name": "表格", + "framework": "", + "materials": "", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等" + }, + { + "id": "4e20ecc9", + "name": "搜索框", + "framework": "", + "materials": "", + "description": "指定条件对象进行搜索数据" + }, + { + "id": "6b093ee5", + "name": "折叠面板", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "0a09abc0", + "name": "对话框", + "framework": "", + "materials": "", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作" + }, + { + "id": "f814b901", + "name": "标签页签项", + "framework": "", + "materials": "", + "description": "tab页签" + }, + { + "id": "c5ae797c", + "name": "单选", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,在一组备选项中进行单选" + }, + { + "id": "33d0c590", + "_RID": "row_13", + "name": "弹出编辑", + "framework": "", + "materials": "", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件" + }, + { + "id": "16711dfa", + "_RID": "row_14", + "name": "下拉框", + "framework": "", + "materials": "", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件" + }, + { + "id": "a9fd190a", + "_RID": "row_15", + "name": "折叠面板项", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "a7dfa9ec", + "_RID": "row_16", + "name": "复选框", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选" + }, + { + "id": "d4bb8330", + "name": "输入框", + "framework": "", + "materials": "", + "description": "通过鼠标或键盘输入字符" + }, + { + "id": "ced3dc83", + "name": "时间线", + "framework": "", + "materials": "", + "description": "时间线" + } + ], + "type": "array", + "columns": [ + { + "name": "name", + "type": "string", + "field": "name", + "title": "name", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "description", + "type": "string", + "field": "description", + "title": "description", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "isSelected", + "type": "string", + "field": "isSelected", + "title": "isSelected", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + } + ], + "options": { + "uri": "http://localhost:9090/assets/json/bundle.json", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T02:20:07.000Z", + "updated_at": "2022-07-04T06:25:29.000Z" + }, + { + "id": 151, + "name": "selectedComponents", + "data": { + "columns": [ + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "isSelected", + "title": "isSelected", + "field": "isSelected", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + } + ], + "type": "array", + "data": [ + { + "name": "标签页", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "isSelected": "true", + "_RID": "row_2" + }, + { + "name": "布局列", + "description": "列配置信息", + "isSelected": "true", + "id": "76a7080a", + "_RID": "row_4" + }, + { + "name": "日期选择器", + "description": "用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式", + "isSelected": "true", + "id": "76b20d73", + "_RID": "row_1" + }, + { + "name": "走马灯", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现", + "isSelected": "true", + "id": "4c884c3d" + } + ] + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T03:04:05.000Z", + "updated_at": "2022-07-04T03:43:40.000Z" + } + ], + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/app-center/v1/apps/schema/918.json b/dl-flow-frontend/mockServer/src/mock/get/app-center/v1/apps/schema/918.json new file mode 100644 index 0000000..24abb51 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/app-center/v1/apps/schema/918.json @@ -0,0 +1,2096 @@ +{ + "data": { + "meta": { + "name": "portal-app", + "tenant": 1, + "git_group": "", + "project_name": "", + "description": "demo应用", + "branch": "develop", + "is_demo": null, + "global_state": [], + "appId": "918", + "creator": "", + "gmt_create": "2022-06-08 03:19:01", + "gmt_modified": "2023-08-23 10:22:28" + }, + "dataSource": { + "list": [ + { + "id": 132, + "name": "getAllComponent", + "data": { + "data": [], + "type": "array" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T06:26:26.000Z", + "updated_at": "2022-06-28T07:02:30.000Z" + }, + { + "id": 133, + "name": "getAllList", + "data": { + "columns": [ + { + "name": "test", + "title": "测试", + "field": "test", + "type": "string", + "format": {} + }, + { + "name": "test1", + "title": "测试1", + "field": "test1", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "test": "test1", + "test1": "test1", + "_id": "341efc48" + }, + { + "test": "test2", + "test1": "test1", + "_id": "b86b516c" + }, + { + "test": "test3", + "test1": "test1", + "_id": "f680cd78" + } + ], + "options": { + "uri": "", + "method": "GET" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T07:32:16.000Z", + "updated_at": "2023-01-19T03:29:11.000Z" + }, + { + "id": 135, + "name": "getAllMaterialList", + "data": { + "columns": [ + { + "name": "id", + "title": "id", + "field": "id", + "type": "string", + "format": {} + }, + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": {} + }, + { + "name": "framework", + "title": "framework", + "field": "framework", + "type": "string", + "format": { + "required": true + } + }, + { + "name": "components", + "title": "components", + "field": "components", + "type": "string", + "format": {} + }, + { + "name": "content", + "title": "content", + "field": "content", + "type": "string", + "format": {} + }, + { + "name": "url", + "title": "url", + "field": "url", + "type": "string", + "format": {} + }, + { + "name": "published_at", + "title": "published_at", + "field": "published_at", + "type": "string", + "format": {} + }, + { + "name": "created_at", + "title": "created_at", + "field": "created_at", + "type": "string", + "format": {} + }, + { + "name": "updated_at", + "title": "updated_at", + "field": "updated_at", + "type": "string", + "format": {} + }, + { + "name": "published", + "title": "published", + "field": "published", + "type": "string", + "format": {} + }, + { + "name": "last_build_info", + "title": "last_build_info", + "field": "last_build_info", + "type": "string", + "format": {} + }, + { + "name": "tenant", + "title": "tenant", + "field": "tenant", + "type": "string", + "format": {} + }, + { + "name": "version", + "title": "version", + "field": "version", + "type": "string", + "format": {} + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "2a23e653" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "06b253be" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "c55a41ed" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "f37123ec" + }, + { + "id": "7a63c1a2", + "url": "", + "name": "tiny-vue", + "tenant": "", + "content": "Tiny Vue物料", + "version": "1.0.0", + "framework": "Vue", + "published": "", + "components": "", + "created_at": "", + "updated_at": "", + "description": "Tiny Vue物料", + "published_at": "", + "last_build_info": "", + "_id": "7a63c1a2" + } + ], + "options": { + "uri": "", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-29T00:57:50.000Z", + "updated_at": "2023-05-15T02:37:12.000Z" + }, + { + "id": 139, + "name": "treedata", + "data": { + "data": [ + { + "label": "level111", + "value": "111", + "id": "f6609643", + "pid": "", + "_RID": "row_4" + }, + { + "label": "level1-son", + "value": "111-1", + "id": "af1f937f", + "pid": "f6609643", + "_RID": "row_5" + }, + { + "label": "level222", + "value": "222", + "id": "28e3709c", + "pid": "", + "_RID": "row_6" + }, + { + "label": "level2-son", + "value": "222-1", + "id": "6b571bef", + "pid": "28e3709c", + "_RID": "row_5" + }, + { + "id": "6317c2cc", + "pid": "fdfa", + "label": "fsdfaa", + "value": "fsadf", + "_RID": "row_6" + }, + { + "id": "9cce369f", + "pid": "test", + "label": "test1", + "value": "001" + } + ], + "type": "tree" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-30T06:13:57.000Z", + "updated_at": "2022-07-29T03:14:55.000Z" + }, + { + "id": 150, + "name": "componentList", + "data": { + "data": [ + { + "_RID": "row_1", + "name": "表单", + "isSelected": "true", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据" + }, + { + "name": "按钮", + "isSelected": "false", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型" + }, + { + "id": "490f8a00", + "_RID": "row_3", + "name": "表单项", + "framework": "", + "materials": "", + "description": "Form 组件下的 FormItem 配置" + }, + { + "id": "c259b8b3", + "_RID": "row_4", + "name": "开关", + "framework": "", + "materials": "", + "description": "关闭或打开" + }, + { + "id": "083ed9c7", + "_RID": "row_5", + "name": "互斥按钮组", + "framework": "", + "materials": "", + "description": "以按钮组的方式出现,常用于多项类似操作" + }, + { + "id": "09136cea", + "_RID": "row_6", + "name": "提示框", + "framework": "", + "materials": "", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画" + }, + { + "id": "a63b57d5", + "_RID": "row_7", + "name": "文字提示框", + "framework": "", + "materials": "", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信" + }, + { + "id": "a0f6e8a3", + "_RID": "row_8", + "name": "树", + "framework": "", + "materials": "", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单" + }, + { + "id": "d1aa18fc", + "_RID": "row_9", + "name": "分页", + "framework": "", + "materials": "", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件" + }, + { + "id": "ca49cc52", + "_RID": "row_10", + "name": "表格", + "framework": "", + "materials": "", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等" + }, + { + "id": "4e20ecc9", + "name": "搜索框", + "framework": "", + "materials": "", + "description": "指定条件对象进行搜索数据" + }, + { + "id": "6b093ee5", + "name": "折叠面板", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "0a09abc0", + "name": "对话框", + "framework": "", + "materials": "", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作" + }, + { + "id": "f814b901", + "name": "标签页签项", + "framework": "", + "materials": "", + "description": "tab页签" + }, + { + "id": "c5ae797c", + "name": "单选", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,在一组备选项中进行单选" + }, + { + "id": "33d0c590", + "_RID": "row_13", + "name": "弹出编辑", + "framework": "", + "materials": "", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件" + }, + { + "id": "16711dfa", + "_RID": "row_14", + "name": "下拉框", + "framework": "", + "materials": "", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件" + }, + { + "id": "a9fd190a", + "_RID": "row_15", + "name": "折叠面板项", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "a7dfa9ec", + "_RID": "row_16", + "name": "复选框", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选" + }, + { + "id": "d4bb8330", + "name": "输入框", + "framework": "", + "materials": "", + "description": "通过鼠标或键盘输入字符" + }, + { + "id": "ced3dc83", + "name": "时间线", + "framework": "", + "materials": "", + "description": "时间线" + } + ], + "type": "array", + "columns": [ + { + "name": "name", + "type": "string", + "field": "name", + "title": "name", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "description", + "type": "string", + "field": "description", + "title": "description", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "isSelected", + "type": "string", + "field": "isSelected", + "title": "isSelected", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + } + ], + "options": { + "uri": "http://localhost:9090/assets/json/bundle.json", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T02:20:07.000Z", + "updated_at": "2022-07-04T06:25:29.000Z" + }, + { + "id": 151, + "name": "selectedComponents", + "data": { + "columns": [ + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "isSelected", + "title": "isSelected", + "field": "isSelected", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + } + ], + "type": "array", + "data": [ + { + "name": "标签页", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "isSelected": "true", + "_RID": "row_2" + }, + { + "name": "布局列", + "description": "列配置信息", + "isSelected": "true", + "id": "76a7080a", + "_RID": "row_4" + }, + { + "name": "日期选择器", + "description": "用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式", + "isSelected": "true", + "id": "76b20d73", + "_RID": "row_1" + }, + { + "name": "走马灯", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现", + "isSelected": "true", + "id": "4c884c3d" + } + ] + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T03:04:05.000Z", + "updated_at": "2022-07-04T03:43:40.000Z" + } + ], + "dataHandler": { + "type": "JSFunction", + "value": "function dataHanlder(res){\n return res;\n}" + } + }, + "i18n": { + "zh_CN": { + "lowcode.cca8d0ea": "应用", + "lowcode.c257d5e8": "查询", + "lowcode.61c8ac8c": "地方", + "lowcode.f53187a0": "测试", + "lowcode.97ad00dd": "创建物料资产包", + "lowcode.61dcef52": "terterere", + "lowcode.45f4c42a": "gdfgdf", + "lowcode.c6f5a652": "fsdaf", + "lowcode.34923432": "fdsafdsa", + "lowcode.48521e45": "fdsfds", + "lowcode.6534943e": "fdsafds", + "lowcode.44252642": "fdsafds", + "lowcode.2a743651": "sda", + "lowcode.24315357": "fdsafds", + "lowcode.44621691": "fdsafsd", + "lowcode.65636226": "fdsaf", + "lowcode.6426a4e2": "sd", + "lowcode.e41c6636": "aa", + "lowcode.51c23164": "aa", + "lowcode.17245b46": "aa", + "lowcode.4573143c": "aa", + "lowcode.56432442": "aa", + "lowcode.33566643": "aa", + "lowcode.565128f3": "aa", + "lowcode.56643835": "aa", + "lowcode.33311134": "aa", + "lowcode.44326643": "aa", + "lowcode.36223242": "aa" + }, + "en_US": { + "lowcode.cca8d0ea": "app", + "lowcode.c257d5e8": "search", + "lowcode.61c8ac8c": "dsdsa", + "lowcode.f53187a0": "test", + "lowcode.97ad00dd": "createMaterial", + "lowcode.61dcef52": "sadasda", + "lowcode.45f4c42a": "gfdgfd", + "lowcode.c6f5a652": "fsdafds", + "lowcode.34923432": "fdsafds", + "lowcode.6534943e": "fdsafdsa", + "lowcode.44252642": "aaaa", + "lowcode.2a743651": "fdsaf", + "lowcode.24315357": "fsdafds", + "lowcode.44621691": "sd", + "lowcode.65636226": "fdsfsd", + "lowcode.6426a4e2": "fdsafsd", + "lowcode.e41c6636": "aa", + "lowcode.51c23164": "aa", + "lowcode.17245b46": "aa", + "lowcode.4573143c": "a", + "lowcode.56432442": "aa", + "lowcode.33566643": "aa", + "lowcode.565128f3": "aa", + "lowcode.56643835": "aa", + "lowcode.33311134": "aa", + "lowcode.44326643": "aa", + "lowcode.36223242": "aa" + } + }, + "componentsTree": [ + { + "state": { + "dataDisk": [1, 2, 3] + }, + "methods": {}, + "componentName": "Page", + "css": "body {\r\n background-color:#eef0f5 ;\r\n margin-bottom: 80px;\r\n}", + "props": {}, + "children": [ + { + "componentName": "div", + "props": { + "style": "padding-bottom: 10px; padding-top: 10px;" + }, + "id": "2b2cabf0", + "children": [ + { + "componentName": "TinyTimeLine", + "props": { + "active": "2", + "data": [ + { + "name": "基础配置" + }, + { + "name": "网络配置" + }, + { + "name": "高级配置" + }, + { + "name": "确认配置" + } + ], + "horizontal": true, + "style": "border-radius: 0px;" + }, + "id": "dd764b17" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "id": "30c94cc8", + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "计费模式" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "包年/包月", + "value": "1" + }, + { + "text": "按需计费", + "value": "2" + } + ], + "modelValue": "1" + }, + "id": "a8d84361" + } + ], + "id": "9f39f3e7" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "区域" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "乌兰察布二零一", + "value": "1" + } + ], + "modelValue": "1", + "style": "border-radius: 0px; margin-right: 10px;" + }, + "id": "c97ccd99" + }, + { + "componentName": "Text", + "props": { + "text": "温馨提示:页面左上角切换区域", + "style": "background-color: [object Event]; color: #8a8e99; font-size: 12px;" + }, + "id": "20923497" + }, + { + "componentName": "Text", + "props": { + "text": "不同区域的云服务产品之间内网互不相通;请就近选择靠近您业务的区域,可减少网络时延,提高访问速度", + "style": "display: block; color: #8a8e99; border-radius: 0px; font-size: 12px;" + }, + "id": "54780a26" + } + ], + "id": "4966384d" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "可用区", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "可用区1", + "value": "1" + }, + { + "text": "可用区2", + "value": "2" + }, + { + "text": "可用区3", + "value": "3" + } + ], + "modelValue": "1" + }, + "id": "6184481b" + } + ], + "id": "690837bf" + } + ], + "id": "b6a425d4" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "CPU架构" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "x86计算", + "value": "1" + }, + { + "text": "鲲鹏计算", + "value": "2" + } + ], + "modelValue": "1" + }, + "id": "7d33ced7" + } + ], + "id": "05ed5a79" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "区域" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex; justify-content: flex-start; align-items: center;" + }, + "id": "606edf78", + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex; align-items: center; margin-right: 10px;" + }, + "id": "f3f98246", + "children": [ + { + "componentName": "Text", + "props": { + "text": "vCPUs", + "style": "width: 80px;" + }, + "id": "c287437e" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ] + }, + "id": "4c43286b" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "display: flex; align-items: center; margin-right: 10px;" + }, + "children": [ + { + "componentName": "Text", + "props": { + "text": "内存", + "style": "width: 80px; border-radius: 0px;" + }, + "id": "38b8fa1f" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ] + }, + "id": "cd33328e" + } + ], + "id": "2b2c678f" + }, + { + "componentName": "div", + "props": { + "style": "display: flex; align-items: center;" + }, + "children": [ + { + "componentName": "Text", + "props": { + "text": "规格名称", + "style": "width: 80px;" + }, + "id": "d3eb6352" + }, + { + "componentName": "TinySearch", + "props": { + "modelValue": "", + "placeholder": "输入关键词" + }, + "id": "21cb9282" + } + ], + "id": "b8e0f35c" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "border-radius: 0px;" + }, + "id": "5000c83e", + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "通用计算型", + "value": "1" + }, + { + "text": "通用计算增强型", + "value": "2" + }, + { + "text": "内存优化型", + "value": "3" + }, + { + "text": "内存优化型", + "value": "4" + }, + { + "text": "磁盘增强型", + "value": "5" + }, + { + "text": "超高I/O型", + "value": "6" + }, + { + "text": "GPU加速型", + "value": "7" + } + ], + "modelValue": "1", + "style": "border-radius: 0px; margin-top: 12px;" + }, + "id": "b8724703" + }, + { + "componentName": "TinyGrid", + "props": { + "editConfig": { + "trigger": "click", + "mode": "cell", + "showStatus": true + }, + "columns": [ + { + "type": "radio", + "width": 60 + }, + { + "field": "employees", + "title": "规格名称" + }, + { + "field": "created_date", + "title": "vCPUs | 内存(GiB)", + "sortable": true + }, + { + "field": "city", + "title": "CPU", + "sortable": true + }, + { + "title": "基准 / 最大带宽\t", + "sortable": true + }, + { + "title": "内网收发包", + "sortable": true + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司", + "city": "福州", + "employees": 800, + "created_date": "2014-04-30 00:56:00", + "boole": false + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "employees": 300, + "created_date": "2016-07-08 12:36:22", + "boole": true + } + ], + "style": "margin-top: 12px; border-radius: 0px;", + "auto-resize": true + }, + "id": "77701c25" + }, + { + "componentName": "div", + "props": { + "style": "margin-top: 12px; border-radius: 0px;" + }, + "id": "3339838b", + "children": [ + { + "componentName": "Text", + "props": { + "text": "当前规格", + "style": "width: 150px; display: inline-block;" + }, + "id": "203b012b" + }, + { + "componentName": "Text", + "props": { + "text": "通用计算型 | Si2.large.2 | 2vCPUs | 4 GiB", + "style": "font-weight: 700;" + }, + "id": "87723f52" + } + ] + } + ] + } + ], + "id": "657fb2fc" + } + ], + "id": "d19b15cf" + } + ], + "id": "9991228b" + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "镜像", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "公共镜像", + "value": "1" + }, + { + "text": "私有镜像", + "value": "2" + }, + { + "text": "共享镜像", + "value": "3" + } + ], + "modelValue": "1" + }, + "id": "922b14cb" + }, + { + "componentName": "div", + "props": { + "style": "display: flex; margin-top: 12px; border-radius: 0px;" + }, + "id": "6b679524", + "children": [ + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 170px; margin-right: 10px;" + }, + "id": "4851fff7" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 340px;" + }, + "id": "a7183eb7" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "margin-top: 12px;" + }, + "id": "57aee314", + "children": [ + { + "componentName": "Text", + "props": { + "text": "请注意操作系统的语言类型。", + "style": "color: #e37d29;" + }, + "id": "56d36c27" + } + ] + } + ], + "id": "e3b02436" + } + ], + "id": "59aebf2b" + } + ], + "id": "87ff7b99" + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "系统盘", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex;" + }, + "id": "cddba5b8", + "children": [ + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 200px; margin-right: 10px;" + }, + "id": "a97fbe15" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px; margin-right: 10px;" + }, + "id": "1cde4c0f" + }, + { + "componentName": "Text", + "props": { + "text": "GiB \nIOPS上限240,IOPS突发上限5,000", + "style": "color: #575d6c; font-size: 12px;" + }, + "id": "2815d82d" + } + ] + } + ], + "id": "50239a3a" + } + ], + "id": "e8582986" + }, + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "数据盘", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "margin-top: 12px; display: flex;" + }, + "id": "728c9825", + "children": [ + { + "componentName": "Icon", + "props": { + "style": "margin-right: 10px; width: 16px; height: 16px;", + "name": "IconPanelMini" + }, + "id": "fded6930" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 200px; margin-right: 10px;" + }, + "id": "62734e3f" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px; margin-right: 10px;" + }, + "id": "667c7926" + }, + { + "componentName": "Text", + "props": { + "text": "GiB \nIOPS上限600,IOPS突发上限5,000", + "style": "color: #575d6c; font-size: 12px; margin-right: 10px;" + }, + "id": "e7bc36d6" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px;" + }, + "id": "1bd56dc0" + } + ], + "loop": { + "type": "JSExpression", + "value": "this.state.dataDisk" + } + }, + { + "componentName": "div", + "props": { + "style": "display: flex; margin-top: 12px; border-radius: 0px;" + }, + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconPlus", + "style": "width: 16px; height: 16px; margin-right: 10px;" + }, + "id": "65c89f2b" + }, + { + "componentName": "Text", + "props": { + "text": "增加一块数据盘", + "style": "font-size: 12px; border-radius: 0px; margin-right: 10px;" + }, + "id": "cb344071" + }, + { + "componentName": "Text", + "props": { + "text": "您还可以挂载 21 块磁盘(云硬盘)", + "style": "color: #8a8e99; font-size: 12px;" + }, + "id": "80eea996" + } + ], + "id": "e9e530ab" + } + ], + "id": "078e03ef" + } + ], + "id": "ccef886e" + } + ], + "id": "0fb7bd74" + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-color: #ffffff; padding-top: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; position: fixed; inset: auto 0% 0% 0%; height: 80px; line-height: 80px; border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [], + "id": "21ed4475" + }, + { + "componentName": "TinyRow", + "props": { + "style": "border-radius: 0px; height: 100%;" + }, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": "8" + }, + "id": "b9d051a5", + "children": [ + { + "componentName": "TinyRow", + "props": { + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": "5", + "style": "display: flex;" + }, + "id": "02352776", + "children": [ + { + "componentName": "Text", + "props": { + "text": "购买量", + "style": "margin-right: 10px;" + }, + "id": "0cd9ed5c" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px; margin-right: 10px;" + }, + "id": "2f9cf442" + }, + { + "componentName": "Text", + "props": { + "text": "台" + }, + "id": "facd4481" + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": "7" + }, + "id": "82b6c659", + "children": [ + { + "componentName": "div", + "props": {}, + "id": "9cd65874", + "children": [ + { + "componentName": "Text", + "props": { + "text": "配置费用", + "style": "font-size: 12px;" + }, + "id": "b5a0a0da" + }, + { + "componentName": "Text", + "props": { + "text": "¥1.5776", + "style": "padding-left: 10px; padding-right: 10px; color: #de504e;" + }, + "id": "d9464214" + }, + { + "componentName": "Text", + "props": { + "text": "/小时", + "style": "font-size: 12px;" + }, + "id": "af7cc5e6" + } + ] + }, + { + "componentName": "div", + "props": {}, + "id": "89063830", + "children": [ + { + "componentName": "Text", + "props": { + "text": "参考价格,具体扣费请以账单为准。", + "style": "font-size: 12px; border-radius: 0px;" + }, + "id": "d8995fbc" + }, + { + "componentName": "Text", + "props": { + "text": "了解计费详情", + "style": "font-size: 12px; color: #344899;" + }, + "id": "b383c3e2" + } + ] + } + ] + } + ], + "id": "94fc0e43" + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": "4", + "style": "display: flex; flex-direction: row-reverse; border-radius: 0px; height: 100%; justify-content: flex-start; align-items: center;" + }, + "id": "10b73009", + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "下一步: 网络配置", + "type": "danger", + "style": "max-width: unset;" + }, + "id": "0b584011" + } + ] + } + ], + "id": "d414a473" + } + ], + "id": "e8ec029b" + } + ], + "fileName": "createVm", + "meta": { + "id": 1977, + "parentId": "0", + "group": "staticPages", + "occupier": { + "id": 86, + "username": "开发者", + "email": "developer@lowcode.com", + "provider": null, + "password": null, + "resetPasswordToken": "developer", + "confirmationToken": "dfb2c162-351f-4f44-ad5f-899831311129", + "confirmed": true, + "blocked": null, + "role": null, + "created_by": null, + "updated_by": null, + "created_at": "2022-05-27T16:50:44.000Z", + "updated_at": "2022-05-27T16:50:44.000Z", + "block": null, + "is_admin": true, + "is_public": null + }, + "isHome": false, + "router": "createVm", + "rootElement": "div", + "creator": "", + "gmt_create": "2022-07-21 03:08:20", + "gmt_modified": "2022-07-21 05:18:26" + } + } + ], + "componentsMap": [ + { + "componentName": "TinyCarouselItem", + "package": "@opentiny/vue", + "exportName": "CarouselItem", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyCheckboxButton", + "package": "@opentiny/vue", + "exportName": "CheckboxButton", + "destructuring": true, + "version": "0.1.17" + }, + { + "componentName": "TinyTree", + "package": "@opentiny/vue", + "exportName": "Tree", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyPopover", + "package": "@opentiny/vue", + "exportName": "Popover", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyTooltip", + "package": "@opentiny/vue", + "exportName": "Tooltip", + "destructuring": true, + "version": "3.2.0" + }, + { + "componentName": "TinyCol", + "package": "@opentiny/vue", + "exportName": "Col", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyDropdownItem", + "package": "@opentiny/vue", + "exportName": "DropdownItem", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyPager", + "package": "@opentiny/vue", + "exportName": "Pager", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyPlusAccessdeclined", + "package": "@opentiny/vue", + "exportName": "AccessDeclined", + "destructuring": true, + "version": "3.4.1" + }, + { + "componentName": "TinyPlusFrozenPage", + "package": "@opentiny/vuee", + "exportName": "FrozenPage", + "destructuring": true, + "version": "3.4.1" + }, + { + "componentName": "TinyPlusNonSupportRegion", + "package": "@opentiny/vue", + "exportName": "NonSupportRegion", + "destructuring": true, + "version": "3.4.1" + }, + { + "componentName": "TinyPlusBeta", + "package": "@opentiny/vue", + "exportName": "Beta", + "destructuring": true, + "version": "3.4.1" + }, + { + "componentName": "TinySearch", + "package": "@opentiny/vue", + "exportName": "Search", + "destructuring": true, + "version": "0.1.13" + }, + { + "componentName": "TinyRow", + "package": "@opentiny/vue", + "exportName": "Row", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyFormItem", + "package": "@opentiny/vue", + "exportName": "FormItem", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyAlert", + "package": "@opentiny/vue", + "exportName": "Alert", + "destructuring": true, + "version": "3.2.0" + }, + { + "componentName": "TinyInput", + "package": "@opentiny/vue", + "exportName": "Input", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyTabs", + "package": "@opentiny/vue", + "exportName": "Tabs", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyDropdownMenu", + "package": "@opentiny/vue", + "exportName": "DropdownMenu", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyDialogBox", + "package": "@opentiny/vue", + "exportName": "DialogBox", + "destructuring": true, + "version": "3.2.0" + }, + { + "componentName": "TinySwitch", + "package": "@opentiny/vue", + "exportName": "Switch", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyTimeLine", + "package": "@opentiny/vue", + "exportName": "TimeLine", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyTabItem", + "package": "@opentiny/vue", + "exportName": "TabItem", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyRadio", + "package": "@opentiny/vue", + "exportName": "Radio", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyForm", + "package": "@opentiny/vue", + "exportName": "Form", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyGrid", + "package": "@opentiny/vue", + "exportName": "Grid", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyNumeric", + "package": "@opentiny/vue", + "exportName": "Numeric", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyCheckboxGroup", + "package": "@opentiny/vue", + "exportName": "CheckboxGroup", + "destructuring": true, + "version": "0.1.17" + }, + { + "componentName": "TinySelect", + "package": "@opentiny/vue", + "exportName": "Select", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyButtonGroup", + "package": "@opentiny/vue", + "exportName": "ButtonGroup", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyCarousel", + "package": "@opentiny/vue", + "exportName": "Carousel", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyPopeditor", + "package": "@opentiny/vue", + "exportName": "Popeditor", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyDatePicker", + "package": "@opentiny/vue", + "exportName": "DatePicker", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "TinyDropdown", + "package": "@opentiny/vue", + "exportName": "Dropdown", + "destructuring": true, + "version": "0.1.20" + }, + { + "componentName": "TinyChartHistogram", + "package": "@opentiny/vue", + "exportName": "ChartHistogram", + "destructuring": true, + "version": "0.1.16" + }, + { + "componentName": "PortalHome", + "main": "common/components/home", + "destructuring": false, + "version": "1.0.0" + }, + { + "componentName": "PreviewBlock1", + "main": "preview", + "destructuring": false, + "version": "1.0.0" + }, + { + "componentName": "PortalHeader", + "main": "common", + "destructuring": false, + "version": "1.0.0" + }, + { + "componentName": "PortalBlock", + "main": "portal", + "destructuring": false, + "version": "1.0.0" + }, + { + "componentName": "PortalPermissionBlock", + "main": "", + "destructuring": false, + "version": "1.0.0" + } + ], + "bridge": [], + "utils": [ + { + "name": "axios", + "type": "npm", + "content": { + "type": "JSFunction", + "value": "", + "package": "axios", + "destructuring": false, + "exportName": "axios" + } + }, + { + "name": "Button", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Button", + "subName": "", + "destructuring": true, + "main": "" + } + }, + { + "name": "Menu", + "type": "npm", + "content": { + "type": "JSFunction", + "value": "", + "package": "@opentiny/vue", + "exportName": "NavMenu", + "destructuring": true + } + }, + { + "name": "Modal ", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Modal ", + "subName": "", + "destructuring": true, + "main": "" + } + }, + { + "name": "npm", + "type": "function", + "content": { + "type": "JSFunction", + "value": "''" + } + }, + { + "name": "Pager", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Pager", + "subName": "", + "destructuring": true, + "main": "" + } + }, + { + "name": "test", + "type": "function", + "content": { + "type": "JSFunction", + "value": "function test() {\r\n return 'test'\r\n}" + } + }, + { + "name": "util", + "type": "function", + "content": { + "type": "JSFunction", + "value": "function util () {\r\n console.log(321)\r\n}" + } + } + ], + "config": { + "sdkVersion": "1.0.3", + "historyMode": "hash", + "targetRootID": "app" + }, + "constants": "", + "css": "", + "version": "" + }, + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/platform-center/courses.json b/dl-flow-frontend/mockServer/src/mock/get/platform-center/courses.json new file mode 100644 index 0000000..dcd1c3b --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/platform-center/courses.json @@ -0,0 +1,148 @@ +{ + "data": [ + { + "id": 37, + "createdBy": { + "id": 86, + "username": "开发者", + "email": "developer@lowcode.com", + "resetPasswordToken": "developer", + "blocked": null, + "created_at": "2022-05-27T16:50:44.000Z", + "updated_at": "2022-05-27T16:50:44.000Z", + "block": null, + "is_admin": true, + "is_public": null + }, + "updatedBy": { + "id": 86, + "username": "开发者", + "email": "developer@lowcode.com", + "resetPasswordToken": "developer", + "blocked": null, + "created_at": "2022-05-27T16:50:44.000Z", + "updated_at": "2022-05-27T16:50:44.000Z", + "block": null, + "is_admin": true, + "is_public": null + }, + "created_at": "2023-08-17T02:40:06.000Z", + "updated_at": "2023-08-17T02:40:21.000Z", + "category": "appDev", + "name": "ai生成简单页面教程", + "desc": "", + "poster": "http://localhost:9090/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg", + "type": "advanced", + "tags": "", + "variety": "solution", + "videos": [], + "progress": 0 + }, + { + "id": 34, + "createdBy": { + "id": 108, + "username": "张三", + "email": "xyz@email.com", + "resetPasswordToken": "工号xxxxxx", + "blocked": null, + "created_at": "2022-06-22T08:20:55.000Z", + "updated_at": "2022-12-08T07:29:41.000Z", + "block": null, + "is_admin": false, + "is_public": null + }, + "updatedBy": { + "id": 108, + "username": "张三", + "email": "xyz@email.com", + "resetPasswordToken": "工号xxxxxx", + "blocked": null, + "created_at": "2022-06-22T08:20:55.000Z", + "updated_at": "2022-12-08T07:29:41.000Z", + "block": null, + "is_admin": false, + "is_public": null + }, + "created_at": "2022-08-27T07:29:49.000Z", + "updated_at": "2022-08-27T07:29:49.000Z", + "category": "appDev", + "name": "如何加入组织", + "desc": "讲解如何加入已有组织,如何创建自己的组织", + "poster": "http://localhost:9090/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg", + "type": "introductory", + "tags": ["入门", "最新"], + "variety": "manual", + "videos": [ + { + "id": 72, + "courseId": 34, + "title": "申请加入组织", + "video": "http://localhost:9090/assets/videos/tiny-engine.mp4", + "docs": "TinyEngine简介", + "created_at": "2022-08-27T07:29:49.000Z", + "updated_at": "2022-08-27T07:29:49.000Z" + }, + { + "id": 73, + "courseId": 34, + "title": "创建平台", + "video": "http://localhost:9090/assets/videos/tiny-engine.mp4", + "docs": "fdsa", + "created_at": "2022-08-27T07:29:49.000Z", + "updated_at": "2022-08-27T07:29:49.000Z" + } + ], + "progress": 0 + }, + { + "id": 28, + "createdBy": { + "id": 169, + "username": "张三", + "email": "xyz@email.com", + "resetPasswordToken": "工号xxxxxx", + "blocked": null, + "created_at": "2022-07-04T07:25:53.000Z", + "updated_at": "2022-09-27T11:48:34.000Z", + "block": null, + "is_admin": true, + "is_public": true + }, + "updatedBy": { + "id": 169, + "username": "张三", + "email": "xyz@email.com", + "resetPasswordToken": "工号xxxxxx", + "blocked": null, + "created_at": "2022-07-04T07:25:53.000Z", + "updated_at": "2022-09-27T11:48:34.000Z", + "block": null, + "is_admin": true, + "is_public": true + }, + "created_at": "2022-08-10T08:38:06.000Z", + "updated_at": "2022-08-11T03:44:28.000Z", + "category": "appDev", + "name": "实战课程", + "desc": "实战课程", + "poster": "http://localhost:9090/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg", + "type": "practical", + "tags": "", + "variety": "manual", + "videos": [ + { + "id": 66, + "courseId": 28, + "title": "从零搭建一个页面", + "video": "http://localhost:9090/assets/videos/in-action.mp4", + "docs": "", + "created_at": "2022-08-10T08:38:06.000Z", + "updated_at": "2022-08-10T08:38:06.000Z" + } + ], + "progress": 0 + } + ], + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/get/platform-center/user/me.json b/dl-flow-frontend/mockServer/src/mock/get/platform-center/user/me.json new file mode 100644 index 0000000..c1876b8 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/get/platform-center/user/me.json @@ -0,0 +1,57 @@ +{ + "data": { + "id": 86, + "username": "开发者", + "email": "developer@lowcode.com", + "provider": null, + "password": null, + "resetPasswordToken": "developer", + "confirmationToken": "uuid~dfafasdfasdfa", + "confirmed": true, + "blocked": null, + "role": null, + "created_by": null, + "updated_by": null, + "created_at": "2021-11-11T13:52:21.000Z", + "updated_at": "2022-11-01T01:39:30.000Z", + "block": null, + "is_admin": true, + "is_public": null, + "tenant": { + "id": "1" + }, + "auths": [ + { + "id": 265, + "unit": { + "type": "tenant", + "id": 1, + "name": "public" + }, + "auth_type": null, + "expired_time": null, + "role": { + "name": "Tinybuilder_Tenant_Admin", + "id": 6, + "description": "组织管理员" + } + } + ], + "tenants": [ + { + "id": 1, + "tenant_id": "public", + "name_cn": "公共租户", + "name_en": "Public Tenant", + "description": "Default tenant for new user to explore.", + "created_by": null, + "updated_by": null, + "created_at": "2021-12-28T11:39:10.000Z", + "updated_at": "2023-02-09T08:23:00.000Z", + "createdBy": null, + "updatedBy": 86 + } + ] + }, + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/extension/create.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/extension/create.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/extension/create.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/extension/update.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/extension/update.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/extension/update.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/update/918.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/update/918.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/apps/update/918.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/i18n/entries/bulk/delete.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/i18n/entries/bulk/delete.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/i18n/entries/bulk/delete.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/i18n/entries/update.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/i18n/entries/update.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/i18n/entries/update.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/create.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/create.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/create.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/delete.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/delete.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/delete.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/update.json b/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/update.json new file mode 100644 index 0000000..284dfe6 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/mock/post/app-center/sources/update.json @@ -0,0 +1,69 @@ +{ + "data": { + "id": 133, + "name": "getAllList", + "data": { + "columns": [ + { + "name": "test", + "title": "测试", + "field": "test", + "type": "string", + "format": {} + }, + { + "name": "test1", + "title": "测试1", + "field": "test1", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "test": "test1", + "test1": "test1", + "_id": "341efc48" + }, + { + "test": "test2", + "test1": "test1", + "_id": "b86b516c" + }, + { + "test": "test3", + "test1": "test1", + "_id": "f680cd78" + } + ], + "options": { + "uri": "/app-center/api/sources/list/918", + "isSync": true, + "method": "GET" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T07:32:16.000Z", + "updated_at": "2023-01-19T03:29:11.000Z" + }, + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/routes/error-routes.js b/dl-flow-frontend/mockServer/src/routes/error-routes.js new file mode 100644 index 0000000..aca3532 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/routes/error-routes.js @@ -0,0 +1,24 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +module.exports = function () { + return function (ctx, next) { + switch (ctx.status) { + case 404: + ctx.body = '没有找到内容 - 404' + break + default: + break + } + return next() + } +} diff --git a/dl-flow-frontend/mockServer/src/routes/main-routes.js b/dl-flow-frontend/mockServer/src/routes/main-routes.js new file mode 100644 index 0000000..0a66a8d --- /dev/null +++ b/dl-flow-frontend/mockServer/src/routes/main-routes.js @@ -0,0 +1,225 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import KoaRouter from 'koa-router' +import * as glob from 'glob' +import path from 'path' +import fs from 'fs-extra' +import MockService from '../services/mockService' + +import { getResponseData } from '../tool/Common' +const router = new KoaRouter() +export const mockService = new MockService() +const getJsonPathData = (jpath, method = 'get') => { + const usefulPath = jpath.split(`${method}${path.sep}`)[1] + const apipath = usefulPath.split(path.sep) + const lastSegment = apipath[apipath.length - 1] + const lastdirname = lastSegment.split('.')[0] + apipath[apipath.length - 1] = lastdirname + const [center, version, ...routes] = apipath + let api = '' + if (version === 'v1') { + api = `/${center}/${version}/api/${routes.join('/')}` + } else { + api = `/${center}/api/${version}/${routes.join('/')}` + } + const data = fs.readJSONSync(path.resolve(__dirname, path.relative(__dirname, jpath))) + return { + api, + data + } +} + +const mockPath = path.resolve(__dirname, '../mock') +// 注册路由 +glob.globSync(`${mockPath}/get/**/*.json`).forEach((jpath) => { + const { api, data } = getJsonPathData(jpath) + router.get(api, (ctx, next) => { + ctx.body = data + }) +}) + +glob.globSync(`${mockPath}/post/**/*.json`).forEach((jpath) => { + const { api, data } = getJsonPathData(jpath, 'post') + router.post(api, (ctx, next) => { + ctx.body = data + }) +}) + +router.get('/app-center/api/apps/canvas/lock', async (ctx) => { + ctx.body = await mockService.appService.lock(ctx.request.query) +}) + +router.post('/app-center/api/schema2code', (ctx) => { + const { pageInfo } = ctx.request.body + ctx.body = mockService.schema2codeService.schema2code(pageInfo) +}) + +router.get('/app-center/api/preview/metadata', (ctx) => { + ctx.body = mockService.appService.getAppPreviewMetaData() +}) + +router.post('/app-center/api/pages/create', async (ctx) => { + ctx.body = await mockService.pageService.create(ctx.request.body) +}) + +router.post('/app-center/api/pages/update/:id', async (ctx) => { + const { id } = ctx.params + const { body } = ctx.request + ctx.body = await mockService.pageService.update(id, body) +}) + +router.get('/app-center/api/pages/list/:appId', async (ctx) => { + const { appId } = ctx.params + ctx.body = await mockService.pageService.list(appId) +}) + +router.get('/app-center/api/pages/detail/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.pageService.detail(id) +}) + +router.get('/app-center/api/pages/delete/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.pageService.delete(id) +}) + +router.get('/material-center/api/block/detail/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.blockService.detail(id) +}) + +router.get('/material-center/api/blocks', async (ctx) => { + const { appId } = ctx.params + ctx.body = await mockService.blockService.list(appId) +}) + +router.post('/material-center/api/block/create', async (ctx) => { + const result = mockService.blockService.create(ctx.request.body) + const categoriesId = ctx.request.body.categories[0] + const _id = result.id + await mockService.blockCategoryService.update(categoriesId, { _id }) + ctx.body = getResponseData(result) +}) + +router.post('/material-center/api/block/update/:id', async (ctx) => { + const { id } = ctx.params + const { body } = ctx.request + ctx.body = await mockService.blockService.update(id, body) +}) + +router.get('/material-center/api/block/delete/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.blockService.delete(id) +}) + +router.post('/material-center/api/block-groups/create', async (ctx) => { + ctx.body = await mockService.blockGroupService.create(ctx.request.body) +}) + +router.post('/material-center/api/block-groups/update/:id', async (ctx) => { + const { id } = ctx.params + const { body } = ctx.request + ctx.body = await mockService.blockGroupService.update(id, body) +}) + +router.get('/material-center/api/block-groups/delete/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.blockGroupService.delete(id) +}) + +router.get('/material-center/api/block-groups', async (ctx) => { + const result = await mockService.blockGroupService.find(ctx.query) + let blockGroup + if (result.data.length > 1) { + blockGroup = await Promise.all( + result.data.map(async (group) => { + group.blocks = await Promise.all( + group.blocks.map(async (block) => { + const blockData = await mockService.blockService.detail(block.id) + return blockData + }) + ) + return group + }) + ) + ctx.body = getResponseData(blockGroup) + } else { + blockGroup = result.data[0] + const blocks = await Promise.all( + blockGroup.blocks.map(async (item) => { + const blockData = await mockService.blockService.detail(item) + return blockData + }) + ) + + blockGroup.blocks = blocks + ctx.body = getResponseData([blockGroup]) + } +}) + +router.post('/material-center/api/block-categories', async (ctx) => { + ctx.body = await mockService.blockCategoryService.create(ctx.request.body) +}) + +router.put('/material-center/api/block-categories/:id', async (ctx) => { + const { id } = ctx.params + const { body } = ctx.request + ctx.body = await mockService.blockCategoryService.update(id, body) +}) + +router.delete('/material-center/api/block-categories/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.blockCategoryService.delete(id) +}) + +router.get('/material-center/api/block-categories', async (ctx) => { + const result = await mockService.blockCategoryService.find(ctx.query) + const blockCategories = await Promise.all( + result.data.map(async (group) => { + const blocks = await Promise.all( + group.blocks.map(async (block) => { + const blockData = await mockService.blockService.detail(block) + return blockData + }) + ) + group.blocks = blocks + return group + }) + ) + ctx.body = getResponseData(blockCategories) +}) + +router.get('/app-center/api/sources/detail/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.sourceService.detail(id) +}) + +router.post('/material-center/api/block/deploy', async (ctx) => { + ctx.body = await mockService.blockBuildService.build(ctx.request.body) +}) + +router.get('/material-center/api/tasks/:id', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.taskService.detail(id) +}) + +router.get('/block-history', async (ctx) => { + const { id } = ctx.params + ctx.body = await mockService.blockHistoryService.find(id) +}) + +router.post('block-history/create', async (ctx) => { + ctx.body = await mockService.blockHistoryService.create(ctx.request.body) +}) + +export default router diff --git a/dl-flow-frontend/mockServer/src/services/.gitkeep b/dl-flow-frontend/mockServer/src/services/.gitkeep new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/.gitkeep @@ -0,0 +1 @@ +1 diff --git a/dl-flow-frontend/mockServer/src/services/app.js b/dl-flow-frontend/mockServer/src/services/app.js new file mode 100644 index 0000000..60821e4 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/app.js @@ -0,0 +1,73 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { pageService } from '../routes/main-routes' +import { getResponseData } from '../tool/Common' +export default class AppService { + async lock(query) { + const { id, state } = query + const occupier = state === 'occupy' ? pageService.userInfo : null + await pageService.update(id, { occupier }) + return getResponseData({ + operate: 'success', + occupier + }) + } + + // 获取应用预览数据 + getAppPreviewMetaData() { + const appMetaData = require('./appinfo.json') + + const { i18n: i18nEntries, source = [], extension = [], app } = appMetaData + // 拼装数据源 + const dataSource = { + list: source, + dataHandler: app.data_handler + } + // 拼装工具类 + const utils = [] + extension.forEach((item) => { + const { name, type, content, category } = item + const data = { name, type, content } + if (category === 'utils') { + utils.push(data) + } + }) + // 拼装国际化词条 + const entriesData = getResponseData(i18nEntries) + const i18n = this.formatI18nEntrites(entriesData) + return getResponseData({ + dataSource, + globalState: app.global_state, + utils, + i18n + }) + } + + formatI18nEntrites(entriesData) { + const entries = entriesData.data + // 中文和英文作为全局国际化语言,并没有和应用/区块建立关联关系 + const defaultLang = [{ lang: 'en_US' }, { lang: 'zh_CN' }] + + const res = {} + entries.forEach((entry) => { + const { + key, + lang: { lang }, + content + } = entry + res[lang] = res[lang] || {} + res[lang][key] = content + }) + return res + } +} diff --git a/dl-flow-frontend/mockServer/src/services/appinfo.json b/dl-flow-frontend/mockServer/src/services/appinfo.json new file mode 100644 index 0000000..e6a33d4 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/appinfo.json @@ -0,0 +1,28851 @@ +{ + "i18n": [ + { + "id": 123, + "key": "lowcode.c257d5e8", + "content": "search", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-06-13T08:17:17.000Z", + "updated_at": "2023-05-15T00:48:10.000Z" + }, + { + "id": 124, + "key": "lowcode.c257d5e8", + "content": "查询", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-06-13T08:17:17.000Z", + "updated_at": "2023-05-15T00:48:10.000Z" + }, + { + "id": 211, + "key": "lowcode.61c8ac8c", + "content": "地方", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-06-30T08:06:59.000Z", + "updated_at": "2023-05-04T08:06:48.000Z" + }, + { + "id": 212, + "key": "lowcode.61c8ac8c", + "content": "dsdsa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-06-30T08:06:59.000Z", + "updated_at": "2023-05-04T08:06:48.000Z" + }, + { + "id": 229, + "key": "lowcode.f53187a0", + "content": "测试", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-07-06T11:19:17.000Z", + "updated_at": "2023-07-18T12:33:31.000Z" + }, + { + "id": 230, + "key": "lowcode.f53187a0", + "content": "test", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-07-06T11:19:17.000Z", + "updated_at": "2023-07-18T12:33:31.000Z" + }, + { + "id": 231, + "key": "lowcode.97ad00dd", + "content": "创建物料资产包", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-07-06T11:21:54.000Z", + "updated_at": "2022-07-06T11:21:54.000Z" + }, + { + "id": 232, + "key": "lowcode.97ad00dd", + "content": "createMaterial", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2022-07-06T11:21:54.000Z", + "updated_at": "2022-07-06T11:21:54.000Z" + }, + { + "id": 31985, + "key": "lowcode.61dcef52", + "content": "terterere", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-05-04T08:07:15.000Z", + "updated_at": "2023-05-04T08:07:15.000Z" + }, + { + "id": 31986, + "key": "lowcode.61dcef52", + "content": "sadasda", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-05-04T08:07:15.000Z", + "updated_at": "2023-05-04T08:07:15.000Z" + }, + { + "id": 36011, + "key": "lowcode.45f4c42a", + "content": "gfdgfd", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-05-06T08:18:35.000Z", + "updated_at": "2023-05-06T08:20:01.000Z" + }, + { + "id": 36012, + "key": "lowcode.45f4c42a", + "content": "gdfgdf", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-05-06T08:18:35.000Z", + "updated_at": "2023-05-06T08:20:01.000Z" + }, + { + "id": 45420, + "key": "lowcode.c6f5a652", + "content": "fsdaf", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-06-17T08:50:24.000Z", + "updated_at": "2023-07-18T12:33:28.000Z" + }, + { + "id": 45421, + "key": "lowcode.c6f5a652", + "content": "fsdafds", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-06-17T08:50:24.000Z", + "updated_at": "2023-07-18T12:33:28.000Z" + }, + { + "id": 55726, + "key": "lowcode.34923432", + "content": "fdsafdsa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:01:19.000Z", + "updated_at": "2023-08-15T07:01:19.000Z" + }, + { + "id": 55727, + "key": "lowcode.34923432", + "content": "fdsafds", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:01:19.000Z", + "updated_at": "2023-08-15T07:01:19.000Z" + }, + { + "id": 55728, + "key": "lowcode.48521e45", + "content": "fdsfds", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:03:02.000Z", + "updated_at": "2023-08-15T07:03:02.000Z" + }, + { + "id": 55729, + "key": "lowcode.6534943e", + "content": "fdsafds", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:04:22.000Z", + "updated_at": "2023-08-15T07:04:22.000Z" + }, + { + "id": 55730, + "key": "lowcode.6534943e", + "content": "fdsafdsa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:04:22.000Z", + "updated_at": "2023-08-15T07:04:22.000Z" + }, + { + "id": 55731, + "key": "lowcode.44252642", + "content": "fdsafds", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:04:53.000Z", + "updated_at": "2023-08-15T07:04:53.000Z" + }, + { + "id": 55732, + "key": "lowcode.44252642", + "content": "aaaa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-15T07:04:53.000Z", + "updated_at": "2023-08-15T07:04:53.000Z" + }, + { + "id": 64792, + "key": "lowcode.2a743651", + "content": "sda", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T00:58:35.000Z", + "updated_at": "2023-08-21T00:58:35.000Z" + }, + { + "id": 64793, + "key": "lowcode.2a743651", + "content": "fdsaf", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T00:58:35.000Z", + "updated_at": "2023-08-21T00:58:35.000Z" + }, + { + "id": 64794, + "key": "lowcode.24315357", + "content": "fdsafds", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:51:56.000Z", + "updated_at": "2023-08-21T02:51:56.000Z" + }, + { + "id": 64795, + "key": "lowcode.24315357", + "content": "fsdafds", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:51:56.000Z", + "updated_at": "2023-08-21T02:51:56.000Z" + }, + { + "id": 64796, + "key": "lowcode.44621691", + "content": "fdsafsd", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:00.000Z", + "updated_at": "2023-08-21T02:52:00.000Z" + }, + { + "id": 64797, + "key": "lowcode.44621691", + "content": "sd", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:00.000Z", + "updated_at": "2023-08-21T02:52:00.000Z" + }, + { + "id": 64798, + "key": "lowcode.65636226", + "content": "fdsaf", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:04.000Z", + "updated_at": "2023-08-21T02:52:04.000Z" + }, + { + "id": 64799, + "key": "lowcode.65636226", + "content": "fdsfsd", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:04.000Z", + "updated_at": "2023-08-21T02:52:04.000Z" + }, + { + "id": 64800, + "key": "lowcode.6426a4e2", + "content": "sd", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:08.000Z", + "updated_at": "2023-08-21T02:52:08.000Z" + }, + { + "id": 64801, + "key": "lowcode.6426a4e2", + "content": "fdsafsd", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:08.000Z", + "updated_at": "2023-08-21T02:52:08.000Z" + }, + { + "id": 64802, + "key": "lowcode.e41c6636", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:11.000Z", + "updated_at": "2023-08-21T02:52:11.000Z" + }, + { + "id": 64803, + "key": "lowcode.e41c6636", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:11.000Z", + "updated_at": "2023-08-21T02:52:11.000Z" + }, + { + "id": 64804, + "key": "lowcode.51c23164", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:15.000Z", + "updated_at": "2023-08-21T02:52:15.000Z" + }, + { + "id": 64805, + "key": "lowcode.51c23164", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:15.000Z", + "updated_at": "2023-08-21T02:52:15.000Z" + }, + { + "id": 64806, + "key": "lowcode.17245b46", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:21.000Z", + "updated_at": "2023-08-21T02:52:21.000Z" + }, + { + "id": 64807, + "key": "lowcode.17245b46", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:21.000Z", + "updated_at": "2023-08-21T02:52:21.000Z" + }, + { + "id": 64808, + "key": "lowcode.4573143c", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:22.000Z", + "updated_at": "2023-08-21T02:52:22.000Z" + }, + { + "id": 64809, + "key": "lowcode.4573143c", + "content": "a", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:22.000Z", + "updated_at": "2023-08-21T02:52:22.000Z" + }, + { + "id": 64810, + "key": "lowcode.56432442", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:25.000Z", + "updated_at": "2023-09-04T08:45:49.000Z" + }, + { + "id": 64811, + "key": "lowcode.56432442", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:25.000Z", + "updated_at": "2023-09-04T08:45:49.000Z" + }, + { + "id": 64812, + "key": "lowcode.33566643", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:28.000Z", + "updated_at": "2023-08-21T02:52:28.000Z" + }, + { + "id": 64813, + "key": "lowcode.33566643", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:28.000Z", + "updated_at": "2023-08-21T02:52:28.000Z" + }, + { + "id": 64814, + "key": "lowcode.565128f3", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:32.000Z", + "updated_at": "2023-08-21T02:52:32.000Z" + }, + { + "id": 64815, + "key": "lowcode.565128f3", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:32.000Z", + "updated_at": "2023-08-21T02:52:32.000Z" + }, + { + "id": 64816, + "key": "lowcode.56643835", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 1, + "lang": "zh_CN", + "label": "简体中文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:00:54.000Z", + "updated_at": "2022-03-08T08:00:54.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:34.000Z", + "updated_at": "2023-08-21T02:52:34.000Z" + }, + { + "id": 64817, + "key": "lowcode.56643835", + "content": "aa", + "host": 918, + "host_type": "app", + "lang": { + "id": 2, + "lang": "en_US", + "label": "美式英文", + "created_by": null, + "updated_by": null, + "created_at": "2022-03-08T08:01:16.000Z", + "updated_at": "2022-03-08T08:01:16.000Z" + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-08-21T02:52:34.000Z", + "updated_at": "2023-08-21T02:52:34.000Z" + } + ], + "source": [ + { + "id": 132, + "name": "getAllComponent", + "data": { + "data": [], + "type": "array" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T06:26:26.000Z", + "updated_at": "2022-06-28T07:02:30.000Z" + }, + { + "id": 133, + "name": "getAllList", + "data": { + "columns": [ + { + "name": "test", + "title": "测试", + "field": "test", + "type": "string", + "format": {} + }, + { + "name": "test1", + "title": "测试1", + "field": "test1", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "test": "test1", + "test1": "test1", + "_id": "341efc48" + }, + { + "test": "test2", + "test1": "test1", + "_id": "b86b516c" + }, + { + "test": "test3", + "test1": "test1", + "_id": "f680cd78" + } + ], + "options": { + "uri": "", + "method": "GET" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T07:32:16.000Z", + "updated_at": "2023-01-19T03:29:11.000Z" + }, + { + "id": 135, + "name": "getAllMaterialList", + "data": { + "columns": [ + { + "name": "id", + "title": "id", + "field": "id", + "type": "string", + "format": {} + }, + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": {} + }, + { + "name": "framework", + "title": "framework", + "field": "framework", + "type": "string", + "format": { + "required": true + } + }, + { + "name": "components", + "title": "components", + "field": "components", + "type": "string", + "format": {} + }, + { + "name": "content", + "title": "content", + "field": "content", + "type": "string", + "format": {} + }, + { + "name": "url", + "title": "url", + "field": "url", + "type": "string", + "format": {} + }, + { + "name": "published_at", + "title": "published_at", + "field": "published_at", + "type": "string", + "format": {} + }, + { + "name": "created_at", + "title": "created_at", + "field": "created_at", + "type": "string", + "format": {} + }, + { + "name": "updated_at", + "title": "updated_at", + "field": "updated_at", + "type": "string", + "format": {} + }, + { + "name": "published", + "title": "published", + "field": "published", + "type": "string", + "format": {} + }, + { + "name": "last_build_info", + "title": "last_build_info", + "field": "last_build_info", + "type": "string", + "format": {} + }, + { + "name": "tenant", + "title": "tenant", + "field": "tenant", + "type": "string", + "format": {} + }, + { + "name": "version", + "title": "version", + "field": "version", + "type": "string", + "format": {} + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "2a23e653" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "06b253be" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "c55a41ed" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "f37123ec" + }, + { + "id": "7a63c1a2", + "url": "", + "name": "tiny-vue", + "tenant": "", + "content": "Tiny Vue物料", + "version": "1.0.0", + "framework": "Vue", + "published": "", + "components": "", + "created_at": "", + "updated_at": "", + "description": "Tiny Vue物料", + "published_at": "", + "last_build_info": "", + "_id": "7a63c1a2" + } + ], + "options": { + "uri": "", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-29T00:57:50.000Z", + "updated_at": "2023-05-15T02:37:12.000Z" + }, + { + "id": 139, + "name": "treedata", + "data": { + "data": [ + { + "label": "level111", + "value": "111", + "id": "f6609643", + "pid": "", + "_RID": "row_4" + }, + { + "label": "level1-son", + "value": "111-1", + "id": "af1f937f", + "pid": "f6609643", + "_RID": "row_5" + }, + { + "label": "level222", + "value": "222", + "id": "28e3709c", + "pid": "", + "_RID": "row_6" + }, + { + "label": "level2-son", + "value": "222-1", + "id": "6b571bef", + "pid": "28e3709c", + "_RID": "row_5" + }, + { + "id": "6317c2cc", + "pid": "fdfa", + "label": "fsdfaa", + "value": "fsadf", + "_RID": "row_6" + }, + { + "id": "9cce369f", + "pid": "test", + "label": "test1", + "value": "001" + } + ], + "type": "tree" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-30T06:13:57.000Z", + "updated_at": "2022-07-29T03:14:55.000Z" + }, + { + "id": 150, + "name": "componentList", + "data": { + "data": [ + { + "_RID": "row_1", + "name": "表单", + "isSelected": "true", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据" + }, + { + "name": "按钮", + "isSelected": "false", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型" + }, + { + "id": "490f8a00", + "_RID": "row_3", + "name": "表单项", + "framework": "", + "materials": "", + "description": "Form 组件下的 FormItem 配置" + }, + { + "id": "c259b8b3", + "_RID": "row_4", + "name": "开关", + "framework": "", + "materials": "", + "description": "关闭或打开" + }, + { + "id": "083ed9c7", + "_RID": "row_5", + "name": "互斥按钮组", + "framework": "", + "materials": "", + "description": "以按钮组的方式出现,常用于多项类似操作" + }, + { + "id": "09136cea", + "_RID": "row_6", + "name": "提示框", + "framework": "", + "materials": "", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画" + }, + { + "id": "a63b57d5", + "_RID": "row_7", + "name": "文字提示框", + "framework": "", + "materials": "", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信" + }, + { + "id": "a0f6e8a3", + "_RID": "row_8", + "name": "树", + "framework": "", + "materials": "", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单" + }, + { + "id": "d1aa18fc", + "_RID": "row_9", + "name": "分页", + "framework": "", + "materials": "", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件" + }, + { + "id": "ca49cc52", + "_RID": "row_10", + "name": "表格", + "framework": "", + "materials": "", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等" + }, + { + "id": "4e20ecc9", + "name": "搜索框", + "framework": "", + "materials": "", + "description": "指定条件对象进行搜索数据" + }, + { + "id": "6b093ee5", + "name": "折叠面板", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "0a09abc0", + "name": "对话框", + "framework": "", + "materials": "", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作" + }, + { + "id": "f814b901", + "name": "标签页签项", + "framework": "", + "materials": "", + "description": "tab页签" + }, + { + "id": "c5ae797c", + "name": "单选", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,在一组备选项中进行单选" + }, + { + "id": "33d0c590", + "_RID": "row_13", + "name": "弹出编辑", + "framework": "", + "materials": "", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件" + }, + { + "id": "16711dfa", + "_RID": "row_14", + "name": "下拉框", + "framework": "", + "materials": "", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件" + }, + { + "id": "a9fd190a", + "_RID": "row_15", + "name": "折叠面板项", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "a7dfa9ec", + "_RID": "row_16", + "name": "复选框", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选" + }, + { + "id": "d4bb8330", + "name": "输入框", + "framework": "", + "materials": "", + "description": "通过鼠标或键盘输入字符" + }, + { + "id": "ced3dc83", + "name": "时间线", + "framework": "", + "materials": "", + "description": "时间线" + } + ], + "type": "array", + "columns": [ + { + "name": "name", + "type": "string", + "field": "name", + "title": "name", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "description", + "type": "string", + "field": "description", + "title": "description", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "isSelected", + "type": "string", + "field": "isSelected", + "title": "isSelected", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + } + ], + "options": { + "uri": "http://localhost:9090/assets/json/bundle.json", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T02:20:07.000Z", + "updated_at": "2022-07-04T06:25:29.000Z" + }, + { + "id": 151, + "name": "selectedComponents", + "data": { + "columns": [ + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "isSelected", + "title": "isSelected", + "field": "isSelected", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + } + ], + "type": "array", + "data": [ + { + "name": "标签页", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "isSelected": "true", + "_RID": "row_2" + }, + { + "name": "布局列", + "description": "列配置信息", + "isSelected": "true", + "id": "76a7080a", + "_RID": "row_4" + }, + { + "name": "日期选择器", + "description": "用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式", + "isSelected": "true", + "id": "76b20d73", + "_RID": "row_1" + }, + { + "name": "走马灯", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现", + "isSelected": "true", + "id": "4c884c3d" + } + ] + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T03:04:05.000Z", + "updated_at": "2022-07-04T03:43:40.000Z" + } + ], + "extension": [ + { + "id": 176, + "name": "axios", + "type": "npm", + "content": { + "type": "JSFunction", + "value": "", + "package": "axios", + "destructuring": false, + "exportName": "axios" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-10-27T11:02:26.000Z", + "updated_at": "2022-10-27T11:02:26.000Z" + }, + { + "id": 104, + "name": "Button", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Button", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-07-06T10:17:31.000Z", + "updated_at": "2022-07-06T10:17:31.000Z" + }, + { + "id": 101, + "name": "Menu", + "type": "npm", + "content": { + "type": "JSFunction", + "value": "", + "package": "@opentiny/vue", + "exportName": "NavMenu", + "destructuring": true + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-06-24T06:40:52.000Z", + "updated_at": "2022-06-24T08:03:13.000Z" + }, + { + "id": 103, + "name": "Modal ", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Modal ", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-07-01T03:21:19.000Z", + "updated_at": "2022-07-01T03:21:19.000Z" + }, + { + "id": 146, + "name": "npm", + "type": "function", + "content": { + "type": "JSFunction", + "value": "''" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-08-29T06:54:02.000Z", + "updated_at": "2023-01-05T01:00:52.000Z" + }, + { + "id": 102, + "name": "Pager", + "type": "npm", + "content": { + "package": "@opentiny/vue", + "version": "", + "exportName": "Pager", + "subName": "", + "destructuring": true, + "main": "" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-06-28T08:17:38.000Z", + "updated_at": "2023-03-21T12:13:04.000Z" + }, + { + "id": 106, + "name": "test", + "type": "function", + "content": { + "type": "JSFunction", + "value": "function test() {\r\n return 'test'\r\n}" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-07-06T10:21:02.000Z", + "updated_at": "2023-03-21T12:12:49.000Z" + }, + { + "id": 97, + "name": "util", + "type": "function", + "content": { + "type": "JSFunction", + "value": "function util () {\r\n console.log(321)\r\n}" + }, + "app": 918, + "category": "utils", + "created_by": null, + "updated_by": null, + "created_at": "2022-06-23T11:13:07.000Z", + "updated_at": "2023-04-06T02:31:44.000Z" + } + ], + "pages": [ + { + "name": "createVm", + "id": "NTJ4MjvqoVj8OVsc", + "app": "918", + "route": "createVm", + "page_content": { + "state": { + "dataDisk": [1, 2, 3] + }, + "methods": {}, + "componentName": "Page", + "css": "body {\r\n background-color:#eef0f5 ;\r\n margin-bottom: 80px;\r\n}", + "props": {}, + "children": [ + { + "componentName": "div", + "props": { + "style": "padding-bottom: 10px; padding-top: 10px;" + }, + "id": "2b2cabf0", + "children": [ + { + "componentName": "TinyTimeLine", + "props": { + "active": "2", + "data": [ + { + "name": "基础配置" + }, + { + "name": "网络配置" + }, + { + "name": "高级配置" + }, + { + "name": "确认配置" + } + ], + "horizontal": true, + "style": "border-radius: 0px;" + }, + "id": "dd764b17" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "id": "30c94cc8", + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "计费模式" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "包年/包月", + "value": "1" + }, + { + "text": "按需计费", + "value": "2" + } + ], + "modelValue": "1" + }, + "id": "a8d84361" + } + ], + "id": "9f39f3e7" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "区域" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "乌兰察布二零一", + "value": "1" + } + ], + "modelValue": "1", + "style": "border-radius: 0px; margin-right: 10px;" + }, + "id": "c97ccd99" + }, + { + "componentName": "Text", + "props": { + "text": "温馨提示:页面左上角切换区域", + "style": "background-color: [object Event]; color: #8a8e99; font-size: 12px;" + }, + "id": "20923497" + }, + { + "componentName": "Text", + "props": { + "text": "不同区域的云服务产品之间内网互不相通;请就近选择靠近您业务的区域,可减少网络时延,提高访问速度", + "style": "display: block; color: #8a8e99; border-radius: 0px; font-size: 12px;" + }, + "id": "54780a26" + } + ], + "id": "4966384d" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "可用区", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "可用区1", + "value": "1" + }, + { + "text": "可用区2", + "value": "2" + }, + { + "text": "可用区3", + "value": "3" + } + ], + "modelValue": "1" + }, + "id": "6184481b" + } + ], + "id": "690837bf" + } + ], + "id": "b6a425d4" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "CPU架构" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "x86计算", + "value": "1" + }, + { + "text": "鲲鹏计算", + "value": "2" + } + ], + "modelValue": "1" + }, + "id": "7d33ced7" + } + ], + "id": "05ed5a79" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "区域" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex; justify-content: flex-start; align-items: center;" + }, + "id": "606edf78", + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex; align-items: center; margin-right: 10px;" + }, + "id": "f3f98246", + "children": [ + { + "componentName": "Text", + "props": { + "text": "vCPUs", + "style": "width: 80px;" + }, + "id": "c287437e" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ] + }, + "id": "4c43286b" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "display: flex; align-items: center; margin-right: 10px;" + }, + "children": [ + { + "componentName": "Text", + "props": { + "text": "内存", + "style": "width: 80px; border-radius: 0px;" + }, + "id": "38b8fa1f" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ] + }, + "id": "cd33328e" + } + ], + "id": "2b2c678f" + }, + { + "componentName": "div", + "props": { + "style": "display: flex; align-items: center;" + }, + "children": [ + { + "componentName": "Text", + "props": { + "text": "规格名称", + "style": "width: 80px;" + }, + "id": "d3eb6352" + }, + { + "componentName": "TinySearch", + "props": { + "modelValue": "", + "placeholder": "输入关键词" + }, + "id": "21cb9282" + } + ], + "id": "b8e0f35c" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "border-radius: 0px;" + }, + "id": "5000c83e", + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "通用计算型", + "value": "1" + }, + { + "text": "通用计算增强型", + "value": "2" + }, + { + "text": "内存优化型", + "value": "3" + }, + { + "text": "内存优化型", + "value": "4" + }, + { + "text": "磁盘增强型", + "value": "5" + }, + { + "text": "超高I/O型", + "value": "6" + }, + { + "text": "GPU加速型", + "value": "7" + } + ], + "modelValue": "1", + "style": "border-radius: 0px; margin-top: 12px;" + }, + "id": "b8724703" + }, + { + "componentName": "TinyGrid", + "props": { + "editConfig": { + "trigger": "click", + "mode": "cell", + "showStatus": true + }, + "columns": [ + { + "type": "radio", + "width": 60 + }, + { + "field": "employees", + "title": "规格名称" + }, + { + "field": "created_date", + "title": "vCPUs | 内存(GiB)", + "sortable": true + }, + { + "field": "city", + "title": "CPU", + "sortable": true + }, + { + "title": "基准 / 最大带宽\t", + "sortable": true + }, + { + "title": "内网收发包", + "sortable": true + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司", + "city": "福州", + "employees": 800, + "created_date": "2014-04-30 00:56:00", + "boole": false + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "employees": 300, + "created_date": "2016-07-08 12:36:22", + "boole": true + } + ], + "style": "margin-top: 12px; border-radius: 0px;", + "auto-resize": true + }, + "id": "77701c25" + }, + { + "componentName": "div", + "props": { + "style": "margin-top: 12px; border-radius: 0px;" + }, + "id": "3339838b", + "children": [ + { + "componentName": "Text", + "props": { + "text": "当前规格", + "style": "width: 150px; display: inline-block;" + }, + "id": "203b012b" + }, + { + "componentName": "Text", + "props": { + "text": "通用计算型 | Si2.large.2 | 2vCPUs | 4 GiB", + "style": "font-weight: 700;" + }, + "id": "87723f52" + } + ] + } + ] + } + ], + "id": "657fb2fc" + } + ], + "id": "d19b15cf" + } + ], + "id": "9991228b" + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "镜像", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "公共镜像", + "value": "1" + }, + { + "text": "私有镜像", + "value": "2" + }, + { + "text": "共享镜像", + "value": "3" + } + ], + "modelValue": "1" + }, + "id": "922b14cb" + }, + { + "componentName": "div", + "props": { + "style": "display: flex; margin-top: 12px; border-radius: 0px;" + }, + "id": "6b679524", + "children": [ + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 170px; margin-right: 10px;" + }, + "id": "4851fff7" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 340px;" + }, + "id": "a7183eb7" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "margin-top: 12px;" + }, + "id": "57aee314", + "children": [ + { + "componentName": "Text", + "props": { + "text": "请注意操作系统的语言类型。", + "style": "color: #e37d29;" + }, + "id": "56d36c27" + } + ] + } + ], + "id": "e3b02436" + } + ], + "id": "59aebf2b" + } + ], + "id": "87ff7b99" + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-radius: 4px; border-color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; margin-bottom: 10px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "系统盘", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex;" + }, + "id": "cddba5b8", + "children": [ + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 200px; margin-right: 10px;" + }, + "id": "a97fbe15" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px; margin-right: 10px;" + }, + "id": "1cde4c0f" + }, + { + "componentName": "Text", + "props": { + "text": "GiB \nIOPS上限240,IOPS突发上限5,000", + "style": "color: #575d6c; font-size: 12px;" + }, + "id": "2815d82d" + } + ] + } + ], + "id": "50239a3a" + } + ], + "id": "e8582986" + }, + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "数据盘", + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "margin-top: 12px; display: flex;" + }, + "id": "728c9825", + "children": [ + { + "componentName": "Icon", + "props": { + "style": "margin-right: 10px; width: 16px; height: 16px;", + "name": "IconPanelMini" + }, + "id": "fded6930" + }, + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "style": "width: 200px; margin-right: 10px;" + }, + "id": "62734e3f" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px; margin-right: 10px;" + }, + "id": "667c7926" + }, + { + "componentName": "Text", + "props": { + "text": "GiB \nIOPS上限600,IOPS突发上限5,000", + "style": "color: #575d6c; font-size: 12px; margin-right: 10px;" + }, + "id": "e7bc36d6" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px;" + }, + "id": "1bd56dc0" + } + ], + "loop": { + "type": "JSExpression", + "value": "this.state.dataDisk" + } + }, + { + "componentName": "div", + "props": { + "style": "display: flex; margin-top: 12px; border-radius: 0px;" + }, + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconPlus", + "style": "width: 16px; height: 16px; margin-right: 10px;" + }, + "id": "65c89f2b" + }, + { + "componentName": "Text", + "props": { + "text": "增加一块数据盘", + "style": "font-size: 12px; border-radius: 0px; margin-right: 10px;" + }, + "id": "cb344071" + }, + { + "componentName": "Text", + "props": { + "text": "您还可以挂载 21 块磁盘(云硬盘)", + "style": "color: #8a8e99; font-size: 12px;" + }, + "id": "80eea996" + } + ], + "id": "e9e530ab" + } + ], + "id": "078e03ef" + } + ], + "id": "ccef886e" + } + ], + "id": "0fb7bd74" + }, + { + "componentName": "div", + "props": { + "style": "border-width: 1px; border-style: solid; border-color: #ffffff; padding-top: 10px; padding-left: 10px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px; background-color: #fff; position: fixed; inset: auto 0% 0% 0%; height: 80px; line-height: 80px; border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "inline": false, + "label-position": "left ", + "label-width": "150px", + "style": "border-radius: 0px;" + }, + "children": [], + "id": "21ed4475" + }, + { + "componentName": "TinyRow", + "props": { + "style": "border-radius: 0px; height: 100%;" + }, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": "8" + }, + "id": "b9d051a5", + "children": [ + { + "componentName": "TinyRow", + "props": { + "style": "border-radius: 0px;" + }, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": "5", + "style": "display: flex;" + }, + "id": "02352776", + "children": [ + { + "componentName": "Text", + "props": { + "text": "购买量", + "style": "margin-right: 10px;" + }, + "id": "0cd9ed5c" + }, + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "style": "width: 120px; margin-right: 10px;" + }, + "id": "2f9cf442" + }, + { + "componentName": "Text", + "props": { + "text": "台" + }, + "id": "facd4481" + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": "7" + }, + "id": "82b6c659", + "children": [ + { + "componentName": "div", + "props": {}, + "id": "9cd65874", + "children": [ + { + "componentName": "Text", + "props": { + "text": "配置费用", + "style": "font-size: 12px;" + }, + "id": "b5a0a0da" + }, + { + "componentName": "Text", + "props": { + "text": "¥1.5776", + "style": "padding-left: 10px; padding-right: 10px; color: #de504e;" + }, + "id": "d9464214" + }, + { + "componentName": "Text", + "props": { + "text": "/小时", + "style": "font-size: 12px;" + }, + "id": "af7cc5e6" + } + ] + }, + { + "componentName": "div", + "props": {}, + "id": "89063830", + "children": [ + { + "componentName": "Text", + "props": { + "text": "参考价格,具体扣费请以账单为准。", + "style": "font-size: 12px; border-radius: 0px;" + }, + "id": "d8995fbc" + }, + { + "componentName": "Text", + "props": { + "text": "了解计费详情", + "style": "font-size: 12px; color: #344899;" + }, + "id": "b383c3e2" + } + ] + } + ] + } + ], + "id": "94fc0e43" + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": "4", + "style": "display: flex; flex-direction: row-reverse; border-radius: 0px; height: 100%; justify-content: flex-start; align-items: center;" + }, + "id": "10b73009", + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "下一步: 网络配置", + "type": "danger", + "style": "max-width: unset;" + }, + "id": "0b584011" + } + ] + } + ], + "id": "d414a473" + } + ], + "id": "e8ec029b" + } + ], + "fileName": "createVm" + }, + "tenant": 1, + "isBody": false, + "parentId": "0", + "group": "staticPages", + "depth": 0, + "isPage": true, + "isDefault": false, + "occupier": { + "id": 86, + "username": "开发者", + "email": "developer@lowcode.com", + "resetPasswordToken": "developer", + "confirmationToken": "dfb2c162-351f-4f44-ad5f-8998", + "is_admin": true + }, + "isHome": false, + "_id": "NTJ4MjvqoVj8OVsc" + }, + { + "name": "ComponentsSetting", + "id": "fh7U0xYetFGA5Ieu", + "app": "918", + "route": "componentsSetting", + "page_content": { + "state": { + "components": [ + { + "name": "表单", + "text": "由按钮、输入框、选择器、单选框、多选框等控件组成..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + }, + { + "name": "按钮", + "text": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮..." + } + ], + "pageConfig": { + "component": { + "type": "JSResource", + "value": "this.utils.Pager" + }, + "attrs": { + "currentPage": 1, + "pageSize": 50, + "pageSizes": [10, 20, 50], + "total": 0, + "layout": "sizes,total, prev, pager, next, jumper" + } + }, + "componentsTotal": 0, + "renderf5956ed2": [ + { + "label": "按更新时间", + "value": "updata", + "_RID": "row_6" + }, + { + "label": "按创建时间", + "value": "create" + } + ], + "renderb52aeac9": [ + { + "framework": "", + "materials": "", + "name": "表单", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "id": "021fd6b6", + "_RID": "row_1" + }, + { + "framework": "", + "materials": "", + "name": "按钮", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型", + "id": "84d239bb", + "_RID": "row_2" + }, + { + "framework": "", + "materials": "", + "name": "表单项", + "description": "Form 组件下的 FormItem 配置", + "id": "490f8a00", + "_RID": "row_3" + }, + { + "framework": "", + "materials": "", + "name": "开关", + "description": "关闭或打开", + "id": "c259b8b3", + "_RID": "row_4" + }, + { + "framework": "", + "materials": "", + "name": "互斥按钮组", + "description": "以按钮组的方式出现,常用于多项类似操作", + "id": "083ed9c7", + "_RID": "row_5" + }, + { + "framework": "", + "materials": "", + "name": "提示框", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画", + "id": "09136cea", + "_RID": "row_6" + }, + { + "framework": "", + "materials": "", + "name": "文字提示框", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信", + "id": "a63b57d5", + "_RID": "row_7" + }, + { + "framework": "", + "materials": "", + "name": "树", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单", + "id": "a0f6e8a3", + "_RID": "row_8" + }, + { + "framework": "", + "materials": "", + "name": "分页", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件", + "id": "d1aa18fc", + "_RID": "row_9" + }, + { + "framework": "", + "materials": "", + "name": "表格", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等", + "id": "ca49cc52", + "_RID": "row_10" + }, + { + "framework": "", + "materials": "", + "name": "搜索框", + "description": "指定条件对象进行搜索数据", + "id": "4e20ecc9" + }, + { + "framework": "", + "materials": "", + "name": "折叠面板", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作", + "id": "6b093ee5" + }, + { + "framework": "", + "materials": "", + "name": "对话框", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作", + "id": "0a09abc0" + }, + { + "framework": "", + "materials": "", + "name": "标签页签项", + "description": "tab页签", + "id": "f814b901" + }, + { + "framework": "", + "materials": "", + "name": "单选", + "description": "用于配置不同场景的选项,在一组备选项中进行单选", + "id": "c5ae797c" + }, + { + "framework": "", + "materials": "", + "name": "弹出编辑", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件", + "id": "33d0c590" + }, + { + "framework": "", + "materials": "", + "name": "下拉框", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件", + "id": "16711dfa" + }, + { + "framework": "", + "materials": "", + "name": "折叠面板项", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作", + "id": "a9fd190a" + }, + { + "framework": "", + "materials": "", + "name": "复选框", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "id": "a7dfa9ec" + }, + { + "framework": "", + "materials": "", + "name": "复选框按钮", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "id": "c9071a7b" + }, + { + "framework": "", + "materials": "", + "name": "输入框", + "description": "通过鼠标或键盘输入字符", + "id": "d4bb8330" + }, + { + "framework": "", + "materials": "", + "name": "时间线", + "description": "时间线", + "id": "ced3dc83" + } + ], + "render7e97d9c7": [ + { + "name": "标签页", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "id": "a2b3e681", + "_RID": "row_1" + }, + { + "name": "走马灯", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现", + "id": "311fd1ae", + "_RID": "row_2" + }, + { + "name": "日期选择器", + "description": "用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式", + "id": "8d38b248", + "_RID": "row_3" + }, + { + "name": "布局列", + "description": "列配置信息", + "id": "1f6940d8" + } + ] + }, + "methods": { + "linkClick": { + "type": "JSFunction", + "value": "function linkClick() {\n location.href = '';\n}" + }, + "query": { + "type": "JSFunction", + "value": "function query(name) {\n this.state.components.fillter((e) => {\n return e.name !== name;\n });\n}" + }, + "getTableData": { + "type": "JSFunction", + "value": "function getTableData() {\n return new Promise((resolve, reject) => {\n this.dataSourceMap['timeData'].load().then((res) => {\n resolve({ result: [], page: { total: 0 } });\n });\n });\n}" + }, + "clearSelected": { + "type": "JSFunction", + "value": "function clearSelected(event) {\n this.dataSourceMap['selectedComponents'].map((e) => {\n this.dataSourceMap['selectedComponents'] = this.dataSourceMap['selectedComponents'] || [];\n this.dataSourceMap['componentList'].push(e);\n });\n this.dataSourceMap['selectedComponents'] = [];\n}" + } + }, + "componentName": "Page", + "css": ".components-box{\r\n height:900px;\r\n display: flex;\r\n}\r\n.components-box-left{\r\n width: 270px;\r\n}\r\n.components-box-right{\r\n width:50%;\r\n}\r\n.components-box-right-add{\r\n width: 100%;\r\n height: 200px;\r\n}\r\n.mgr20{\r\n margin-right: 20px;\r\n}", + "props": {}, + "children": [ + { + "componentName": "div", + "props": {}, + "id": "2a5d4622", + "children": [ + { + "componentName": "TinyGrid", + "props": { + "editConfig": { + "trigger": "click", + "mode": "cell", + "showStatus": true + }, + "columns": [ + { + "type": "index", + "width": 60 + }, + { + "type": "selection", + "width": 60 + }, + { + "field": "employees", + "title": "员工数" + }, + { + "field": "created_date", + "title": "创建日期" + }, + { + "field": "city", + "title": "城市" + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司", + "city": "福州", + "employees": 800, + "created_date": "2014-04-30 00:56:00", + "boole": false + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "employees": 300, + "created_date": "2016-07-08 12:36:22", + "boole": true + } + ] + }, + "id": "3635454e" + } + ] + }, + { + "componentName": "div", + "props": { + "style": "height: 80px; width: 87%; margin: 0 auto; margin-bottom: 20px; margin-top: 20px; padding-left: 20px; padding-top: 30px; background: rgb(242, 245, 252);" + }, + "id": "436ecc4a", + "children": [ + { + "componentName": "Text", + "props": { + "text": " 物料资产包简介", + "style": "color: rgb(138, 142, 153);" + }, + "id": "16ad7aa9" + }, + { + "componentName": "Text", + "props": { + "text": "调试构建报错", + "style": "margin-left: 10px; margin-right: 10px;" + }, + "id": "ab44d8ea" + }, + { + "componentName": "Icon", + "props": { + "name": "IconEdit" + }, + "id": "8b6be3c2" + }, + { + "componentName": "div", + "props": {}, + "id": "848e3e8a", + "children": [ + { + "componentName": "Text", + "props": { + "text": "发布地址", + "style": "color: rgb(138, 142, 153);" + }, + "id": "cd51ad2c" + }, + { + "componentName": "Text", + "props": { + "text": "", + "style": "margin-left: 20px; margin-right: 10px; color: rgb(36, 150, 255);", + "onClick": { + "type": "JSExpression", + "value": "this.linkClick" + } + }, + "id": "3ed13633" + }, + { + "componentName": "Icon", + "props": { + "name": "IconEdit" + }, + "id": "16b75d9f" + } + ] + } + ] + }, + { + "componentName": "div", + "props": { + "className": "components-box", + "style": "width: 88%; margin: 0 auto; border-width: 1px; border-color: rgb(223, 225, 230); border-style: solid; padding-top: 40px; padding-bottom: 40px; height: 1200px;" + }, + "id": "c880007b", + "children": [ + { + "componentName": "div", + "props": { + "className": "components-box-left", + "style": "border-right-width: 2px; border-right-style: solid; border-color: rgb(223, 225, 230); position: relative;" + }, + "id": "3525fc52", + "children": [ + { + "componentName": "TinyTimeLine", + "props": { + "active": "1", + "data": [ + { + "name": "添加组件" + }, + { + "name": "添加区块" + } + ], + "horizontal": false, + "className": "components-box-left", + "vertical": true + }, + "id": "1e391ed7" + }, + { + "componentName": "div", + "props": {}, + "id": "81ccd767", + "children": [ + { + "componentName": "div", + "props": { + "style": "height: 300px; position: absolute; bottom: 20px; left: 20px;" + }, + "id": "bc11d593", + "children": [ + { + "componentName": "div", + "props": {}, + "id": "50ed6e39", + "children": [ + { + "componentName": "Text", + "props": { + "text": "组件示意图 " + }, + "id": "fa6b920c" + } + ] + }, + { + "componentName": "div", + "props": {}, + "id": "9ca346e6", + "children": [ + { + "componentName": "Text", + "props": { + "text": "组件是构建物料资产包的必要元素\n", + "style": "margin-top: 10px; color: rgb(173, 176, 184); margin-bottom: 20px;" + }, + "id": "d0ac5a34" + } + ] + }, + { + "componentName": "Img", + "props": { + "src": "http://localhost:9090/assets/images/f750dc319828b039af713c643aad02bd_222x134.png", + "style": "margin-top: 20px; width: 95%;" + }, + "id": "3eac458c" + } + ] + } + ] + } + ] + }, + { + "componentName": "div", + "props": { + "className": ".components-box-right", + "style": "padding-left: 50px; border-radius: 0px; height: 100%;" + }, + "id": "d0890144", + "children": [ + { + "componentName": "div", + "props": { + "className": "components-box-right-add" + }, + "id": "0c79b824", + "children": [ + { + "componentName": "div", + "props": { + "style": "height: 50px;" + }, + "id": "5dd75633", + "children": [ + { + "componentName": "Text", + "props": { + "text": "已添加", + "style": "font-size: 16px; font-weight: bold;" + }, + "id": "e534646e" + }, + { + "componentName": "div", + "props": { + "style": "display: inline-block;", + "onClick": { + "type": "JSExpression", + "value": "this.clearSelected(event)" + } + }, + "id": "1f3f03e5", + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconUndelete", + "style": "margin-left: 10px; font-size: 20px; color:rgb(94, 124, 224);" + }, + "id": "1ea6eea4" + }, + { + "componentName": "Text", + "props": { + "text": "清空默认", + "style": "color: rgb(94, 124, 224); border-radius: 0px;" + }, + "id": "4f143cd5" + } + ] + } + ] + }, + { + "componentName": "Collection", + "props": { + "style": "height: 140px; display: flex; border-radius: 0px;", + "dataSource": 151 + }, + "id": "9b4f4898", + "children": [ + { + "componentName": "div", + "props": { + "style": "width: 300px; height: 70px; margin-top: 20px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-width: 1px; border-style: solid; border-color: #dfe1e6; display: flex; flex-direction: row; padding-right: 0px; padding-left: 0px; margin-right: 25px; margin-left: 0px; padding-top: 20px; margin-bottom: 20px; position: relative; background: rgb(242, 245, 252); border-radius: 2px;" + }, + "id": "b5f585f9", + "children": [ + { + "componentName": "Img", + "props": { + "style": "width: 50px; height: 50px; margin-left: 20px; margin-top: 0px;", + "src": "http://localhost:9090/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png" + }, + "id": "ee90fa60" + }, + { + "componentName": "div", + "props": { + "style": "width: 200px; margin-left: 12px;" + }, + "id": "7735e4da", + "children": [ + { + "componentName": "Text", + "props": { + "text": { + "type": "JSExpression", + "value": "item.name" + }, + "style": "font-weight: bold;" + }, + "id": "068127b6" + }, + { + "componentName": "Text", + "props": { + "text": "默认", + "style": "position: absolute; right: 2px; top: 2px; font-family: \"Microsoft YaHei\"; color: rgb(255, 255, 255); background: rgb(80, 212, 171); border-radius: 4.5px 0px;" + }, + "id": "6d0281d2" + }, + { + "componentName": "TinyCheckbox", + "props": { + "text": "", + "style": "position: absolute; right: 10px; bottom: 10px; color: rgb(82, 110, 204);", + "checked": { + "type": "JSExpression", + "value": "item.isSelected" + }, + "modelValue": true + }, + "id": "622d9bdf" + }, + { + "componentName": "Text", + "props": { + "text": { + "type": "JSExpression", + "value": "item.description" + }, + "style": "display: block; margin-top: 10px; text-overflow: ellipsis; width: 90%; overflow: hidden; white-space: nowrap;" + }, + "id": "eb87da78" + } + ] + } + ], + "loop": { + "type": "JSExpression", + "value": "this.state.render7e97d9c7" + } + } + ] + } + ] + }, + { + "componentName": "div", + "props": { + "style": "width: 98%; display: flex; margin-bottom: 22px; justify-content: space-between; margin-right: 0px; padding-right: 0px;" + }, + "id": "c7f80c55", + "children": [ + { + "componentName": "Text", + "props": { + "text": "选择组件", + "style": "font-size: 16px; font-weight: bold;" + }, + "id": "2ebef929" + }, + { + "componentName": "div", + "props": { + "style": "display: flex;" + }, + "id": "00a6fb16", + "children": [ + { + "componentName": "TinySearch", + "props": { + "modelValue": "", + "placeholder": "输入关键词", + "style": "width: 295px; margin-right: 12px;", + "onChange": { + "type": "JSExpression", + "value": "this.query" + } + }, + "id": "d7364e4d" + }, + { + "componentName": "Collection", + "props": { + "dataSource": 129 + }, + "id": "03a2f95b", + "children": [ + { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": { + "type": "JSExpression", + "value": "this.state.renderf5956ed2" + }, + "style": "border-radius: 0px; margin-right: 0px;" + }, + "id": "181b5ab7" + } + ] + } + ] + } + ] + }, + { + "componentName": "Collection", + "props": { + "dataSource": 150, + "style": "margin-left: 0px; margin-right: 314px; display: flex; justify-content: flex-start; flex-wrap: wrap; width: 98%; over-flow: hidden; border-radius: 0px;" + }, + "id": "2b24a6d3", + "children": [ + { + "componentName": "div", + "props": { + "style": "padding-top: 20px; padding-left: 12px; padding-right: 12px; width: 280px; height: 92px; background: rgb(255, 255, 255); border-width: 1px; border-color: rgb(223, 225, 230); border-style: solid; border-radius: 2px; padding-bottom: 20px; display: flex; margin-right: 0px; margin-bottom: 20px; margin-left: 20px;" + }, + "id": "8a6e5b83", + "children": [ + { + "componentName": "Img", + "props": { + "style": "width: 40px; height: 40px;", + "src": "http://localhost:9090/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png" + }, + "id": "474ffcb2" + }, + { + "componentName": "div", + "props": { + "style": "margin-left: 12px; border-radius: 0px; width: 90%;" + }, + "id": "99944a57", + "children": [ + { + "componentName": "div", + "props": { + "style": "display: flex; justify-content: space-between;" + }, + "id": "b5c88120", + "children": [ + { + "componentName": "Text", + "props": { + "text": { + "type": "JSExpression", + "value": "item.name" + }, + "style": "font-weight: bold; border-radius: 0px;" + }, + "id": "a747169d" + }, + { + "componentName": "TinyCheckbox", + "props": { + "text": "", + "checked": false, + "modelValue": { + "type": "JSExpression", + "value": "item.isSelected", + "model": true + }, + "style": "border-radius: 0px;" + }, + "id": "72cee0e5" + } + ] + }, + { + "componentName": "Text", + "props": { + "style": "display: block; font-size: 12px; line-height: 17px; color: #333333; margin-top: 10px;", + "text": { + "type": "JSExpression", + "value": "item.description" + } + }, + "id": "1aed3258" + } + ] + } + ], + "loop": { + "type": "JSExpression", + "value": "this.state.renderb52aeac9" + }, + "condition": true, + "loopArgs": ["item", "idx"] + } + ] + }, + { + "componentName": "TinyPager", + "props": { + "layout": "sizes,total, prev, pager, next", + "total": { + "type": "JSExpression", + "value": "this.state.componentsTotal" + }, + "pageSize": 10, + "currentPage": 1, + "style": "margin-left: 314px; margin-right: 314px;" + }, + "id": "ff96cc4e" + } + ] + } + ] + }, + { + "componentName": "div", + "props": { + "style": "height: 100px; background: rgb(255, 255, 255); filter: drop-shadow(rgba(0, 0, 0, 0.1) 0px -1px 4px); text-align: center;" + }, + "id": "616d5f40", + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "创建物料资产包", + "style": "background: rgb(245, 245, 246); border-width: 1px; border-color: rgb(173, 176, 184); border-style: solid; border-radius: 2.5px; opacity: 0.6; margin: 0 auto; width: 200px; height: 32px; margin-top: 30px; max-width: none; margin-bottom: 10px;" + }, + "id": "e6abff72" + }, + { + "componentName": "Text", + "props": { + "style": "display: block; color: rgb(173, 176, 184); margin-top: 5px; width: 380px; margin: 0 auto;", + "text": "组件或区块未添加,请切换左侧步骤条去完成添加" + }, + "id": "f3a123ba", + "children": [ + { + "componentName": "Icon", + "props": {} + } + ] + } + ] + } + ], + "fileName": "componentsSetting" + }, + "tenant": 1, + "isBody": false, + "parentId": "0", + "group": "staticPages", + "depth": 0, + "isPage": true, + "isDefault": false, + "occupier": { + "id": 86, + "username": "开发者", + "email": "developer@lowcode.com", + "resetPasswordToken": "developer", + "confirmationToken": "dfb2c162-351f-4f44-ad5f-8998", + "is_admin": true + }, + "isHome": true, + "_id": "fh7U0xYetFGA5Ieu" + } + ], + "blockHistories": [ + { + "id": 1655, + "message": "build block 989", + "content": { + "state": { + "logoUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAF8CAYAAADM5wDKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OEVGOTU4RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI5OEVGOTU5RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Mjk4RUY5NTZFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Mjk4RUY5NTdFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4dZkpJAAAvNElEQVR42uyd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", + "loginImgUrl": "data:image/png;base64,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" + }, + "componentName": "Block", + "css": ".home-content {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n text-align: center;\r\n height: calc(100vh - 262px);\r\n \r\n}\r\n.home-content .btn {\r\n margin-top: 24px;\r\n \r\n }\r\n .home-content .btn button {\r\n border: none;\r\n border-radius: 30px;\r\n background: #5e7ce0;\r\n \r\n font-size: 14px;\r\n color: #fff;\r\n \r\n cursor: pointer;\r\n }\r\n\r\n .home-content .text {\r\n font-size: 18px;\r\n }\r\n\r\n .home-content .account {\r\n margin-top: 16px;\r\n \r\n \r\n }\r\n\r\n .home-content .account .sub-text {\r\n color: #575d6c;\r\n }\r\n .home-content .account .login {\r\n color: #1890ff;\r\n cursor: pointer;\r\n }\r\n .home-content .logo img{\r\n border-radius: 50%;\r\n overflow: hidden;\r\n }", + "props": {}, + "children": [ + { + "componentName": "div", + "props": { + "className": "home", + "style": "height: 100vh; display: flex;" + }, + "id": "357534ab", + "children": [ + { + "componentName": "TinyRow", + "props": { + "align": "middle", + "flex": true, + "style": "" + }, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": 6, + "style": "text-align: center; display: flex; justify-content: center;" + }, + "id": "f01b66ea", + "children": [ + { + "componentName": "div", + "props": { + "style": "width: 90%; height: 50%;" + }, + "id": "8197d016", + "children": [ + { + "componentName": "Img", + "props": { + "style": "width: 100%; height: 100%;", + "src": { + "type": "JSExpression", + "value": "this.state.loginImgUrl" + } + }, + "id": "471e30f3" + } + ] + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": "6", + "style": "text-align: center;" + }, + "id": "781d5b46", + "children": [ + { + "componentName": "div", + "props": { + "className": "home-content", + "style": "font-size: 14px;" + }, + "id": "08638b8a", + "children": [ + { + "componentName": "div", + "props": { + "className": "text" + }, + "id": "18712ee2", + "children": [ + { + "componentName": "div", + "props": { + "style": "font-size: 16px;" + }, + "id": "07e6794c", + "children": [ + { + "componentName": "div", + "props": { + "className": "logo" + }, + "id": "07cad264", + "children": [ + { + "componentName": "Img", + "props": { + "style": "width: 105px; height: 105px; border-radius: 100px;", + "src": { + "type": "JSExpression", + "value": "this.state.logoUrl" + } + }, + "id": "f4489e27" + } + ] + }, + { + "componentName": "Text", + "props": { + "text": "TinyLowCode 低代码平台", + "style": "display: block; font-size: 28px; margin-top: 12px; margin-bottom: 12px; font-weight: bold;", + "ref": "", + "className": "title" + }, + "id": "e82108ce" + }, + { + "componentName": "Text", + "props": { + "text": "致力于通过友好的用户交互提升业务的开发效率", + "style": "display: block; margin-bottom: 12px;" + }, + "id": "65a2f1ad" + }, + { + "componentName": "Text", + "props": { + "text": "欢迎一起来解锁~~", + "style": "margin-top: 12px;" + }, + "id": "bb879abb" + } + ] + }, + { + "componentName": "div", + "props": { + "className": "btn" + }, + "id": "44b2bcbd", + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "立即体验", + "round": true, + "type": "primary", + "style": "margin-top: 40px;" + }, + "id": "9580c5e7" + }, + { + "componentName": "div", + "props": { + "className": "account" + }, + "id": "6a8ffa3e", + "children": [ + { + "componentName": "div", + "props": { + "style": "font-size: 14px; margin-top: 4px;" + }, + "id": "bfc6eb6c", + "children": [ + { + "componentName": "Text", + "props": { + "text": "已有团队?", + "style": "color: #777777;" + }, + "id": "3d993264" + }, + { + "componentName": "Text", + "props": { + "text": "立即进入", + "style": "color: #5e7ce0;", + "onClick": { + "type": "JSExpression", + "value": "this.handleClick(event)" + } + }, + "id": "21390118" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ], + "id": "4545fea2" + } + ] + } + ], + "methods": { + "handleClick": { + "type": "JSFunction", + "value": "function (event) {this.emit('goto-home', event)\n}" + } + }, + "fileName": "PortalHome", + "meta": { + "id": 1722, + "parentId": "0", + "group": "staticPages", + "title": null, + "occupier": null, + "isHome": false, + "description": "", + "router": "/", + "rootElement": "div", + "creator": "开发者", + "gmt_create": "2022-06-08 03:25:51", + "gmt_modified": "2022-06-09 05:19:09" + }, + "id": 1722, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [] + } + ], + "events": { + "onGotoHome": { + "label": { + "zh_CN": "点击立即进入触发方法" + }, + "description": { + "zh_CN": "点击立即进入触发方法" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "", + "linked": { + "id": "21390118", + "componentName": "Text", + "event": "onClick" + } + } + }, + "slots": {} + }, + "dataSource": {}, + "i18n": {} + }, + "assets": { + "material": [], + "scripts": [ + "http://localhost:9090/assets/js/989web-components.es.js", + "http://localhost:9090/assets/js/989web-components.umd.js" + ], + "styles": [] + }, + "created_by": null, + "updated_by": null, + "created_at": "2023-01-13T08:12:49.000Z", + "updated_at": "2023-01-13T08:12:49.000Z", + "screenshot": "", + "path": "common/components/home", + "label": "PortalHome", + "description": null, + "mode": null, + "block_id": 989, + "version": "1.0.0", + "publishConfig": { + "access": "public" + }, + "i18n": null, + "created_app": null, + "content_blocks": null + }, + { + "id": 1005, + "label": "PortalBlock", + "framework": "Vue", + "content": { + "state": {}, + "methods": {}, + "componentName": "Block", + "fileName": "PortalBlock", + "css": "", + "props": {}, + "children": [ + { + "componentName": "div", + "props": { + "style": "font-size: 18px; height: 40px; border-bottom: 1px solid rgb(223, 225, 230); margin-top: 20px;" + }, + "id": "d38cea57", + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconChevronLeft" + }, + "id": "86c6e6b0" + }, + { + "componentName": "Text", + "props": { + "text": "编辑物料资产包 | ", + "style": "margin-left: 10px; font-weight: bold;" + }, + "id": "38d9fbc8" + }, + { + "componentName": "Text", + "props": { + "text": { + "type": "JSExpression", + "value": "this.props.blockName" + }, + "style": "margin-left: 10px; font-weight: bold;" + }, + "id": "6cd76396" + } + ] + } + ], + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "blockName", + "type": "String", + "defaultValue": "MT0526-React 1.0", + "label": { + "text": { + "zh_CN": "区块名称" + } + }, + "cols": 12, + "rules": [], + "handle": { + "getter": "", + "setter": "" + }, + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": { + "modelValue": "MT0526-React 1.0" + } + } + } + ] + } + ], + "events": {}, + "slots": {} + }, + "dataSource": {} + }, + "created_at": "2022-06-28T08:59:54.000Z", + "updated_at": "2023-01-13T08:20:09.000Z", + "assets": { + "material": [], + "scripts": [ + "http://localhost:9090/assets/js/1005web-components.es.js", + "http://localhost:9090/assets/js/1005web-components.umd.js" + ], + "styles": [] + }, + "createdBy": { + "id": 86, + "username": "开发者", + "resetPasswordToken": "developer" + }, + "description": null, + "tags": null, + "current_history": 1665, + "screenshot": "", + "path": "portal", + "occupier": { + "id": 86, + "username": "开发者", + "resetPasswordToken": "developer" + }, + "isOfficial": null, + "public": 1, + "isDefault": null, + "tiny_reserved": false, + "author": null, + "name_cn": null, + "created_app": null, + "content_blocks": null, + "categories": [], + "public_scope_tenants": [], + "histories_length": 1 + } + ], + "materialHistory": { + "id": 639, + "name": "materialstwo", + "material_version": "", + "version": "1.0.8", + "framework": "Vue", + "material": 1505, + "content": { + "data": { + "framework": "Vue", + "materials": { + "blocks": [], + "snippets": [{}], + "components": [ + { + "name": { + "zh_CN": "走马灯子项" + }, + "component": "TinyCarouselItem", + "icon": "carouselitem", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现。", + "doc_url": "", + "screenshot": "screenshoot", + "tags": "tiny-carousel-item", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CarouselItem", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "snippets": [], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-06-23T12:05:38.000Z", + "updated_at": "2022-06-27T06:51:25.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "幻灯片的名字,可用作 setActiveItem 的参数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "幻灯片的标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "复选框按钮" + }, + "component": "TinyCheckboxButton", + "icon": "checkboxbutton", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "doc_url": "", + "screenshot": "screenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CheckboxButton", + "version": "0.1.17", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["remove", "copy", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-06-17T06:42:16.000Z", + "updated_at": "2022-06-27T08:31:33.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的是否选中的状态值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "checked", + "label": { + "text": { + "zh_CN": "勾选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当前是否勾选" + }, + "labelPosition": "left" + }, + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "按钮文本" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "是否选中的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的是否选中的状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "树" + }, + "component": "TinyTree", + "icon": "tree", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单", + "doc_url": "", + "screenshot": "null", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tree", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "数据组件", + "priority": 12, + "snippets": [ + { + "name": { + "zh_CN": "树" + }, + "icon": "tree", + "screenshot": "", + "snippetName": "TinyTree", + "schema": { + "componentName": "TinyTree", + "props": { + "data": [ + { + "label": "一级 1", + "children": [ + { + "label": "二级 1-1", + "children": [ + { + "label": "三级 1-1-1" + } + ] + } + ] + }, + { + "label": "一级 2", + "children": [ + { + "label": "二级 2-1", + "children": [ + { + "label": "三级 2-1-1" + } + ] + }, + { + "label": "二级 2-2", + "children": [ + { + "label": "三级 2-2-1" + } + ] + } + ] + } + ] + } + } + } + ], + "configure": { + "loop": false, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["show-checkbox"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:31:12.000Z", + "updated_at": "2022-06-30T10:55:59.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "show-checkbox", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置接口是否可以多选" + }, + "labelPosition": "left" + }, + { + "property": "data", + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": [ + { + "label": "一级 1", + "children": [ + { + "label": "二级 1-1" + } + ] + } + ], + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "可配置静态数据源和动态数据源" + } + }, + { + "property": "node-key", + "label": { + "text": { + "zh_CN": "唯一标识" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "节点唯一标识属性名称" + }, + "labelPosition": "left" + }, + { + "property": "icon-trigger-click-node", + "label": { + "text": { + "zh_CN": "触发NodeClick 事件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "点击图标展开节点时是否触发 node-click 事件" + }, + "labelPosition": "left" + }, + { + "property": "expand-icon", + "label": { + "text": { + "zh_CN": "展开图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点展开图标" + }, + "labelPosition": "left" + }, + { + "property": "shrink-icon", + "label": { + "text": { + "zh_CN": "收缩图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点收缩的图标" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "check-on-click-node", + "label": { + "text": { + "zh_CN": "点击节点选中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点" + }, + "labelPosition": "left" + }, + { + "property": "filter-node-method", + "label": { + "text": { + "zh_CN": "筛选函数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点筛选函数" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onCheck": { + "label": { + "zh_CN": "勾选节点后的事件" + }, + "description": { + "zh_CN": "勾选节点后的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中节点信息" + } + }, + { + "name": "currentNode", + "type": "object", + "defaultValue": "", + "description": { + "zh_CN": "树组件目前的选中状态信息,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onNodeClick": { + "label": { + "zh_CN": "点击节点后的事件" + }, + "description": { + "zh_CN": "点击节点后的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中节点信息" + } + }, + { + "name": "node", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "树组件目前的选中状态信息,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性" + } + }, + { + "name": "vm", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "树组件实例" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "提示框" + }, + "component": "TinyPopover", + "icon": "popover", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画", + "doc_url": "", + "screenshot": "null", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Popover", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "提示组件", + "priority": 7, + "snippets": [ + { + "name": { + "zh_CN": "提示框" + }, + "icon": "popover", + "screenshot": "", + "snippetName": "TinyPopover", + "schema": { + "componentName": "TinyPopover", + "props": { + "width": 200, + "title": "弹框标题", + "trigger": "manual", + "modelValue": true + }, + "children": [ + { + "componentName": "Template", + "props": { + "slot": "reference" + }, + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "触发源" + } + } + ] + }, + { + "componentName": "Template", + "props": { + "slot": "default" + }, + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "提示内容" + } + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["placement", "trigger"] + }, + "contextMenu": { + "actions": ["createBlock", "copy"], + "disable": ["copy", "remove"] + }, + "slots": ["reference"], + "isPopper": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:17:18.000Z", + "updated_at": "2022-07-04T06:23:19.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "双向绑定,手动控制是否可见的状态值" + }, + "labelPosition": "left" + }, + { + "property": "placement", + "label": { + "text": { + "zh_CN": "位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + }, + { + "label": "left", + "value": "left" + }, + { + "label": "left-start", + "value": "left-start" + }, + { + "label": "left-end", + "value": "left-end" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "right-start", + "value": "right-start" + }, + { + "label": "right-end", + "value": "right-end" + } + ] + } + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "left" + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "触发方式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "click", + "value": "click" + }, + { + "label": "focus", + "value": "focus" + }, + { + "label": "hover", + "value": "hover" + }, + { + "label": "manual", + "value": "manual" + } + ] + } + }, + "description": { + "zh_CN": "触发方式,该属性的可选值为 click / focus / hover / manual,该属性的默认值为 click" + } + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "自定义类" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "为 popper 添加类名" + }, + "labelPosition": "left" + }, + { + "property": "visible-arrow", + "label": { + "text": { + "zh_CN": "显示箭头" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示 Tooltip 箭头" + } + }, + { + "property": "append-to-body", + "label": { + "text": { + "zh_CN": "添加到body上" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "Popover弹窗是否添加到body上" + } + }, + { + "property": "arrow-offset", + "label": { + "text": { + "zh_CN": "箭头的位置偏移" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "箭头的位置偏移,该属性的默认值为 0" + } + }, + { + "property": "close-delay", + "label": { + "text": { + "zh_CN": "隐藏延迟" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "触发方式为 hover 时的隐藏延迟,单位为毫秒" + } + }, + { + "property": "content", + "label": { + "text": { + "zh_CN": "显示的内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot 传入 DOM" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "Popover 是否可用" + } + }, + { + "property": "offset", + "label": { + "text": { + "zh_CN": "位置偏移量" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "出现位置的偏移量" + } + }, + { + "property": "open-delay", + "label": { + "text": { + "zh_CN": "显示延迟" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "触发方式为 hover 时的显示延迟,单位为毫秒" + } + }, + { + "property": "popper-options", + "label": { + "text": { + "zh_CN": "popper.js的参数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "popper.js 的参数" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标题" + } + }, + { + "property": "transform-origin", + "label": { + "text": { + "zh_CN": "旋转中心点" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "组件的旋转中心点,组件的旋转中心点" + } + }, + { + "property": "transition", + "label": { + "text": { + "zh_CN": "定义渐变动画" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "该属性的默认值为 fade-in-linear" + } + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "宽度" + } + } + ] + } + ], + "events": { + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "手动控制是否可见的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的可见状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "文字提示框" + }, + "component": "TinyTooltip", + "icon": "tooltip", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信", + "doc_url": "", + "screenshot": "null", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tooltip", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "提示组件", + "priority": 11, + "snippets": [ + { + "name": { + "zh_CN": "文字提示框" + }, + "icon": "tooltip", + "screenshot": "", + "snippetName": "TinyTooltip", + "schema": { + "componentName": "TinyTooltip", + "props": { + "content": "Top Left 提示文字", + "placement": "top-start", + "manual": true, + "modelValue": true + }, + "children": [ + { + "componentName": "span", + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "触发源" + } + } + ] + }, + { + "componentName": "Template", + "props": { + "slot": "content" + }, + "children": [ + { + "componentName": "span", + "children": [ + { + "componentName": "div", + "props": { + "placeholder": "触发源" + } + } + ] + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "", "size"] + }, + "contextMenu": { + "actions": ["createBlock", "copy", "remove", "insert", "updateAttr", "bindEevent"], + "disable": [] + }, + "slots": ["content"], + "isPopper": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:22:59.000Z", + "updated_at": "2022-07-04T06:24:18.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 20, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "placement", + "label": { + "text": { + "zh_CN": "提示位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + }, + { + "label": "left", + "value": "left" + }, + { + "label": "left-start", + "value": "left-start" + }, + { + "label": "left-end", + "value": "left-end" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "right-start", + "value": "right-start" + }, + { + "label": "right-end", + "value": "right-end" + } + ] + } + }, + "description": { + "zh_CN": "Tooltip 的出现位置" + }, + "labelPosition": "left" + }, + { + "property": "content", + "label": { + "text": { + "zh_CN": "内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "提示信息", + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot#content 传入 DOM" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "是否可见" + } + }, + "defaultValue": true, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "状态是否可见" + } + }, + { + "property": "manual", + "label": { + "text": { + "zh_CN": "手动控制" + } + }, + "defaultValue": true, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "手动控制模式,设置为 true 后,mouseenter 和 mouseleave 事件将不会生效" + } + } + ] + } + ], + "events": {}, + "slots": { + "content": { + "label": { + "zh_CN": "提示内容" + }, + "description": { + "zh_CN": "自定义提示内容" + } + } + } + } + }, + { + "name": { + "zh_CN": "布局列" + }, + "component": "TinyCol", + "icon": "col", + "description": "列配置信息", + "doc_url": "", + "screenshot": "colscreenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Col", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "布局组件", + "priority": 20, + "snippets": [ + { + "name": { + "zh_CN": "Col" + }, + "icon": "col", + "screenshot": "", + "snippetName": "TinyCol", + "schema": { + "componentName": "TinyCol", + "props": { + "span": 12, + "style": { + "height": "30px", + "border": "1px solid #ccc" + } + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "TinyRow", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["span"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:40:08.000Z", + "updated_at": "2022-07-15T02:22:42.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "span", + "label": { + "text": { + "zh_CN": "栅格列格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "整行", + "value": 12 + }, + { + "label": "6格", + "value": 6 + }, + { + "label": "4格", + "value": 4 + }, + { + "label": "3格", + "value": 3 + }, + { + "label": "1格", + "value": 1 + } + ] + } + }, + "description": { + "zh_CN": "当一行分为12格时,一列可占位多少格" + } + }, + { + "property": "move", + "label": { + "text": { + "zh_CN": "栅格左右移动格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": -12, + "max": 12 + } + }, + "description": { + "zh_CN": "栅格左右移动格数(正数向右,负数向左)" + } + }, + { + "property": "no", + "label": { + "text": { + "zh_CN": "排序编号" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "max": 12 + } + }, + "description": { + "zh_CN": "排序编号(row中启用order生效)" + } + }, + { + "property": "offset", + "label": { + "text": { + "zh_CN": "间隔格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 0, + "max": 12 + } + }, + "description": { + "zh_CN": "栅格左侧的间隔格数" + } + }, + { + "property": "xs", + "label": { + "text": { + "zh_CN": "超小屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "<768px 响应式栅格数" + } + }, + { + "property": "sm", + "label": { + "text": { + "zh_CN": "小屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥768px 响应式栅格数" + } + }, + { + "property": "md", + "label": { + "text": { + "zh_CN": "中屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥992px 响应式栅格数" + } + }, + { + "property": "lg", + "label": { + "text": { + "zh_CN": "大屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥1200px 响应式栅格数" + } + }, + { + "property": "xl", + "label": { + "text": { + "zh_CN": "超大屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥1920px 响应式栅格数" + } + } + ] + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "下拉菜单子项" + }, + "component": "TinyDropdownItem", + "icon": "dropdown", + "description": "下拉菜单子项", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DropdownItem", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "导航组件", + "priority": 2, + "snippets": [{}], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "TinyDropdownMenu", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-09T03:31:38.000Z", + "updated_at": "2022-11-10T03:47:10.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "divided", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": "显示分割线", + "_RID": "row_1" + }, + { + "property": "disabled", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_3" + }, + { + "property": "icon", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "菜单项", + "_RID": "row_2" + }, + { + "property": "label", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "菜单项标签", + "_RID": "row_1" + } + ], + "slots": { + "default": { + "label": { + "zh_CN": "default" + }, + "description": { + "zh_CN": "下拉列表选项内容" + } + } + } + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "icon", + "label": { + "text": { + "zh_CN": "图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "divided", + "label": { + "text": { + "zh_CN": "显示分割线" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": [], + "slots": { + "default": { + "label": { + "zh_CN": "default" + }, + "description": { + "zh_CN": "下拉列表选项内容" + } + } + } + } + }, + { + "name": { + "zh_CN": "分页" + }, + "component": "TinyPager", + "icon": "pager", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件", + "doc_url": "", + "screenshot": "null", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Pager", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "数据组件", + "priority": 1, + "snippets": [ + { + "name": { + "zh_CN": "分页" + }, + "icon": "pager", + "screenshot": "", + "snippetName": "TinyPager", + "schema": { + "componentName": "TinyPager", + "props": { + "layout": "total, sizes, prev, pager, next", + "total": 100, + "pageSize": 10, + "currentPage": 1 + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "", "size"] + }, + "contextMenu": { + "actions": [], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:36:23.000Z", + "updated_at": "2022-11-26T02:45:29.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "current-change", + "label": "切换页码触发事件", + "params": null, + "defaultValue": null, + "description": "\tcurrentPage 改变时会触发;arg1: 新的当前页的值", + "_RID": "row_1" + }, + { + "eventName": "size-change", + "label": "分页事件", + "params": null, + "defaultValue": null, + "description": "设置分页跳转后的事件;pageSize 改变时会触发;arg1: pageSize 新的当前值", + "_RID": "row_2" + } + ], + "attrs": [], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "currentPage", + "label": { + "text": { + "zh_CN": "当前页数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "当前页数,支持 .sync 修饰符" + }, + "labelPosition": "left" + }, + { + "property": "pageSize", + "label": { + "text": { + "zh_CN": "每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "每页显示条目个数" + }, + "labelPosition": "left" + }, + { + "property": "pageSizes", + "label": { + "text": { + "zh_CN": "可选每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置可选择的每页显示条数" + } + }, + { + "property": "total", + "label": { + "text": { + "zh_CN": "总条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "数据总条数" + }, + "labelPosition": "left" + }, + { + "property": "layout", + "label": { + "text": { + "zh_CN": "布局" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "value": "total,sizes,prev, pager, next" + } + }, + "description": { + "zh_CN": "组件布局,子组件名用逗号分隔" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onCurrent-change": { + "label": { + "zh_CN": "切换页码触发事件" + }, + "description": { + "zh_CN": "\tcurrentPage 改变时会触发;arg1: 新的当前页的值" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onSize-change": { + "label": { + "zh_CN": "分页事件" + }, + "description": { + "zh_CN": "设置分页跳转后的事件;pageSize 改变时会触发;arg1: pageSize 新的当前值" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + }, + "slots": [] + } + }, + { + "name": { + "zh_CN": "访问受限页面" + }, + "component": "TinyPlusAccessdeclined", + "icon": "accessdeclined", + "description": "访问受限页面组件", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "受限", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "AccessDeclined", + "version": "3.4.1", + "destructuring": true + }, + "group": "component", + "category": "业务组件", + "priority": 1, + "snippets": [ + { + "name": { + "zh_CN": "访问受限页面" + }, + "icon": "accessdeclined", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyPlusAccessdeclined", + "schema": { + "componentName": "TinyPlusAccessdeclined", + "props": { + "description": "非常抱歉,您尚未有该服务的访问权限,请联系管理员申请权限。", + "linkText": "返回华为云首页", + "linkHref": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-21T07:08:03.000Z", + "updated_at": "2023-01-18T06:35:58.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "description", + "label": null, + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_1" + } + ], + "attrs": [ + { + "property": "image", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_4" + }, + { + "property": "linkHref", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_3" + }, + { + "property": "linkText", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "description", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "description", + "label": { + "text": { + "zh_CN": "description" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "linkText", + "label": { + "text": { + "zh_CN": "linkText" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "linkHref", + "label": { + "text": { + "zh_CN": "linkHref" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "image", + "label": { + "text": { + "zh_CN": "image" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "冻结页面" + }, + "component": "TinyPlusFrozenPage", + "icon": "frozenpage", + "description": "冻结页面组件", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "冻结", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "FrozenPage", + "version": "3.4.1", + "destructuring": true + }, + "group": "component", + "category": "业务组件", + "priority": 4, + "snippets": [ + { + "name": { + "zh_CN": "冻结页面" + }, + "icon": "frozenpage", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyPlusFrozenPage", + "schema": { + "componentName": "TinyPlusFrozenPage", + "props": { + "description": "非常抱歉,您尚未有该服务的访问权限,请联系管理员申请权限。", + "linkText": "返回华为云首页", + "linkHref": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-22T08:56:31.000Z", + "updated_at": "2023-01-18T06:36:15.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "image", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_25" + }, + { + "property": "linkHref", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_24" + }, + { + "property": "linkText", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_23" + }, + { + "property": "description", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_22" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "description", + "label": { + "text": { + "zh_CN": "description" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "linkText", + "label": { + "text": { + "zh_CN": "linkText" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "linkHref", + "label": { + "text": { + "zh_CN": "linkHref" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "image", + "label": { + "text": { + "zh_CN": "image" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": [] + } + }, + { + "name": { + "zh_CN": "区域服务不支持页面" + }, + "component": "TinyPlusNonSupportRegion", + "icon": "nonsupportregion", + "description": "区域服务不支持页面组件", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "NonSupportRegion", + "version": "3.4.1", + "destructuring": true + }, + "group": "component", + "category": "业务组件", + "priority": 5, + "snippets": [ + { + "name": { + "zh_CN": "区域服务不支持页面" + }, + "icon": "nonsupportregion", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyPlusNonSupportRegion", + "schema": { + "componentName": "TinyPlusNonSupportRegion", + "props": { + "regionData": { + "region": { + "displayName": "奥丁" + }, + "supportRegions": [ + { + "displayName": "华北-北京一", + "href": "1" + }, + { + "displayName": "华东-上海二", + "href": "1" + }, + { + "displayName": "华南-广州", + "href": "1" + } + ] + } + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-22T11:18:52.000Z", + "updated_at": "2023-01-18T06:36:24.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "image", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_21" + }, + { + "property": "regionData", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_20" + }, + { + "property": "regionData", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_20" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "regionData", + "label": { + "text": { + "zh_CN": "regionData" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "image", + "label": { + "text": { + "zh_CN": "image" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": [] + } + }, + { + "name": { + "zh_CN": "公测" + }, + "component": "TinyPlusBeta", + "icon": "beta", + "description": "公测组件", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "公测", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Beta", + "version": "3.4.1", + "destructuring": true + }, + "group": "component", + "category": "业务组件", + "priority": 3, + "snippets": [ + { + "name": { + "zh_CN": "公测" + }, + "icon": "beta", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyPlusBeta", + "schema": {} + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-22T08:13:37.000Z", + "updated_at": "2023-01-18T06:36:53.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "message", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_4" + }, + { + "property": "intro", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_3" + }, + { + "property": "icon", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "applyUrl", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "applyUrl", + "label": { + "text": { + "zh_CN": "applyUrl" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "icon", + "label": { + "text": { + "zh_CN": "icon" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "intro", + "label": { + "text": { + "zh_CN": "intro" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "message", + "label": { + "text": { + "zh_CN": "message" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": [] + } + }, + { + "name": { + "zh_CN": "搜索框" + }, + "component": "TinySearch", + "icon": "search", + "description": "指定条件对象进行搜索数据", + "doc_url": "", + "screenshot": "searchscreenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Search", + "version": "0.1.13", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "搜索框" + }, + "icon": "search", + "screenshot": "", + "snippetName": "TinySearch", + "schema": { + "componentName": "TinySearch", + "props": { + "modelValue": "", + "placeholder": "输入关键词" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["clearable", "", "mini"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "createBlock", "bindEevent"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:47:45.000Z", + "updated_at": "2023-02-16T03:13:14.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "search", + "label": "搜索的回调", + "params": null, + "defaultValue": null, + "description": "在展开状态点击搜索按钮时触发的回调函数;arg1:{Object 搜索类型},arg2:{String 当前input框中值}", + "_RID": "row_1" + }, + { + "eventName": "mouseout", + "label": "鼠标离开", + "params": null, + "defaultValue": null, + "description": "鼠标离开时候触发该时间", + "_RID": "row_2" + } + ], + "attrs": [ + { + "property": "isEnterSearch", + "type": "boolean", + "defaultValue": "false", + "enumerateValue": null, + "title": "是否在按下键盘Enter键的时候触发search事件", + "_RID": "row_1" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "button-text", + "type": "string", + "defaultValue": "搜索", + "enumerateValue": null, + "title": null, + "_RID": "row_2" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "默认值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的搜索值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本 " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框内的提示占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清空按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置显示清空图标按钮" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他配置" + }, + "content": [ + { + "property": "mini", + "label": { + "text": { + "zh_CN": "迷你尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "迷你模式,配置为true时,搜索默认显示为一个带图标的圆形按钮,点击后展开" + }, + "labelPosition": "left" + }, + { + "property": "transparent", + "label": { + "text": { + "zh_CN": "透明模式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "配置为true时,边框变为透明且收缩后半透明显示,一般用在带有背景的场景,默认 false" + }, + "labelPosition": "left" + }, + { + "property": "isEnterSearch", + "label": { + "text": { + "zh_CN": "isEnterSearch" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "button-text", + "label": { + "text": { + "zh_CN": "button-text" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "自定义搜索框按钮的文本内容" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onSearch": { + "label": { + "zh_CN": "搜索的回调" + }, + "description": { + "zh_CN": "在展开状态点击搜索按钮时触发的回调函数;arg1:{Object 搜索类型},arg2:{String 当前input框中值}" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onMouseout": { + "label": { + "zh_CN": "鼠标离开" + }, + "description": { + "zh_CN": "鼠标离开时候触发该时间" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + } + } + }, + { + "name": { + "zh_CN": "布局行" + }, + "component": "TinyRow", + "icon": "row", + "description": "定义 Layout 的行配置信息", + "doc_url": "", + "screenshot": "rowscreenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Row", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "布局组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "Row" + }, + "icon": "row", + "screenshot": "", + "snippetName": "TinyRow", + "schema": { + "componentName": "TinyRow", + "props": {}, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": 3, + "style": "height:100%;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "height: 100%;" + } + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": 3, + "style": "height:100%;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "height: 100%;" + } + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": 3, + "style": "height:100%;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "height: 100%;" + } + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": 3, + "style": "height:100%;" + }, + "children": [ + { + "componentName": "div", + "props": { + "style": "height: 100%;" + } + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "TinyCol", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["flex", "align"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:02:47.000Z", + "updated_at": "2023-02-16T03:53:28.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_44" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "layout", + "label": { + "text": { + "zh_CN": "layout" + } + }, + "cols": 12, + "widget": { + "component": "MetaLayoutGrid", + "props": {} + }, + "description": { + "zh_CN": "layout" + }, + "labelPosition": "none" + }, + { + "property": "align", + "label": { + "text": { + "zh_CN": "align" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "middle", + "value": "middle" + }, + { + "label": "bottom", + "value": "bottom" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "flex", + "label": { + "text": { + "zh_CN": "flex" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "gutter", + "label": { + "text": { + "zh_CN": "gutter" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": [] + } + }, + { + "name": { + "zh_CN": "表单项" + }, + "component": "TinyFormItem", + "icon": "formitem", + "description": "Form 组件下的 FormItem 配置", + "doc_url": "", + "screenshot": "img/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "FormItem", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 3, + "snippets": [{}], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "TinyForm", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["remove", "insert", "copy", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": ["label"], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-09T03:09:44.000Z", + "updated_at": "2023-02-16T06:15:02.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "validateIcon", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": "校验提示图标", + "_RID": "row_1" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_8" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "label", + "label": { + "text": { + "zh_CN": "标签文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "标签", + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标签文本" + }, + "labelPosition": "left" + }, + { + "property": "prop", + "label": { + "text": { + "zh_CN": "校验字段" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的" + } + }, + { + "property": "required", + "label": { + "text": { + "zh_CN": "必填" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否必填" + }, + "labelPosition": "left" + }, + { + "property": "validateIcon", + "label": { + "text": { + "zh_CN": "validateIcon" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "警告" + }, + "component": "TinyAlert", + "icon": "alert", + "description": "警告", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Alert", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "提示组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "警告" + }, + "icon": "alert", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyAlert", + "schema": { + "componentName": "TinyAlert", + "props": { + "description": "提示内容" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["type", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-10-25T07:27:44.000Z", + "updated_at": "2023-02-16T06:32:42.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "close", + "label": "关闭Alert时触发的事件", + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_1" + } + ], + "attrs": [ + { + "property": "title", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_13" + }, + { + "property": "icon", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_12" + }, + { + "property": "show-icon", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "是否显示图标", + "_RID": "row_7" + }, + { + "property": "close-text", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "关闭按钮文本", + "_RID": "row_6" + }, + { + "property": "center", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "是否居中", + "_RID": "row_5" + }, + { + "property": "description", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "提示内容", + "_RID": "row_4" + }, + { + "property": "type", + "type": "array", + "defaultValue": "info", + "enumerateValue": null, + "title": "类型", + "_RID": "row_3" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_1" + } + ], + "slots": { + "description": { + "label": { + "zh_CN": "description" + }, + "description": { + "zh_CN": "提示内容" + } + }, + "title": { + "label": { + "zh_CN": "title" + }, + "description": { + "zh_CN": "标题内容" + } + }, + "default": { + "label": { + "zh_CN": "default" + }, + "description": { + "zh_CN": "默认插槽" + } + } + } + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "show-icon", + "label": { + "text": { + "zh_CN": "是否显示图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "close-text", + "label": { + "text": { + "zh_CN": "关闭按钮文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "center", + "label": { + "text": { + "zh_CN": "文字是否居中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "description", + "label": { + "text": { + "zh_CN": "提示内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "警告类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "success", + "value": "success" + }, + { + "label": "warning", + "value": "warning" + }, + { + "label": "info", + "value": "info" + }, + { + "label": "error", + "value": "error" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "closable", + "label": { + "text": { + "zh_CN": "是否可以关闭" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "normal", + "value": "normal" + }, + { + "label": "large", + "value": "large" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "icon", + "label": { + "text": { + "zh_CN": "图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题,在 size 为 large 时有效" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onClose": { + "label": { + "zh_CN": "关闭Alert时触发的事件" + }, + "description": { + "zh_CN": null + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + } + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "component": "TinyInput", + "icon": "input", + "description": "通过鼠标或键盘输入字符", + "doc_url": "", + "screenshot": "input-screeshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Input", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 3, + "snippets": [ + { + "name": { + "zh_CN": "输入框" + }, + "icon": "input", + "screenshot": "", + "snippetName": "TinyInput", + "schema": { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-11T07:22:02.000Z", + "updated_at": "2023-03-06T06:44:18.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "key", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "modelValue", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "", + "_RID": "row_1" + }, + { + "property": "type", + "type": "array", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "rows", + "type": "number", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_3" + }, + { + "property": "placeholder", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_4" + }, + { + "property": "clearable", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_5" + }, + { + "property": "disabled", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_6" + }, + { + "property": "size", + "type": "array", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_7" + }, + { + "property": "maxlength", + "type": "number", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_8" + }, + { + "property": "autofocus", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_9" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "key", + "label": { + "text": { + "zh_CN": "key" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "textarea", + "value": "textarea" + }, + { + "label": "text", + "value": "text" + }, + { + "label": "password", + "value": "password" + } + ] + } + }, + "description": { + "zh_CN": "设置input框的type属性" + } + }, + { + "property": "rows", + "label": { + "text": { + "zh_CN": "行数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "输入框行数,只对 type='textarea' 有效" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + } + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否禁用" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "medium", + "value": "medium" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "mini", + "value": "mini" + } + ] + } + }, + "description": { + "zh_CN": "输入框尺寸。该属性的可选值为 medium / small / mini" + } + }, + { + "property": "maxlength", + "label": { + "text": { + "zh_CN": "最大长度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "最大长度" + } + }, + { + "property": "autofocus", + "label": { + "text": { + "zh_CN": "聚焦" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "自动获取焦点" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值改变时触发" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框改变后的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onInput": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框输入的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "标签页" + }, + "component": "TinyTabs", + "icon": "tabs", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "doc_url": "", + "screenshot": "tabsscreenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tabs", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 5, + "snippets": [ + { + "name": { + "zh_CN": "标签页" + }, + "icon": "tabs", + "screenshot": "", + "group": true, + "snippetName": "TinyTabs", + "schema": { + "componentName": "TinyTabs", + "props": { + "modelValue": "first", + "tiny_mode": "" + }, + "children": [ + { + "componentName": "TinyTabItem", + "props": { + "title": "标签页1", + "name": "first" + }, + "children": [ + { + "componentName": "div" + } + ] + }, + { + "componentName": "TinyTabItem", + "props": { + "title": "标签页2", + "name": "second" + }, + "children": [ + { + "componentName": "div" + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "TinyTabItem", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["tab-style", "", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "clickCapture": false, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:58:09.000Z", + "updated_at": "2023-03-06T06:45:54.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "swipeable", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "active-color", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "showEditIcon", + "label": { + "text": { + "zh_CN": "显示编辑ICON " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示标题后编辑 ICON" + }, + "labelPosition": "left" + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定,当前选中选项卡的 name" + }, + "labelPosition": "left" + }, + { + "property": "with-add", + "label": { + "text": { + "zh_CN": "可新增" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "标签是否可增加" + }, + "labelPosition": "left" + }, + { + "property": "with-close", + "label": { + "text": { + "zh_CN": "可关闭" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "标签是否可关闭" + }, + "labelPosition": "left" + }, + { + "property": "tab-style", + "label": { + "text": { + "zh_CN": "标签页样式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "card", + "value": "card" + }, + { + "label": "border-card", + "value": "border-card" + } + ] + } + }, + "description": { + "zh_CN": "标签页样式" + }, + "labelPosition": "left" + }, + { + "property": "active-color", + "label": { + "text": { + "zh_CN": "active-color" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "swipeable", + "label": { + "text": { + "zh_CN": "swipeable" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击页签时触发事件" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "component", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前点击的页签对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的选项卡改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中选项卡的 name 值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onEdit": { + "label": { + "zh_CN": "点击新增按钮或关闭按钮或者编辑按钮后触发" + }, + "description": { + "zh_CN": "点击新增按钮或关闭按钮或者编辑按钮后触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "tab", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前操作的页签对象" + } + }, + { + "name": "type", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前操作的类型(remove || add || edit)" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClose": { + "label": { + "zh_CN": "关闭页签时触发" + }, + "description": { + "zh_CN": "关闭页签时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "name", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "页签名称" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "下拉菜单menu" + }, + "component": "TinyDropdownMenu", + "icon": "dropdown", + "description": "下拉菜单menu", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DropdownMenu", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "导航组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "下拉菜单menu" + }, + "icon": "dropdown", + "screenshot": "", + "snippetName": "TinyDropdownMenu", + "schema": { + "componentName": "TinyDropdownMenu", + "props": { + "modelValue": "", + "options": [ + { + "value": "1", + "text": "黄金糕" + }, + { + "value": "2", + "text": "双皮奶" + } + ], + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "DropdownItem", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-09T03:28:12.000Z", + "updated_at": "2023-03-06T07:01:00.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "open", + "label": null, + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_27" + }, + { + "eventName": "close", + "label": null, + "params": null, + "defaultValue": null, + "description": "关闭菜单时触发", + "_RID": "row_26" + }, + { + "eventName": "change", + "label": null, + "params": null, + "defaultValue": null, + "description": "点击选项时触发,type为 selection 时启用", + "_RID": "row_25" + } + ], + "attrs": [ + { + "property": "icon", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "菜单项", + "_RID": "row_2" + }, + { + "property": "label", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "菜单项标签", + "_RID": "row_1" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": "mobile", + "enumerateValue": "mobile", + "title": null, + "_RID": "row_22" + }, + { + "property": "key", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "active-color", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "标题和选项的选中态颜色", + "_RID": "row_2" + }, + { + "property": "close-on-click-outside", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "设置点击外部元素后关闭菜单", + "_RID": "row_3" + }, + { + "property": "close-on-click-overlay", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": "设置点击遮罩层后关闭菜单", + "_RID": "row_4" + }, + { + "property": "direction", + "type": "string", + "defaultValue": "down", + "enumerateValue": null, + "title": "设置弹出框弹出框展开方向", + "_RID": "row_5" + }, + { + "property": "duration", + "type": "number", + "defaultValue": null, + "enumerateValue": null, + "title": "设置弹出框的动画时长", + "_RID": "row_6" + }, + { + "property": "overlay", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "设置是否显示遮罩层", + "_RID": "row_7" + } + ], + "slots": [ + { + "slotName": "title", + "description": "当type为selection时选项内容", + "_RID": "row_24" + }, + { + "slotName": "icon", + "description": "当type为selection时选项左侧内容", + "_RID": "row_23" + } + ] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "分组1" + }, + "content": [ + { + "property": "icon", + "label": { + "text": { + "zh_CN": "icon" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label", + "label": { + "text": { + "zh_CN": "label" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "key", + "label": { + "text": { + "zh_CN": "key" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "active-color", + "label": { + "text": { + "zh_CN": "active-color" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "close-on-click-outside", + "label": { + "text": { + "zh_CN": "close-on-click-outside" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "close-on-click-overlay", + "label": { + "text": { + "zh_CN": "close-on-click-overlay" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "direction", + "label": { + "text": { + "zh_CN": "direction" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "duration", + "label": { + "text": { + "zh_CN": "duration" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + } + }, + { + "property": "overlay", + "label": { + "text": { + "zh_CN": "overlay" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onOpen": { + "label": { + "zh_CN": null + }, + "description": { + "zh_CN": null + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onClose": { + "label": { + "zh_CN": null + }, + "description": { + "zh_CN": "关闭菜单时触发" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onChange": { + "label": { + "zh_CN": null + }, + "description": { + "zh_CN": "点击选项时触发,type为 selection 时启用" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + } + } + }, + { + "name": { + "zh_CN": "对话框" + }, + "component": "TinyDialogBox", + "icon": "dialogbox", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作。", + "doc_url": "", + "screenshot": "dialogboxshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DialogBox", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "对话框" + }, + "screenshot": "", + "snippetName": "TinyDialogBox", + "icon": "dialogbox", + "schema": { + "componentName": "TinyDialogBox", + "props": { + "visible": true, + "title": "dialogBox title", + "tiny_mode": "" + }, + "children": [ + { + "componentName": "div" + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": ".tiny-dialog-box", + "shortcuts": { + "properties": ["visible", "", "width"] + }, + "contextMenu": { + "actions": ["remove", "insert", "copy", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:55:58.000Z", + "updated_at": "2023-03-06T07:01:26.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "close-on-click-modal", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "是否可以通过点击遮罩层关闭弹窗,默认为 true ,可以在标签上设置:modal-closable=\"false\"不能通过点击遮罩层关闭弹窗。", + "_RID": "row_1" + }, + { + "property": "show-close", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "是否显示关闭按钮", + "_RID": "row_1" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_16" + } + ], + "slots": [ + { + "slotName": "footer", + "description": "\tDialog 按钮操作区的内容", + "_RID": "row_2" + } + ] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "弹出框标题" + }, + "labelPosition": "left" + }, + { + "property": "visible", + "label": { + "text": { + "zh_CN": "显示与隐藏" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "控制弹出框显示与关闭" + }, + "labelPosition": "left" + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "弹出框的宽度" + }, + "labelPosition": "left" + }, + { + "property": "draggable", + "label": { + "text": { + "zh_CN": "可拖拽" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否开启弹窗的拖拽功能,默认值为 false 。" + } + }, + { + "property": "center", + "label": { + "text": { + "zh_CN": "居中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "弹出框的头部与底部内容会自动居中" + }, + "labelPosition": "left" + }, + { + "property": "dialog-class", + "label": { + "text": { + "zh_CN": "自定义类" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "自定义配置弹窗类名" + }, + "labelPosition": "left" + }, + { + "property": "append-to-body", + "label": { + "text": { + "zh_CN": "插入到 Body " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "DialogBox 本身是否插入到 body 上,嵌套的 Dialog 必须指定该属性并赋值为 true" + }, + "labelPosition": "left" + }, + { + "property": "show-close", + "label": { + "text": { + "zh_CN": "show-close" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": { + "modelValue": true + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "close-on-click-modal", + "label": { + "text": { + "zh_CN": "close-on-click-modal" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": { + "modelValue": true + } + }, + "description": { + "zh_CN": "是否可以通过点击遮罩层关闭弹窗,默认为 true ,可以在标签上设置:modal-closable=\"false\"不能通过点击遮罩层关闭弹窗。" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onClose": { + "label": { + "zh_CN": "关闭弹窗是触发" + }, + "description": { + "zh_CN": "Dialog 关闭的回调" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "显示或隐藏的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的显示或隐藏的状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "开关" + }, + "component": "TinySwitch", + "icon": "switch", + "description": "开关开关开关开关开关", + "doc_url": "", + "screenshot": "img/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Switch", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 5, + "snippets": [ + { + "name": { + "zh_CN": "开关" + }, + "icon": "switch", + "screenshot": "", + "snippetName": "TinySwitch", + "schema": { + "componentName": "TinySwitch", + "props": { + "modelValue": "", + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-12T08:13:59.000Z", + "updated_at": "2023-03-06T07:02:29.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_3" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的开关状态值" + } + }, + { + "property": "true-value", + "label": { + "text": { + "zh_CN": "打开时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置打开时的值(Boolean / String / Number)" + }, + "labelPosition": "left" + }, + { + "property": "false-value", + "label": { + "text": { + "zh_CN": "关闭时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置关闭时的值(Boolean / String / Number)" + }, + "labelPosition": "left" + }, + { + "property": "mini", + "label": { + "text": { + "zh_CN": "迷你尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示为 mini 模式" + }, + "labelPosition": "left" + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "按钮被点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "开关的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的开关状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "时间线" + }, + "component": "TinyTimeLine", + "icon": "timeline", + "description": "时间线", + "doc_url": "", + "screenshot": "null", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TimeLine", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "数据组件", + "priority": 3, + "snippets": [ + { + "name": { + "zh_CN": "时间线" + }, + "icon": "timeline", + "screenshot": "", + "snippetName": "TinyTimeLine", + "schema": { + "componentName": "TinyTimeLine", + "props": { + "active": "2", + "data": [ + { + "name": "已下单" + }, + { + "name": "运输中" + }, + { + "name": "已签收" + } + ], + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["horizontal", "", "active"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:26:32.000Z", + "updated_at": "2023-03-06T07:04:21.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_4" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "vertical", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "竖向布局" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "竖向时间线" + } + }, + { + "property": "reverse", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "竖向逆向" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "竖向时数字的顺序,从上到下还是从下到上" + } + }, + { + "property": "horizontal", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "水平布局" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "节点和文字横向布局" + } + }, + { + "property": "active", + "label": { + "text": { + "zh_CN": "选中值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "步骤条的选中步骤值" + }, + "labelPosition": "left" + }, + { + "property": "data", + "label": { + "text": { + "zh_CN": "数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": [ + { + "name": "配置基本信息", + "status": "ready" + }, + { + "name": "配置报价", + "status": "wait" + }, + { + "name": "完成报价", + "status": "wait" + } + ], + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "时间线步骤条数据" + }, + "labelPosition": "left" + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "节点的点击时触发" + }, + "description": { + "zh_CN": "节点的点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "点击节点的下标" + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前节点对象:{ name: 节点名称, time: 时间 }" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "标签页签项" + }, + "component": "TinyTabItem", + "icon": "tabitem", + "description": "tab页签", + "doc_url": "", + "screenshot": "tabshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TabItem", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 20, + "snippets": [ + { + "name": { + "zh_CN": "标签页签项" + }, + "icon": "tabitem", + "screenshot": "", + "snippetName": "TinyTabItem", + "schema": { + "componentName": "TinyTabItem", + "props": { + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "TinyTabs", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["name", "title"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T03:00:11.000Z", + "updated_at": "2023-03-06T07:04:47.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "唯一表示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "唯一表示" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标题" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "单选" + }, + "component": "TinyRadio", + "icon": "radio", + "description": "用于配置不同场景的选项,在一组备选项中进行单选", + "doc_url": "", + "screenshot": "img/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Radio", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 5, + "snippets": [ + { + "name": { + "zh_CN": "单选" + }, + "icon": "radio", + "screenshot": "", + "snippetName": "TinyRadio", + "schema": { + "componentName": "TinyRadio", + "props": { + "label": "1", + "text": "单选文本", + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-16T02:38:18.000Z", + "updated_at": "2023-03-06T07:05:11.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_13" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label", + "label": { + "text": { + "zh_CN": "单选框的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "label": { + "zh_CN": "其他" + }, + "description": { + "zh_CN": "" + }, + "content": [ + { + "property": "border", + "label": { + "text": { + "zh_CN": "显示边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "单选框的尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "name", + "label": { + "text": { + "zh_CN": "原生 name 属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值变化事件" + }, + "description": { + "zh_CN": "绑定值变化时触发的事件" + } + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "表单" + }, + "component": "TinyForm", + "icon": "form", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "doc_url": "", + "screenshot": "formscreenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Form", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "表单" + }, + "screenshot": "", + "snippetName": "tiny-form", + "icon": "form", + "schema": { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top", + "tiny_mode": "" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "人员" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "" + } + } + ] + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "密码" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "type": "password" + } + } + ] + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "" + }, + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "提交", + "type": "primary", + "style": "margin-right: 10px" + } + }, + { + "componentName": "TinyButton", + "props": { + "text": "重置", + "type": "primary" + } + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "TinyFormItem", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "", "disabled"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-09T02:50:45.000Z", + "updated_at": "2023-03-06T07:05:36.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_12" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label-width", + "label": { + "text": { + "zh_CN": "标签宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单中标签占位宽度,默认为 80px" + }, + "labelPosition": "left" + }, + { + "property": "inline", + "label": { + "text": { + "zh_CN": "行内布局" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "行内布局模式,默认为 false" + } + }, + { + "property": "label-align", + "label": { + "text": { + "zh_CN": "必填标识是否占位" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "必填标识 * 是否占位" + }, + "labelPosition": "left" + }, + { + "property": "label-suffix", + "label": { + "text": { + "zh_CN": "标签后缀" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单中标签后缀" + } + }, + { + "property": "label-position", + "label": { + "text": { + "zh_CN": "标签位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "right", + "value": "right" + }, + { + "label": "left ", + "value": "left " + }, + { + "label": "top", + "value": "top" + } + ] + } + }, + "description": { + "zh_CN": "表单中标签的布局位置" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "校验属性" + }, + "content": [ + { + "property": "model", + "label": { + "text": { + "zh_CN": "表单校验对象" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表单数据对象" + }, + "labelPosition": "left" + }, + { + "property": "rules", + "label": { + "text": { + "zh_CN": "校验规则" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表单验证规则" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onValidate": { + "label": { + "zh_CN": "表单项被校验后触发" + }, + "description": { + "zh_CN": "表单项被校验后触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "function", + "type": "Function", + "defaultValue": "(valid) => {}", + "description": { + "zh_CN": "校验回调函数" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onInput": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框输入的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "表格" + }, + "component": "TinyGrid", + "icon": "grid", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等", + "doc_url": null, + "screenshot": "null", + "tags": null, + "keywords": null, + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Grid", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "数据组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "表格" + }, + "icon": "grid", + "screenshot": "", + "snippetName": "tinyGrid", + "schema": { + "componentName": "TinyGrid", + "props": { + "editConfig": { + "trigger": "click", + "mode": "cell", + "showStatus": true + }, + "columns": [ + { + "type": "index", + "width": 60 + }, + { + "type": "selection", + "width": 60 + }, + { + "field": "employees", + "title": "员工数" + }, + { + "field": "created_date", + "title": "创建日期" + }, + { + "field": "city", + "title": "城市" + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司", + "city": "福州", + "employees": 800, + "created_date": "2014-04-30 00:56:00", + "boole": false + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "employees": 300, + "created_date": "2016-07-08 12:36:22", + "boole": true + } + ], + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": false, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["columns", "", "resizable"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue", + "invalidity": [""] + }, + "createdBy": 169, + "created_at": "2022-05-19T10:41:29.000Z", + "updated_at": "2023-03-06T07:06:54.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "select-change", + "label": "当手动勾选并且值发生改变时触发的事件", + "params": null, + "defaultValue": null, + "description": "只对 type=selection 有效,当手动勾选并且值发生改变时触发的事件;", + "_RID": "row_2" + }, + { + "eventName": "select-all", + "label": "全选时触发的事件", + "params": null, + "defaultValue": null, + "description": "只对 type=selection 有效,当手动勾选全选时触发的事件", + "_RID": "row_1" + }, + { + "eventName": "current-change", + "label": "行选中事件", + "params": "e", + "defaultValue": null, + "description": "行选中事件", + "_RID": "row_4" + } + ], + "attrs": [ + { + "property": "highlight-current-row", + "type": "boolean", + "defaultValue": "false", + "enumerateValue": null, + "title": "是否需要高亮当前行", + "_RID": "row_3" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础属性" + }, + "description": { + "zh_CN": "基础属性" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "表格数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "onChange": "this.delProp('fetchData')", + "description": { + "zh_CN": "设置表格的数据" + } + }, + { + "property": "columns", + "label": { + "text": { + "zh_CN": "表格列" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "properties": [ + { + "label": { + "zh_CN": "默认分组" + }, + "content": [ + { + "property": "title", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列标题" + } + }, + "widget": { + "component": "MetaBindI18n", + "props": {} + } + }, + { + "property": "field", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列键值" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "sortable", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否排序" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "width", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列宽" + } + }, + "widget": { + "component": "MetaNumber", + "props": {} + } + }, + { + "property": "formatText", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "内置渲染器" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "整数", + "value": "integer" + }, + { + "label": "小数", + "value": "number" + }, + { + "label": "金额", + "value": "money" + }, + { + "label": "百分比", + "value": "rate" + }, + { + "label": "布尔", + "value": "boole" + }, + { + "label": "年月日", + "value": "date" + }, + { + "label": "年月日时分", + "value": "dateTime" + }, + { + "label": "时间", + "value": "time" + }, + { + "label": "省略", + "value": "ellipsis" + } + ] + } + } + }, + { + "property": "renderer", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "dataType": "JSFunction" + } + } + }, + { + "property": "slots", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "插槽" + } + }, + "labelPosition": "none", + "widget": { + "component": "MetaJsSlot", + "props": { + "slots": ["header", "default"] + } + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "列类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "索引列", + "value": "index" + }, + { + "label": "单选列", + "value": "radio" + }, + { + "label": "多选列", + "value": "selection" + }, + { + "label": "展开列", + "value": "expand" + } + ], + "clearable": true + } + }, + "description": { + "zh_CN": "设置内置列的类型,该属性的可选值为 index(序号)/ selection(复选框)/ radio(单选框)/ expand(展开行)" + }, + "labelPosition": "left" + }, + { + "property": "editor", + "label": { + "text": { + "zh_CN": "编辑配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "单元格编辑渲染配置项,也可以是函数 Function(h, params)" + }, + "labelPosition": "left" + }, + { + "property": "filter", + "label": { + "text": { + "zh_CN": "筛选配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息" + } + }, + { + "property": "showOverflow", + "label": { + "text": { + "zh_CN": "内容超出部分省略号配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "只显示省略号", + "value": "ellipsis" + }, + { + "label": "显示为原生 title", + "value": "title" + }, + { + "label": "显示为 tooltip 提示", + "value": "tooltip" + } + ], + "clearable": true + } + }, + "description": { + "zh_CN": "设置内置列的内容超出部分显示省略号配置,该属性的可选值为 ellipsis(只显示省略号)/ title(显示为原生 title)/ tooltip(显示为 tooltip 提示)" + }, + "labelPosition": "left" + } + ] + } + ], + "widget": { + "component": "MetaArrayItem", + "props": { + "type": "object", + "textField": "title", + "language": "json", + "buttonText": "编辑列配置", + "title": "编辑列配置", + "expand": true + } + }, + "description": { + "zh_CN": "表格列的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "fetchData", + "label": { + "text": { + "zh_CN": "服务端数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "onChange": "this.delProp('data')", + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "name": "fetchData" + } + }, + "description": { + "zh_CN": "服务端数据查询方法" + } + }, + { + "property": "pager", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "defaultValue": { + "attrs": { + "currentPage": 1 + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "name": "pager" + } + }, + "description": { + "zh_CN": "分页配置" + } + }, + { + "property": "resizable", + "label": { + "text": { + "zh_CN": "调整列宽" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许调整列宽" + }, + "labelPosition": "left" + }, + { + "property": "row-id", + "label": { + "text": { + "zh_CN": "行数据唯一标识的字段名" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "placeholder": "比如:id" + } + }, + "description": { + "zh_CN": "行数据唯一标识的字段名" + }, + "labelPosition": "left" + }, + { + "property": "select-config", + "label": { + "text": { + "zh_CN": "复选框配置" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "表格行数据复选框配置项" + }, + "labelPosition": "left" + }, + { + "property": "edit-rules", + "label": { + "text": { + "zh_CN": "校验规则" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表格校验规则配置项" + }, + "labelPosition": "left" + }, + { + "property": "edit-config", + "label": { + "text": { + "zh_CN": "编辑配置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表格编辑配置项" + } + }, + { + "property": "expand-config", + "label": { + "text": { + "zh_CN": "复选框配置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "复选框配置项" + }, + "labelPosition": "left" + }, + { + "property": "sortable", + "label": { + "text": { + "zh_CN": "可排序" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许列数据排序。默认为 true 可排序" + }, + "labelPosition": "left" + }, + { + "property": "highlight-current-row", + "label": { + "text": { + "zh_CN": "highlight-current-row" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + }, + { + "label": { + "zh_CN": "其他属性" + }, + "description": { + "zh_CN": "其他属性" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "auto-resize", + "label": { + "text": { + "zh_CN": "父元素响应式监听" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "父元素响应式监听(对于父元素可能存在动态变化的场景可能会用到)" + }, + "labelPosition": "left" + }, + { + "property": "border", + "label": { + "text": { + "zh_CN": "边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否带有纵向边框" + }, + "labelPosition": "left" + }, + { + "property": "seq-serial", + "label": { + "text": { + "zh_CN": "行号连续" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置行序号是否连续,开启分页时有效,该属性的默认值为 false" + }, + "labelPosition": "left" + }, + { + "property": "highlight-hover-row", + "label": { + "text": { + "zh_CN": "hover 高亮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "鼠标移到行是否要高亮显示" + }, + "labelPosition": "left" + }, + { + "property": "row-class-name", + "label": { + "text": { + "zh_CN": "hover 高亮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "给行附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex})" + }, + "labelPosition": "left" + }, + { + "property": "max-height", + "label": { + "text": { + "zh_CN": "最大高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置表格内容区域(不含表格头部,底部)的最大高度。" + }, + "labelPosition": "left" + }, + { + "property": "row-span", + "label": { + "text": { + "zh_CN": "行合并" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置行合并,该属性仅适用于普通表格,不可与 tree-config 同时使用" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onSelect-change": { + "label": { + "zh_CN": "当手动勾选并且值发生改变时触发的事件" + }, + "description": { + "zh_CN": "只对 type=selection 有效,当手动勾选并且值发生改变时触发的事件;" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onSelect-all": { + "label": { + "zh_CN": "全选时触发的事件" + }, + "description": { + "zh_CN": "只对 type=selection 有效,当手动勾选全选时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onCurrent-change": { + "label": { + "zh_CN": "行选中事件" + }, + "description": { + "zh_CN": "行选中事件" + }, + "type": "event", + "functionInfo": { + "params": ["e"], + "returns": {} + } + } + } + } + }, + { + "name": { + "zh_CN": "计数器" + }, + "component": "TinyNumeric", + "icon": "numeric", + "description": "用于输入数字,可自定义数值范围,步进大小。支持鼠标键盘增减", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Numeric", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "计数器" + }, + "icon": "numeric", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyNumeric", + "schema": { + "componentName": "TinyNumeric", + "props": { + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["value", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-10-25T03:02:56.000Z", + "updated_at": "2023-03-06T07:07:18.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "update:modelValue", + "label": "双向绑定的值改变时触发", + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_2" + }, + { + "eventName": "blur", + "label": "失去焦点事件", + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_11" + }, + { + "eventName": "focus", + "label": "获得焦点事件", + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_10" + }, + { + "eventName": "change", + "label": "值变化事件", + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_11" + } + ], + "attrs": [ + { + "property": "allow-empty", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_9" + }, + { + "property": "format", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_8" + }, + { + "property": "precision", + "type": "number", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_7" + }, + { + "property": "placeholder", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_6" + }, + { + "property": "label", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_5" + }, + { + "property": "name", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_4" + }, + { + "property": "controls-position", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_3" + }, + { + "property": "controls", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "step-strictly", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "modelValue", + "type": "number", + "defaultValue": null, + "enumerateValue": null, + "title": "绑定值", + "_RID": "row_10" + }, + { + "property": "size", + "type": "array", + "defaultValue": "small", + "enumerateValue": "mini,small,medium", + "title": "尺寸", + "_RID": "row_9" + }, + { + "property": "disabled", + "type": "boolean", + "defaultValue": "false", + "enumerateValue": null, + "title": "禁用", + "_RID": "row_8" + }, + { + "property": "mouse-wheel", + "type": "boolean", + "defaultValue": "true", + "enumerateValue": null, + "title": "鼠标滚动", + "_RID": "row_6" + }, + { + "property": "circulate", + "type": "boolean", + "defaultValue": "false", + "enumerateValue": null, + "title": "数值循环", + "_RID": "row_5" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_2" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "mini", + "value": "mini" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "medium", + "value": "medium" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "mouse-wheel", + "label": { + "text": { + "zh_CN": "鼠标滚动滑轮是否改变数值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "circulate", + "label": { + "text": { + "zh_CN": "向上到达最大值后从最小值开始,或反过来" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "step", + "label": { + "text": { + "zh_CN": "步长" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "max", + "label": { + "text": { + "zh_CN": "最大数值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "min", + "label": { + "text": { + "zh_CN": "最小数值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "controls", + "label": { + "text": { + "zh_CN": "是否使用控制按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "controls-position", + "label": { + "text": { + "zh_CN": "控制按钮位置;该属性的可选值为 right" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "step-strictly", + "label": { + "text": { + "zh_CN": "是否只能输入 step 的倍数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "name", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label", + "label": { + "text": { + "zh_CN": "输入框关联的label文字" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "输入框内的提示占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "precision", + "label": { + "text": { + "zh_CN": "数值精度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "format", + "label": { + "text": { + "zh_CN": "数字格式化置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "allow-empty", + "label": { + "text": { + "zh_CN": "计数器内容可清空" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "计数器的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "number", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的计数值" + } + } + ], + "returns": {} + } + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点事件" + }, + "description": { + "zh_CN": null + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onFocus": { + "label": { + "zh_CN": "获得焦点事件" + }, + "description": { + "zh_CN": null + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onChange": { + "label": { + "zh_CN": "值变化事件" + }, + "description": { + "zh_CN": null + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + } + } + }, + { + "name": { + "zh_CN": "复选框按钮组" + }, + "component": "TinyCheckboxGroup", + "icon": "checkboxgroup", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "doc_url": "", + "screenshot": "screenshot", + "tags": "", + "keywords": "复选框按钮组", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CheckboxGroup", + "version": "0.1.17", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "复选框组" + }, + "icon": "checkboxs", + "screenshot": "", + "snippetName": "TinyCheckboxGroup", + "schema": { + "componentName": "TinyCheckboxGroup", + "props": { + "modelValue": ["name1", "name2"], + "type": "checkbox", + "options": [ + { + "text": "复选框1", + "label": "name1" + }, + { + "text": "复选框2", + "label": "name2" + }, + { + "text": "复选框3", + "label": "name3" + } + ], + "tiny_mode": "" + } + } + }, + { + "name": { + "zh_CN": "复选框拖拽按钮组" + }, + "icon": "checkboxgroup", + "screenshot": "", + "snippetName": "TinyCheckboxbuttonGroup", + "schema": { + "componentName": "TinyCheckboxGroup", + "props": { + "modelValue": [] + }, + "children": [ + { + "componentName": "TinyCheckboxButton", + "children": [ + { + "componentName": "div" + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-06-18T03:09:20.000Z", + "updated_at": "2023-03-06T07:08:09.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "tiny_mode", + "type": "string", + "defaultValue": null, + "enumerateValue": "pc,mobile", + "title": null, + "_RID": "row_45" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "dataType": "Array" + } + }, + "description": { + "zh_CN": "双向绑定选中的选项值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "数据列表" + } + }, + "defaultValue": [ + { + "label": "标签2" + }, + { + "label": "标签2" + } + ], + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "checkbox组件列表" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "button", + "value": "button" + }, + { + "label": "checkbox", + "value": "checkbox" + } + ] + } + }, + "description": { + "zh_CN": "checkbox组件类型(button/checkbox),该属性的默认值为 checkbox,配合 options 属性一起使用" + }, + "labelPosition": "left" + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + }, + { + "label": "mobile", + "value": "mobile" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "array", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "双向绑定选中的选项值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "array", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的选中选项值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "下拉框" + }, + "component": "TinySelect", + "icon": "select", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件", + "doc_url": "", + "screenshot": "selectScreenshot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Select", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "下拉框" + }, + "icon": "select", + "screenshot": "", + "snippetName": "TinySelect", + "schema": { + "componentName": "TinySelect", + "props": { + "modelValue": "", + "placeholder": "请选择", + "options": [ + { + "value": "1", + "label": "黄金糕" + }, + { + "value": "2", + "label": "双皮奶" + } + ], + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": false, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["multiple", "", "options"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:44:05.000Z", + "updated_at": "2023-03-06T07:08:49.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "searchable", + "type": "boolean", + "defaultValue": "false", + "enumerateValue": null, + "title": "是否可搜索", + "_RID": "row_1" + }, + { + "property": "tiny_mode", + "type": "string", + "defaultValue": "", + "enumerateValue": null, + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "searchable", + "label": { + "text": { + "zh_CN": "下拉面板可搜索" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "下拉面板是否可搜索" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "下拉数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "配置 Select 下拉数据项" + }, + "labelPosition": "left" + }, + { + "property": "multiple", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许输入框输入或选择多个项" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "multiple-limit", + "label": { + "text": { + "zh_CN": "最大可选值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "多选时用户最多可以选择的项目数,为 0 则不限制" + }, + "labelPosition": "left" + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "下拉框的类名" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置下拉框自定义的类名" + }, + "labelPosition": "left" + }, + { + "property": "collapse-tags", + "label": { + "text": { + "zh_CN": "多选展示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "多选时是否将选中值按文字的形式展示" + }, + "labelPosition": "left" + }, + { + "property": "tiny_mode", + "label": { + "text": { + "zh_CN": "tiny_mode" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "pc", + "value": "pc" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值改变时触发" + }, + "description": { + "zh_CN": "在下拉框值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "下拉框选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onRemoveTag": { + "label": { + "zh_CN": "多选模式下移除tag时触发" + }, + "description": { + "zh_CN": "多选模式下移除tag时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "被移除Tag对应数据项的值字段" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "按钮组" + }, + "component": "TinyButtonGroup", + "icon": "buttons", + "description": "以按钮组的方式出现,常用于多项类似操作", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "ButtonGroup", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "互斥按钮组" + }, + "icon": "buttons", + "snippetName": "TinyButtonGroup", + "screenshot": "", + "schema": { + "componentName": "TinyButtonGroup", + "props": { + "data": [ + { + "text": "Button1", + "value": "1" + }, + { + "text": "Button2", + "value": "2" + }, + { + "text": "Button3", + "value": "3" + } + ], + "modelValue": "1", + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T01:53:17.000Z", + "updated_at": "2023-03-06T07:10:09.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "update:modelValue", + "label": "绑定值改变触发的事件", + "params": null, + "defaultValue": null, + "description": null, + "_RID": "row_1" + } + ], + "attrs": [ + { + "property": "modelValue", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "按钮组数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "组件大小" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "mini", + "value": "mini" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "medium", + "value": "medium" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "plain", + "label": { + "text": { + "zh_CN": "是否是朴素按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "modelValue" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onUpdate:modelValue": { + "label": { + "zh_CN": "绑定值改变触发的事件" + }, + "description": { + "zh_CN": null + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + }, + "slots": [] + } + }, + { + "name": { + "zh_CN": "走马灯" + }, + "component": "TinyCarousel", + "icon": "carousel", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现。", + "doc_url": "", + "screenshot": "screenshoot", + "tags": "tiny-carousel", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Carousel", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "走马灯" + }, + "screenshot": "", + "snippetName": "tiny-carousel", + "icon": "carousel", + "schema": { + "componentName": "TinyCarousel", + "props": { + "height": "180px", + "tiny_mode": "" + }, + "children": [ + { + "componentName": "TinyCarouselItem", + "children": [ + { + "componentName": "div", + "props": { + "style": "margin:10px 0 0 30px" + } + } + ] + }, + { + "componentName": "TinyCarouselItem", + "children": [ + { + "componentName": "div", + "props": { + "style": "margin:10px 0 0 30px" + } + } + ] + } + ] + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "TinyCarouselItem", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["arrow"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": ["default"], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-06-23T12:01:18.000Z", + "updated_at": "2023-03-06T07:10:37.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [], + "slots": [] + }, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 12, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "arrow", + "label": { + "text": { + "zh_CN": "切换箭头的显示时机" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "总是显示", + "value": "always" + }, + { + "label": "鼠标悬停时显示", + "value": "hover" + }, + { + "label": "从不显示", + "value": "never" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "autoplay", + "label": { + "text": { + "zh_CN": "是否自动切换" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "走马灯的高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "indicator-position", + "label": { + "text": { + "zh_CN": "指示器的位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "outside", + "value": "outside" + }, + { + "label": "none", + "value": "none" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "initial-index", + "label": { + "text": { + "zh_CN": "初始状态激活的幻灯片的索引,从 0 开始 " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "interval", + "label": { + "text": { + "zh_CN": "自动切换的时间间隔,单位为毫秒" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "loop", + "label": { + "text": { + "zh_CN": "是否循环显示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "show-title", + "label": { + "text": { + "zh_CN": "是否显示标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "指示器的触发方式,默认为 hover" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "点击", + "value": "click" + }, + { + "label": "悬停", + "value": "hover" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "走马灯的类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "水平", + "value": "horizontal" + }, + { + "label": "垂直", + "value": "vertical" + }, + { + "label": "卡片", + "value": "card" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "弹出编辑" + }, + "component": "TinyPopeditor", + "icon": "popeditor", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件", + "doc_url": "", + "screenshot": "null", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Popeditor", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "弹出编辑" + }, + "icon": "popeditor", + "screenshot": "", + "snippetName": "TinyPopeditor", + "schema": { + "componentName": "TinyPopeditor", + "props": { + "modelValue": "", + "placeholder": "请选择", + "gridOp": { + "columns": [ + { + "field": "id", + "title": "ID", + "width": 40 + }, + { + "field": "name", + "title": "名称", + "showOverflow": "tooltip" + }, + { + "field": "province", + "title": "省份", + "width": 80 + }, + { + "field": "city", + "title": "城市", + "width": 80 + } + ], + "data": [ + { + "id": "1", + "name": "GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司GFD科技有限公司", + "city": "福州", + "province": "福建" + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "province": "广东" + }, + { + "id": "3", + "name": "RFV有限责任公司", + "city": "中山", + "province": "广东" + }, + { + "id": "4", + "name": "TGB科技有限公司", + "city": "龙岩", + "province": "福建" + }, + { + "id": "5", + "name": "YHN科技有限公司", + "city": "韶关", + "province": "广东" + }, + { + "id": "6", + "name": "WSX科技有限公司", + "city": "黄冈", + "province": "武汉" + } + ] + }, + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["placeholder", "show-clear-btn"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "slots": [], + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-05-19T02:34:37.000Z", + "updated_at": "2023-03-06T07:11:13.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "show-clear-btn", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板的宽度(单位像素)" + }, + "labelPosition": "left" + }, + { + "property": "conditions", + "label": { + "text": { + "zh_CN": "过滤条件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "当弹出面板配置的是表格时,设置弹出面板中的过滤条件" + }, + "labelPosition": "left" + }, + { + "property": "grid-op", + "label": { + "text": { + "zh_CN": "表格配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板中表格组件的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "pager-op", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置弹出编辑框中分页配置" + }, + "labelPosition": "left" + }, + { + "property": "multi", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板中的数据是否可多选" + }, + "labelPosition": "left" + }, + { + "property": "show-pager", + "label": { + "text": { + "zh_CN": "启用分页" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当 popseletor 为 grid 时才能生效,配置为 true 后还需配置 pagerOp 属性" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "选中值改变时触发" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前选中项的值" + } + }, + { + "name": "value", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中对象" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClose": { + "label": { + "zh_CN": "弹框关闭时触发的事件" + }, + "description": { + "zh_CN": "弹框关闭时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onPageChange": { + "label": { + "zh_CN": "分页切换事件" + }, + "description": { + "zh_CN": "表格模式下分页切换事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页码数" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + } + }, + { + "name": { + "zh_CN": "日期选择器" + }, + "component": "TinyDatePicker", + "icon": "datepicker", + "description": "用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式。", + "doc_url": "", + "screenshot": "screenshoot", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DatePicker", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "表单组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "日期选择器" + }, + "screenshot": "", + "snippetName": "tiny-date-picker", + "icon": "datepick", + "schema": { + "componentName": "TinyDatePicker", + "props": { + "placeholder": "请选择日期", + "modelValue": "", + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-06-28T01:54:39.000Z", + "updated_at": "2023-03-06T07:11:42.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": true, + "tiny_reserved": true, + "component_metadata": null, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "align", + "label": { + "text": { + "zh_CN": "对齐方式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "左对齐", + "value": "left" + }, + { + "label": "居中对齐", + "value": "center" + }, + { + "label": "右对齐", + "value": "right" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "clear-icon", + "label": { + "text": { + "zh_CN": "自定义清空图标的类名" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "是否显示清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "default-time", + "label": { + "text": { + "zh_CN": "范围选择时选中日期所使用的当日内具体时刻,可选值为 支持的日期格式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "default-value", + "label": { + "text": { + "zh_CN": "可选,选择器打开时默认显示的时间,可选值为 可被new Date()解析" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "editable", + "label": { + "text": { + "zh_CN": "文本框可输入" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "end-placeholder", + "label": { + "text": { + "zh_CN": "范围选择时结束日期的占位内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "format", + "label": { + "text": { + "zh_CN": "显示在输入框中的格式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "isutc8", + "label": { + "text": { + "zh_CN": "默认值为 false ,设置为 true 时切换系统默认时区,时间依然显示为东八区时间。适用场景为海外地区显示东八区时间" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "name", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "picker-options", + "label": { + "text": { + "zh_CN": "当前时间日期选择器特有的选项参考下表" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "非范围选择时的占位内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "popper-append-to-body", + "label": { + "text": { + "zh_CN": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "为 popper 添加类名(可参考 popover 组件)" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "range-separator", + "label": { + "text": { + "zh_CN": "选择范围时的分隔符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "readonly", + "label": { + "text": { + "zh_CN": "设置日历组件是否只读" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "输入框尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "中等尺寸", + "value": "medium" + }, + { + "label": "较小尺寸", + "value": "small" + }, + { + "label": "迷你尺寸", + "value": "mini" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "start-placeholder", + "label": { + "text": { + "zh_CN": "范围选择时开始日期的占位内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "suffix-icon ", + "label": { + "text": { + "zh_CN": "自定义后置图标的类名,prefix-icon 自 AUI 3.8.0 版本将替换为 suffix-icon " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "time-arrow-control", + "label": { + "text": { + "zh_CN": "通过箭头按钮控制时间选择,当 type 为 datetime、datetimerange 时使用,默认为 通过鼠标滚轮滚动选择时间" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "显示类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "年", + "value": "year" + }, + { + "label": "月", + "value": "month" + }, + { + "label": "多个日期", + "value": "dates" + }, + { + "label": "周", + "value": "week" + }, + { + "label": "日期范围", + "value": "daterange" + }, + { + "label": "日期", + "value": "date" + }, + { + "label": "日期时间", + "value": "datetime" + }, + { + "label": "日期时间范围", + "value": "datetimerange" + }, + { + "label": "月范围", + "value": "monthrange" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "unlink-panels", + "label": { + "text": { + "zh_CN": "在范围选择器里取消两个日期面板之间的联动" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "validate-event", + "label": { + "text": { + "zh_CN": "设置日期选择器在输入时是否会触发表单校验" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "value", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "value-format", + "label": { + "text": { + "zh_CN": "指定绑定值的格式。不指定则绑定值为 Date 对象" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + } + }, + { + "name": { + "zh_CN": "下拉菜单" + }, + "component": "TinyDropdown", + "icon": "dropdown", + "description": "Dropdown 下拉菜单", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Dropdown", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "导航组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "下拉菜单" + }, + "icon": "dropdown", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyDropdown", + "schema": { + "componentName": "TinyDropdown", + "props": { + "trigger": "hover", + "title": "下拉菜单", + "menuOptions": { + "options": [ + { + "label": "老友粉", + "disabled": true + }, + { + "label": "狮子头", + "divided": true + }, + { + "label": "黄金糕", + "divided": true + } + ] + }, + "tiny_mode": "" + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["size", "trigger"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-09T03:20:31.000Z", + "updated_at": "2023-03-08T06:20:17.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": false, + "tiny_reserved": true, + "component_metadata": { + "events": [ + { + "eventName": "visible-change", + "label": "下拉框出现/隐藏时触发", + "params": null, + "defaultValue": null, + "description": "下拉框出现/隐藏时触发", + "_RID": "row_8" + }, + { + "eventName": "button-click", + "label": "点击左侧按钮的回调", + "params": null, + "defaultValue": null, + "description": "点击左侧按钮的回调", + "_RID": "row_7" + }, + { + "eventName": "item-click", + "label": "点击菜单项触发的事件回调", + "params": null, + "defaultValue": null, + "description": "点击菜单项触发的事件回调", + "_RID": "row_6" + } + ], + "attrs": [ + { + "property": "menuOptions", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "title", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "size", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "菜单尺寸", + "_RID": "row_4" + }, + { + "property": "trigger", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "触发下拉的行为", + "_RID": "row_3" + }, + { + "property": "trigger", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "触发下拉的行为", + "_RID": "row_3" + }, + { + "property": "trigger", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": "触发下拉的行为", + "_RID": "row_3" + } + ], + "slots": { + "default": { + "label": { + "zh_CN": "default" + }, + "description": { + "zh_CN": null + } + } + } + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "title", + "label": { + "text": { + "zh_CN": "触发源名称" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "menuOptions", + "label": { + "text": { + "zh_CN": "菜单子项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "触发下拉的行为" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 6, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "hover", + "value": "hover" + }, + { + "label": "click", + "value": "click" + } + ] + } + }, + "description": { + "zh_CN": "" + }, + "type": "string", + "properties": [ + { + "label": { + "zh_CN": "默认分组" + }, + "content": [ + { + "property": "title", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "customProperty" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "customProperty" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "field", + "type": "array", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "customProperty" + } + }, + "widget": { + "component": "MetaSelect", + "props": {} + } + } + ] + } + ], + "labelPosition": "left" + }, + { + "property": "placement", + "label": { + "text": { + "zh_CN": "菜单弹出位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "hide-timeout", + "label": { + "text": { + "zh_CN": "收起下拉菜单的延时" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "show-timeout", + "label": { + "text": { + "zh_CN": "展开下拉菜单的延时" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "hide-on-click", + "label": { + "text": { + "zh_CN": "点击菜单项后隐藏菜单" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onVisible-change": { + "label": { + "zh_CN": "下拉框出现/隐藏时触发" + }, + "description": { + "zh_CN": "下拉框出现/隐藏时触发" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onButton-click": { + "label": { + "zh_CN": "点击左侧按钮的回调" + }, + "description": { + "zh_CN": "点击左侧按钮的回调" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + }, + "onItem-click": { + "label": { + "zh_CN": "点击菜单项触发的事件回调" + }, + "description": { + "zh_CN": "点击菜单项触发的事件回调" + }, + "type": "event", + "functionInfo": { + "params": [null], + "returns": {} + } + } + } + } + }, + { + "name": { + "zh_CN": "柱状图" + }, + "component": "TinyChartHistogram", + "icon": "histogram ", + "description": "基于 eCharts 封装的柱状图", + "doc_url": "", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "ChartHistogram", + "version": "0.1.16", + "destructuring": true + }, + "group": "component", + "category": "图表组件", + "priority": 2, + "snippets": [ + { + "name": { + "zh_CN": "柱状图" + }, + "icon": "histogram ", + "screenshot": "http://localhost:9090/assets/images/logo.png", + "snippetName": "TinyChartHistogram", + "schema": { + "componentName": "TinyChartHistogram", + "props": { + "data": { + "columns": ["日期", "访问用户", "下单用户", "下单率"], + "rows": [ + { + "日期": "1/1", + "访问用户": 1393, + "下单用户": 1093, + "下单率": 0.32 + }, + { + "日期": "1/2", + "访问用户": 3530, + "下单用户": 3230, + "下单率": 0.26 + }, + { + "日期": "1/3", + "访问用户": 2923, + "下单用户": 2623, + "下单率": 0.76 + }, + { + "日期": "1/4", + "访问用户": 1723, + "下单用户": 1423, + "下单率": 0.49 + }, + { + "日期": "1/5", + "访问用户": 3792, + "下单用户": 3492, + "下单率": 0.323 + }, + { + "日期": "1/6", + "访问用户": 4593, + "下单用户": 4293, + "下单率": 0.78 + } + ] + } + } + } + } + ], + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [""] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "createdBy": 169, + "created_at": "2022-11-11T03:25:54.000Z", + "updated_at": "2022-11-12T08:18:30.000Z", + "public": 1, + "framework": "Vue", + "isOfficial": true, + "isDefault": false, + "tiny_reserved": true, + "component_metadata": { + "events": [], + "attrs": [ + { + "property": "data-empty", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_6" + }, + { + "property": "loading", + "type": "boolean", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_5" + }, + { + "property": "events", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_4" + }, + { + "property": "extend", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_3" + }, + { + "property": "height", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "width", + "type": "string", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + }, + { + "property": "settings", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_2" + }, + { + "property": "data", + "type": "object", + "defaultValue": null, + "enumerateValue": null, + "title": null, + "_RID": "row_1" + } + ], + "slots": [] + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础信息" + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "图表数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "settings", + "label": { + "text": { + "zh_CN": "图表配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "extend", + "label": { + "text": { + "zh_CN": "图表扩展配置,参考eChart" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "图表容器的高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "图表容器的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "events", + "label": { + "text": { + "zh_CN": "事件绑定" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "loading", + "label": { + "text": { + "zh_CN": "显示loading" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "data-empty", + "label": { + "text": { + "zh_CN": "暂无数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": [] + } + } + ] + } + } + }, + "createdBy": null, + "updatedBy": null, + "assets_url": { + "material": ["http://localhost:9090/assets/json/bundle.json"], + "scripts": [ + "http://localhost:9090/assets/js/1505web-components.es.js", + "http://localhost:9090/assets/js/1505web-components.umd.js" + ], + "styles": [] + }, + "tenant": null, + "created_by": null, + "updated_by": null, + "created_at": "2023-03-09T11:58:08.000Z", + "updated_at": "2023-03-09T11:58:08.000Z", + "description": "2023.3.9", + "components": [ + { + "id": 1, + "version": "2.4.2", + "name": { + "zh_CN": "输入框" + }, + "component": "ElInput", + "icon": "input", + "description": "通过鼠标或键盘输入字符", + "doc_url": "", + "screenshot": "", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "element-plus", + "version": "2.4.2", + "script": "https://unpkg.com/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://unpkg.com/element-plus@2.4.2/dist/index.css", + "dependencies": null, + "exportName": "ElInput" + }, + "group": "表单组件", + "category": "element-plus", + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["type", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础属性" + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "modelValue" + } + }, + "description": { + "zh_CN": "绑定值" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "size" + } + }, + "description": { + "zh_CN": "尺寸" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "default", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "default", + "value": "default" + }, + { + "label": "small", + "value": "small" + } + ] + } + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "type" + } + }, + "description": { + "zh_CN": "类型" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "placeholder" + } + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "device": [] + }, + { + "property": "maxlength", + "label": { + "text": { + "zh_CN": "maxlength" + } + }, + "description": { + "zh_CN": "最大输入长度" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "number", + "widget": { + "component": "MetaNumberic", + "props": {} + }, + "device": [] + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "disabled" + } + }, + "description": { + "zh_CN": "是否禁用" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定值改变时触发" + }, + "description": { + "zh_CN": "双向绑定值改变时触发" + } + }, + "onBlur": { + "label": { + "zh_CN": "输入框失去焦点时触发" + }, + "description": { + "zh_CN": "输入框失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + }, + "slots": { + "prefix": { + "label": { + "zh_CN": "头部内容" + }, + "description": { + "zh_CN": "输入框头部内容,只对非 type='textarea' 有效" + } + }, + "suffix": { + "label": { + "zh_CN": "尾部内容" + }, + "description": { + "zh_CN": "输入框尾部内容,只对非 type='textarea' 有效" + } + }, + "prepend": { + "label": { + "zh_CN": "前置内容" + }, + "description": { + "zh_CN": "输入框前置内容,只对非 type='textarea' 有效" + } + }, + "append": { + "label": { + "zh_CN": "后置内容" + }, + "description": { + "zh_CN": "输入框后置内容,只对非 type='textarea' 有效" + } + } + } + } + }, + { + "id": 1, + "version": "2.4.2", + "name": { + "zh_CN": "按钮" + }, + "component": "ElButton", + "icon": "button", + "description": "常用的操作按钮", + "doc_url": "", + "screenshot": "", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "element-plus", + "version": "2.4.2", + "script": "https://unpkg.com/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://unpkg.com/element-plus@2.4.2/dist/index.css", + "dependencies": null, + "exportName": "ElButton" + }, + "group": "基础组件", + "category": "element-plus", + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["type", "size"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础属性" + }, + "content": [ + { + "property": "size", + "label": { + "text": { + "zh_CN": "size" + } + }, + "description": { + "zh_CN": "尺寸" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "default", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "default", + "value": "default" + }, + { + "label": "small", + "value": "small" + } + ] + } + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "type" + } + }, + "description": { + "zh_CN": "类型" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "plain", + "label": { + "text": { + "zh_CN": "plain" + } + }, + "description": { + "zh_CN": "是否为朴素按钮" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "text", + "label": { + "text": { + "zh_CN": "text" + } + }, + "description": { + "zh_CN": "是否为文字按钮" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "bg", + "label": { + "text": { + "zh_CN": "bg" + } + }, + "description": { + "zh_CN": "是否显示文字按钮背景颜色" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "link", + "label": { + "text": { + "zh_CN": "link" + } + }, + "description": { + "zh_CN": "是否为链接按钮" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "round", + "label": { + "text": { + "zh_CN": "round" + } + }, + "description": { + "zh_CN": "是否为圆角按钮" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "circle", + "label": { + "text": { + "zh_CN": "circle" + } + }, + "description": { + "zh_CN": "是否为圆形按钮" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "loading", + "label": { + "text": { + "zh_CN": "loading" + } + }, + "description": { + "zh_CN": "是否为加载中状态" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "disabled" + } + }, + "description": { + "zh_CN": "是否禁用" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": {}, + "slots": { + "default": { + "label": { + "zh_CN": "default" + }, + "description": { + "zh_CN": "自定义默认内容" + } + }, + "loading": { + "label": { + "zh_CN": "loading" + }, + "description": { + "zh_CN": "自定义加载中组件" + } + } + } + } + }, + { + "id": 1, + "version": "2.4.2", + "name": { + "zh_CN": "表单" + }, + "component": "ElForm", + "icon": "form", + "description": "表单包含 输入框, 单选框, 下拉选择, 多选框 等用户输入的组件。 使用表单,您可以收集、验证和提交数据。", + "doc_url": "", + "screenshot": "", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "element-plus", + "version": "2.4.2", + "script": "https://unpkg.com/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://unpkg.com/element-plus@2.4.2/dist/index.css", + "dependencies": null, + "exportName": "ElForm" + }, + "group": "表单组件", + "category": "element-plus", + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": ["ElFormItem"], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["inline", "label-width"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础属性" + }, + "content": [ + { + "property": "model", + "label": { + "text": { + "zh_CN": "model" + } + }, + "description": { + "zh_CN": "表单数据对象" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "object", + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "rules", + "label": { + "text": { + "zh_CN": "rules" + } + }, + "description": { + "zh_CN": "表单验证规则" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "object", + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "inline", + "label": { + "text": { + "zh_CN": "inline" + } + }, + "description": { + "zh_CN": "行内表单模式" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "label-position", + "label": { + "text": { + "zh_CN": "label-position" + } + }, + "description": { + "zh_CN": "表单域标签的位置, 当设置为 left 或 right 时,则也需要设置 label-width 属性" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "right", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "left", + "value": "left" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "top", + "value": "top" + } + ] + } + } + }, + { + "property": "label-width", + "label": { + "text": { + "zh_CN": "label-width" + } + }, + "description": { + "zh_CN": "标签的长度,例如 '50px'。 作为 Form 直接子元素的 form-item 会继承该值。 可以使用 auto。" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + }, + "device": [] + }, + { + "property": "label-suffix", + "label": { + "text": { + "zh_CN": "label-suffix" + } + }, + "description": { + "zh_CN": "表单域标签的后缀" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + }, + "device": [] + }, + { + "property": "hide-required-asterisk", + "label": { + "text": { + "zh_CN": "hide-required-asterisk" + } + }, + "description": { + "zh_CN": "是否隐藏必填字段标签旁边的红色星号" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "require-asterisk-position", + "label": { + "text": { + "zh_CN": "星号的位置" + } + }, + "description": { + "zh_CN": "星号的位置" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "left", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "left", + "value": "left" + }, + { + "label": "right", + "value": "right" + } + ] + } + } + }, + { + "property": "show-message", + "label": { + "text": { + "zh_CN": "show-message" + } + }, + "description": { + "zh_CN": "是否显示校验错误信息" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": true, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "inline-message", + "label": { + "text": { + "zh_CN": "inline-message" + } + }, + "description": { + "zh_CN": "是否以行内形式展示校验信息" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "status-icon", + "label": { + "text": { + "zh_CN": "status-icon" + } + }, + "description": { + "zh_CN": "是否在输入框中显示校验结果反馈图标" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "validate-on-rule-change", + "label": { + "text": { + "zh_CN": "validate-on-rule-change" + } + }, + "description": { + "zh_CN": "是否在 rules 属性改变后立即触发一次验证" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": true, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "size" + } + }, + "description": { + "zh_CN": "用于控制该表单内组件的尺寸" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "default", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "default", + "value": "default" + }, + { + "label": "small", + "value": "small" + } + ] + } + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "disabled" + } + }, + "description": { + "zh_CN": "是否禁用该表单内的所有组件。 如果设置为 true, 它将覆盖内部组件的 disabled 属性" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + }, + { + "property": "scroll-to-error", + "label": { + "text": { + "zh_CN": "scroll-to-error" + } + }, + "description": { + "zh_CN": "当校验失败时,滚动到第一个错误表单项" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "device": [] + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onValidate": { + "label": { + "zh_CN": "任一表单项被校验后触发" + }, + "description": { + "zh_CN": "任一表单项被校验后触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "slots": {} + } + }, + { + "id": 1, + "version": "2.4.2", + "name": { + "zh_CN": "表单子项" + }, + "component": "ElFormItem", + "icon": "formItem", + "description": "表单包含 输入框, 单选框, 下拉选择, 多选框 等用户输入的组件。 使用表单,您可以收集、验证和提交数据。", + "doc_url": "", + "screenshot": "", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "element-plus", + "version": "2.4.2", + "script": "https://unpkg.com/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://unpkg.com/element-plus@2.4.2/dist/index.css", + "dependencies": null, + "exportName": "ElFormItem" + }, + "group": "表单组件", + "category": "element-plus", + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["inline", "label-width"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础属性" + }, + "content": [ + { + "property": "prop", + "label": { + "text": { + "zh_CN": "prop" + } + }, + "description": { + "zh_CN": "model 的键名。 它可以是一个属性的值(如 a.b.0 或 [a', 'b', '0'])。 在定义了 validate、resetFields 的方法时,该属性是必填的" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label", + "label": { + "text": { + "zh_CN": "label" + } + }, + "description": { + "zh_CN": "标签文本" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label-width", + "label": { + "text": { + "zh_CN": "label-width" + } + }, + "description": { + "zh_CN": "标签宽度,例如 '50px'。 可以使用 auto" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "required", + "label": { + "text": { + "zh_CN": "required" + } + }, + "description": { + "zh_CN": "是否为必填项,如不设置,则会根据校验规则确认" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "rules", + "label": { + "text": { + "zh_CN": "rules" + } + }, + "description": { + "zh_CN": "表单验证规则, 更多内容可以参考async-validator" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "object", + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "error", + "label": { + "text": { + "zh_CN": "error" + } + }, + "description": { + "zh_CN": "表单域验证错误时的提示信息。设置该值会导致表单验证状态变为 error,并显示该错误信息" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "show-message", + "label": { + "text": { + "zh_CN": "show-message" + } + }, + "description": { + "zh_CN": "是否显示校验错误信息" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "inline-message", + "label": { + "text": { + "zh_CN": "inline-message" + } + }, + "description": { + "zh_CN": "是否在行内显示校验信息" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "size" + } + }, + "description": { + "zh_CN": "用于控制该表单内组件的尺寸" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "default", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "default", + "value": "default" + }, + { + "label": "small", + "value": "small" + } + ] + } + } + }, + { + "property": "for", + "label": { + "text": { + "zh_CN": "for" + } + }, + "description": { + "zh_CN": "和原生标签相同能力" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "validate-status", + "label": { + "text": { + "zh_CN": "validate-status" + } + }, + "description": { + "zh_CN": "formItem 校验的状态" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "error", + "value": "error" + }, + { + "label": "validating", + "value": "validating" + }, + { + "label": "success", + "value": "success" + } + ] + } + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": {}, + "slots": { + "label": { + "label": { + "zh_CN": "label" + }, + "description": { + "zh_CN": "标签位置显示的内容" + } + }, + "error": { + "label": { + "zh_CN": "error" + }, + "description": { + "zh_CN": "验证错误信息的显示内容" + } + } + } + } + }, + { + "id": 1, + "version": "2.4.2", + "name": { + "zh_CN": "表单" + }, + "component": "ElTable", + "icon": "table", + "description": "用于展示多条结构类似的数据, 可对数据进行排序、筛选、对比或其他自定义操作", + "doc_url": "", + "screenshot": "", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "element-plus", + "version": "2.4.2", + "script": "https://unpkg.com/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://unpkg.com/element-plus@2.4.2/dist/index.css", + "dependencies": null, + "exportName": "ElTable" + }, + "group": "表单组件", + "category": "element-plus", + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": ["ElTableColumn"], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["inline", "label-width"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础属性" + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "data" + } + }, + "description": { + "zh_CN": "显示的数据" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "array", + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "columns", + "label": { + "text": { + "zh_CN": "表格列" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "properties": [ + { + "label": { + "zh_CN": "默认分组" + }, + "content": [ + { + "property": "type", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "type" + } + }, + "description": { + "text": { + "zh_CN": "对应列的类型。 如果设置了selection则显示多选框; 如果设置了 index 则显示该行的索引(从 1 开始计算); 如果设置了 expand 则显示为一个可展开的按钮" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "selection", + "value": "selection" + }, + { + "label": "index", + "value": "index" + }, + { + "label": "expand", + "value": "expand" + } + ] + } + } + }, + { + "property": "index", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "index" + } + }, + "description": { + "text": { + "zh_CN": "如果设置了 type=index,可以通过传递 index 属性来自定义索引" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "label", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "label" + } + }, + "description": { + "text": { + "zh_CN": "显示的标题" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "column-key", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "column-key" + } + }, + "description": { + "text": { + "zh_CN": "column 的 key, column 的 key, 如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "prop", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "prop" + } + }, + "description": { + "text": { + "zh_CN": "字段名称 对应列内容的字段名, 也可以使用 property属性" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "width", + "type": "number", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "width" + } + }, + "description": { + "text": { + "zh_CN": "对应列的宽度" + } + }, + "widget": { + "component": "MetaNumberic", + "props": {} + } + }, + { + "property": "min-width", + "type": "number", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "min-width" + } + }, + "description": { + "text": { + "zh_CN": "对应列的最小宽度, 对应列的最小宽度, 与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列" + } + }, + "widget": { + "component": "MetaNumberic", + "props": {} + } + }, + { + "property": "fixed", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "fixed" + } + }, + "description": { + "text": { + "zh_CN": "列是否固定在左侧或者右侧。 true 表示固定在左侧" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "left", + "value": "left" + }, + { + "label": "right", + "value": "right" + } + ] + } + } + }, + { + "property": "sortable", + "type": "boolean", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "sortable" + } + }, + "description": { + "text": { + "zh_CN": "对应列是否可以排序" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "sort-method", + "type": "function", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "sort-method" + } + }, + "description": { + "text": { + "zh_CN": "指定数据按照哪个属性进行排序,仅当sortable设置为true的时候有效。 应该如同 Array.sort 那样返回一个 Number" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "sort-by", + "type": "array", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "sort-by" + } + }, + "description": { + "text": { + "zh_CN": "指定数据按照哪个属性进行排序,仅当 sortable 设置为 true 且没有设置 sort-method 的时候有效。 如果 sort-by 为数组,则先按照第 1 个属性排序,如果第 1 个相等,再按照第 2 个排序,以此类推" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "sort-orders", + "type": "array", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "sort-orders" + } + }, + "description": { + "text": { + "zh_CN": "数据在排序时所使用排序策略的轮转顺序,仅当 sortable 为 true 时有效。 需传入一个数组,随着用户点击表头,该列依次按照数组中元素的顺序进行排序" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "resizable", + "type": "boolean", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "resizable" + } + }, + "description": { + "text": { + "zh_CN": "对应列是否可以通过拖动改变宽度(需要在 el-table 上设置 border 属性为真)" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "formatter", + "type": "function", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "formatter" + } + }, + "description": { + "text": { + "zh_CN": "用来格式化内容" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "show-overflow-tooltip", + "type": "boolean", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "show-overflow-tooltip" + } + }, + "description": { + "text": { + "zh_CN": "当内容过长被隐藏时显示 tooltip" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "align", + "type": "string", + "labelPosition": "top", + "defaultValue": "left", + "label": { + "text": { + "zh_CN": "align" + } + }, + "description": { + "text": { + "zh_CN": "对齐方式" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "left", + "value": "left" + }, + { + "label": "center", + "value": "center" + }, + { + "label": "right", + "value": "right" + } + ] + } + } + }, + { + "property": "header-align", + "type": "string", + "labelPosition": "top", + "defaultValue": "left", + "label": { + "text": { + "zh_CN": "header-align" + } + }, + "description": { + "text": { + "zh_CN": "表头对齐方式, 若不设置该项,则使用表格的对齐方式" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "left", + "value": "left" + }, + { + "label": "center", + "value": "center" + }, + { + "label": "right", + "value": "right" + } + ] + } + } + }, + { + "property": "class-name", + "type": "string", + "labelPosition": "top", + "defaultValue": "left", + "label": { + "text": { + "zh_CN": "class-name" + } + }, + "description": { + "text": { + "zh_CN": "列的 className" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label-class-name", + "type": "string", + "labelPosition": "top", + "defaultValue": "left", + "label": { + "text": { + "zh_CN": "label-class-name" + } + }, + "description": { + "text": { + "zh_CN": "当前列标题的自定义类名" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "selectable", + "type": "function", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "selectable" + } + }, + "description": { + "text": { + "zh_CN": "仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "reserve-selection", + "type": "boolean", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "reserve-selection" + } + }, + "description": { + "text": { + "zh_CN": "数据刷新后是否保留选项,仅对 type=selection 的列有效, 请注意, 需指定 row-key 来让这个功能生效。" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "filters", + "type": "array", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "filters" + } + }, + "description": { + "text": { + "zh_CN": "数据刷新后是否保留选项,仅对 type=selection 的列有效, 请注意, 需指定 row-key 来让这个功能生效。" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + }, + { + "property": "filter-placement", + "type": "string", + "labelPosition": "top", + "label": { + "text": { + "zh_CN": "filter-placement" + } + }, + "description": { + "text": { + "zh_CN": "过滤弹出框的定位" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "filter-multiple", + "type": "string", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "filter-multiple" + } + }, + "description": { + "text": { + "zh_CN": "数据过滤的选项是否多选" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "filter-method", + "type": "function", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "filter-method" + } + }, + "description": { + "text": { + "zh_CN": "数据过滤使用的方法, 如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 true 就会显示" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "filtered-value", + "type": "array", + "labelPosition": "top", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "filtered-value" + } + }, + "description": { + "text": { + "zh_CN": "选中的数据过滤项,如果需要自定义表头过滤的渲染方式,可能会需要此属性" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + } + } + ] + } + ], + "widget": { + "component": "MetaTableColumns", + "props": { + "type": "object", + "textField": "title", + "language": "json", + "buttonText": "编辑列配置", + "title": "编辑列配置", + "expand": true + } + }, + "description": { + "zh_CN": "表格列的配置信息" + }, + "labelPosition": "top" + }, + { + "property": "max-height", + "label": { + "text": { + "zh_CN": "max-height" + } + }, + "description": { + "zh_CN": "Table 的最大高度。" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "number", + "widget": { + "component": "MetaNumberic", + "props": {} + }, + "device": [] + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "height" + } + }, + "description": { + "zh_CN": "Table 的高度, 默认为自动高度。 这个高度会设置为 Table 的 style.height 的值,Table 的高度会受控于外部样式。" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + }, + "device": [] + }, + { + "property": "stripe", + "label": { + "text": { + "zh_CN": "stripe" + } + }, + "description": { + "zh_CN": "是否为斑马纹 table" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "border", + "label": { + "text": { + "zh_CN": "border" + } + }, + "description": { + "zh_CN": "是否带有纵向边框" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "size" + } + }, + "description": { + "zh_CN": "Table 的尺寸" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "defaultValue": "default", + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "default", + "value": "default" + }, + { + "label": "small", + "value": "small" + } + ] + } + } + }, + { + "property": "fit", + "label": { + "text": { + "zh_CN": "fit" + } + }, + "description": { + "zh_CN": "列的宽度是否自撑开" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": true, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "show-header", + "label": { + "text": { + "zh_CN": "show-header" + } + }, + "description": { + "zh_CN": "是否显示表头" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": true, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "highlight-current-row", + "label": { + "text": { + "zh_CN": "highlight-current-row" + } + }, + "description": { + "zh_CN": "是否要高亮当前行" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "current-row-key", + "label": { + "text": { + "zh_CN": "current-row-key" + } + }, + "description": { + "zh_CN": "当前行的 key,只写属性" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "type": "string", + "widget": { + "component": "MetaInput", + "props": {} + }, + "device": [] + }, + { + "property": "row-class-name", + "label": { + "text": { + "zh_CN": "row-class-name" + } + }, + "description": { + "zh_CN": "行的 className" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "widget": { + "component": "MetaInput", + "props": {} + }, + "device": [] + }, + { + "property": "row-key", + "label": { + "text": { + "zh_CN": "row-key" + } + }, + "description": { + "zh_CN": "行数据的 Key,用来优化 Table 的渲染; 在使用reserve-selection功能与显示树形数据时,该属性是必填的。 类型为 String 时,支持多层访问:user.info.id,但不支持 user.info[0].id,此种情况请使用 Function" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "device": [] + }, + { + "property": "empty-text", + "label": { + "text": { + "zh_CN": "empty-text" + } + }, + "description": { + "zh_CN": "空数据时显示的文本内容" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "widget": { + "component": "MetaInput", + "props": {} + }, + "device": [] + }, + { + "property": "table-layout", + "label": { + "text": { + "zh_CN": "table-layout" + } + }, + "description": { + "zh_CN": "设置表格单元、行和列的布局方式" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": "fixed", + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "fixed", + "value": "fixed" + }, + { + "label": "auto", + "value": "auto" + } + ] + } + }, + "device": [] + }, + { + "property": "scrollbar-always-on", + "label": { + "text": { + "zh_CN": "scrollbar-always-on" + } + }, + "description": { + "zh_CN": "总是显示滚动条" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "flexible", + "label": { + "text": { + "zh_CN": "flexible" + } + }, + "description": { + "zh_CN": "确保主轴的最小尺寸,以便不超过内容" + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "labelPosition": "top", + "defaultValue": false, + "type": "boolean", + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onSelect": { + "label": { + "zh_CN": "勾选数据行的 Checkbox 时触发" + }, + "description": { + "zh_CN": "当用户手动勾选数据行的 Checkbox 时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "selection", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中项" + } + }, + { + "name": "row", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前行" + } + } + ], + "returns": {} + } + }, + "onSelectAll": { + "label": { + "zh_CN": "勾选全选时触发" + }, + "description": { + "zh_CN": "当用户手动勾选全选 Checkbox 时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "selection", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中项" + } + } + ], + "returns": {} + } + }, + "onSelectionChange": { + "label": { + "zh_CN": "选择项发生变化时会触发" + }, + "description": { + "zh_CN": "当选择项发生变化时会触发该事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "selection", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中项" + } + } + ], + "returns": {} + } + }, + "onCellMouseEnter": { + "label": { + "zh_CN": "单元格 hover 时会触发" + }, + "description": { + "zh_CN": "当单元格 hover 进入时会触发该事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "row", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前行" + } + }, + { + "name": "column", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前列" + } + }, + { + "name": "cell", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前单元格" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生事件 event" + } + } + ], + "returns": {} + } + }, + "onCellMouseLeave": { + "label": { + "zh_CN": "单元格 hover 退出时会触发" + }, + "description": { + "zh_CN": "当单元格 hover 退出时会触发该事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "row", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前行" + } + }, + { + "name": "column", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前列" + } + }, + { + "name": "cell", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前单元格" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生事件 event" + } + } + ], + "returns": {} + } + } + }, + "slots": { + "empty": { + "label": { + "zh_CN": "empty" + }, + "description": { + "zh_CN": "当数据为空时自定义的内容" + } + }, + "append": { + "label": { + "zh_CN": "append" + }, + "description": { + "zh_CN": "插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。" + } + } + } + } + }, + { + "id": 1, + "version": "2.4.2", + "name": { + "zh_CN": "表单" + }, + "component": "ElTableColumn", + "icon": "table", + "description": "用于展示多条结构类似的数据, 可对数据进行排序、筛选、对比或其他自定义操作", + "doc_url": "", + "screenshot": "", + "tags": "", + "keywords": "", + "dev_mode": "proCode", + "npm": { + "package": "element-plus", + "version": "2.4.2", + "script": "https://unpkg.com/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://unpkg.com/element-plus@2.4.2/dist/index.css", + "dependencies": null, + "exportName": "ElTableColumn" + }, + "group": "表单组件", + "category": "element-plus", + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "isPopper": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["inline", "label-width"] + }, + "contextMenu": { + "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"], + "disable": [] + }, + "invalidity": [""], + "clickCapture": true, + "framework": "Vue" + }, + "schema": { + "properties": [ + { + "name": "0", + "label": { + "zh_CN": "基础属性" + }, + "content": [], + "description": { + "zh_CN": "" + } + } + ], + "events": {}, + "slots": {} + } + }, + { + "name": { + "zh_CN": "走马灯子项" + }, + "component": "TinyCarouselItem", + "icon": "carouselitem", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现。", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CarouselItem", + "version": "", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "幻灯片的名字,可用作 setActiveItem 的参数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "幻灯片的标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "indicator-position", + "label": { + "text": { + "zh_CN": "指示器的位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "outside", + "value": "outside" + }, + { + "label": "none", + "value": "none" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "走马灯" + }, + "component": "TinyCarousel", + "icon": "carousel", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现。", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Carousel", + "version": "", + "destructuring": true + }, + "group": "component", + "category": "容器组件", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "arrow", + "label": { + "text": { + "zh_CN": "切换箭头的显示时机" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "总是显示", + "value": "always" + }, + { + "label": "鼠标悬停时显示", + "value": "hover" + }, + { + "label": "从不显示", + "value": "never" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "autoplay", + "label": { + "text": { + "zh_CN": "是否自动切换" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "tabs", + "label": { + "text": { + "zh_CN": "选项卡" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "", + "cols": 12, + "bindState": false, + "widget": { + "component": "MetaContainer", + "props": {} + }, + "description": { + "zh_CN": "tabs" + }, + "labelPosition": "none" + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "走马灯的高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "indicator-position", + "label": { + "text": { + "zh_CN": "指示器的位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "走马灯外部", + "value": "outside" + }, + { + "label": "不显示", + "value": "none" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "initial-index", + "label": { + "text": { + "zh_CN": "初始状态激活的幻灯片的索引,从 0 开始 " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "interval", + "label": { + "text": { + "zh_CN": "自动切换的时间间隔,单位为毫秒" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "loop", + "label": { + "text": { + "zh_CN": "是否循环显示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "show-title", + "label": { + "text": { + "zh_CN": "是否显示标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "指示器的触发方式,默认为 hover" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "点击", + "value": "click" + }, + { + "label": "悬停", + "value": "hover" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "走马灯的类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "options": [ + { + "label": "水平", + "value": "horizontal" + }, + { + "label": "垂直", + "value": "vertical" + }, + { + "label": "卡片", + "value": "card" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "clickCapture": false, + "isModal": false, + "nestingRule": { + "childWhitelist": ["TinyCarouselItem"], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "link", + "name": { + "zh_CN": "提示框" + }, + "component": "a", + "description": "链接", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "group": "component", + "priority": 7, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "children", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlText", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + }, + { + "property": "href", + "label": { + "text": { + "zh_CN": "跳转链接" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "链接" + } + }, + { + "property": "target", + "label": { + "text": { + "zh_CN": "页面目标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "当前页面", + "value": "_self" + }, + { + "label": "打开新页面", + "value": "_blank" + } + ] + } + }, + "description": { + "zh_CN": "链接" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ] + }, + "configure": { + "loop": true, + "condition": true, + "slots": [], + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [] + }, + "contextMenu": { + "actions": [], + "disable": [] + } + } + }, + { + "name": { + "zh_CN": "标题" + }, + "component": ["h1", "h2", "h3", "h4", "h5", "h6"], + "icon": "h16", + "description": "标题", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 20, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "children", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlText", + "props": { + "showRadioButton": true + } + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "段落" + }, + "component": "p", + "icon": "paragraph", + "description": "段落", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 30, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "children", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlText", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [] + }, + "contextMenu": { + "actions": [], + "disable": [] + } + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "component": "input", + "icon": "input", + "description": "输入框", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 40, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "checkbox", + "value": "checkbox" + }, + { + "label": "color", + "value": "color" + }, + { + "label": "date", + "value": "date" + }, + { + "label": "button", + "value": "button" + }, + { + "label": "email", + "value": "email" + }, + { + "label": "file", + "value": "file" + }, + { + "label": "hidden", + "value": "hidden" + }, + { + "label": "image", + "value": "image" + }, + { + "label": "month", + "value": "month" + }, + { + "label": "number", + "value": "number" + }, + { + "label": "password", + "value": "password" + }, + { + "label": "radio", + "value": "radio" + }, + { + "label": "range", + "value": "range" + }, + { + "label": "reset", + "value": "reset" + }, + { + "label": "search", + "value": "search" + }, + { + "label": "submit", + "value": "submit" + }, + { + "label": "text", + "value": "text" + }, + { + "label": "time", + "value": "time" + }, + { + "label": "week", + "value": "week" + }, + { + "label": "url", + "value": "url" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onChange": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "视频" + }, + "component": "video", + "icon": "video", + "description": "视频", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 50, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "src", + "label": { + "text": { + "zh_CN": "视频的 URL" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "视频播放器的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "height", + "label": { + "text": { + "zh_CN": "视频播放器的高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "controls", + "label": { + "text": { + "zh_CN": "是否显示控件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "autoplay", + "label": { + "text": { + "zh_CN": "是否马上播放" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": [] + }, + "contextMenu": { + "actions": [], + "disable": [] + } + } + }, + { + "icon": "Image", + "name": { + "zh_CN": "Img" + }, + "component": "Img", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 60, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "src", + "type": "string", + "defaultValue": "", + "bindState": true, + "label": { + "text": { + "zh_CN": "src路径" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": ["src"] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "button", + "name": { + "zh_CN": "Button" + }, + "component": "button", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 70, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "table", + "name": { + "zh_CN": "表格" + }, + "component": "table", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 80, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "width", + "label": { + "text": { + "zh_CN": "表格的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "border", + "label": { + "text": { + "zh_CN": "表格边框的宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "td", + "name": { + "zh_CN": "表格单元格" + }, + "component": "td", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 90, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "colspan", + "label": { + "text": { + "zh_CN": "单元格可横跨的列数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "rowspan", + "label": { + "text": { + "zh_CN": "单元格可横跨的行数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "attributes3", + "label": { + "text": { + "zh_CN": "原生属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaHtmlAttributes", + "props": {} + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "none" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "form", + "name": { + "zh_CN": "表单" + }, + "component": "form", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 100, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "表单的名称" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "action", + "label": { + "text": { + "zh_CN": "提交表单时向何处发送表单数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "method", + "label": { + "text": { + "zh_CN": "用于发送 form-data 的 HTTP 方法" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "get", + "value": "get" + }, + { + "label": "post", + "value": "post" + } + ] + } + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击时触发" + }, + "description": { + "zh_CN": "点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "label", + "name": { + "zh_CN": "表单标签" + }, + "component": "label", + "container": false, + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": {}, + "group": "component", + "category": "html", + "priority": 110, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "for", + "label": { + "text": { + "zh_CN": "label 绑定到哪个表单元素" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "form", + "label": { + "text": { + "zh_CN": "label 字段所属的一个或多个表单" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "name": { + "zh_CN": "按钮组" + }, + "component": "TinyButtonGroup", + "icon": "buttonGroup", + "description": "以按钮组的方式出现,常用于多项类似操作", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "ButtonGroup", + "version": "", + "destructuring": true + }, + "group": "component", + "category": "general", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "按钮组数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "组件大小" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "mini", + "value": "mini" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "medium", + "value": "medium" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "plain", + "label": { + "text": { + "zh_CN": "是否是朴素按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "row", + "name": { + "zh_CN": "row" + }, + "component": "TinyRow", + "description": "定义 Layout 的行配置信息", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Row", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 5, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "layout", + "label": { + "text": { + "zh_CN": "layout" + } + }, + "cols": 12, + "widget": { + "component": "MetaLayoutGrid", + "props": {} + }, + "description": { + "zh_CN": "layout" + }, + "labelPosition": "none" + }, + { + "property": "align", + "label": { + "text": { + "zh_CN": "align" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "middle", + "value": "middle" + }, + { + "label": "bottom", + "value": "bottom" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "flex", + "label": { + "text": { + "zh_CN": "flex" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "gutter", + "label": { + "text": { + "zh_CN": "gutter" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ] + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "form", + "name": { + "zh_CN": "表单" + }, + "component": "TinyForm", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Form", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 5, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label-width", + "label": { + "text": { + "zh_CN": "标签宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单中标签占位宽度,默认为 80px" + }, + "labelPosition": "left" + }, + { + "property": "inline", + "label": { + "text": { + "zh_CN": "行内布局" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "行内布局模式,默认为 false" + } + }, + { + "property": "label-align", + "label": { + "text": { + "zh_CN": "必填标识是否占位" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "必填标识 * 是否占位" + }, + "labelPosition": "left" + }, + { + "property": "label-suffix", + "label": { + "text": { + "zh_CN": "标签后缀" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单中标签后缀" + } + }, + { + "property": "label-position", + "label": { + "text": { + "zh_CN": "标签位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "right", + "value": "right" + }, + { + "label": "left ", + "value": "left " + }, + { + "label": "top", + "value": "top" + } + ] + } + }, + "description": { + "zh_CN": "表单中标签的布局位置" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "校验属性" + }, + "content": [ + { + "property": "model", + "label": { + "text": { + "zh_CN": "表单校验对象" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表单数据对象" + }, + "labelPosition": "left" + }, + { + "property": "rules", + "label": { + "text": { + "zh_CN": "校验规则" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表单验证规则" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onValidate": { + "label": { + "zh_CN": "表单项被校验后触发" + }, + "description": { + "zh_CN": "表单项被校验后触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "function", + "type": "Function", + "defaultValue": "(valid) => {}", + "description": { + "zh_CN": "校验回调函数" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onInput": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框输入的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": [], + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "formitem", + "name": { + "zh_CN": "表单项" + }, + "component": "TinyFormItem", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "FormItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 12, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "label", + "label": { + "text": { + "zh_CN": "标签文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "标签", + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标签文本" + }, + "labelPosition": "left" + }, + { + "property": "prop", + "label": { + "text": { + "zh_CN": "校验字段" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的" + } + }, + { + "property": "required", + "label": { + "text": { + "zh_CN": "必填" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否必填" + }, + "labelPosition": "left" + } + ] + } + ], + "events": {}, + "slots": { + "label": { + "label": { + "zh_CN": "字段名" + }, + "description": { + "zh_CN": "自定义显示字段名称" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": ["TinyForm"], + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label", "rules"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "col", + "name": { + "zh_CN": "col" + }, + "component": "TinyCol", + "description": "列配置信息", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Col", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "span", + "label": { + "text": { + "zh_CN": "栅格列格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "整行", + "value": 12 + }, + { + "label": "6格", + "value": 6 + }, + { + "label": "4格", + "value": 4 + }, + { + "label": "3格", + "value": 3 + }, + { + "label": "1格", + "value": 1 + } + ] + } + }, + "description": { + "zh_CN": "当一行分为12格时,一列可占位多少格" + } + }, + { + "property": "move", + "label": { + "text": { + "zh_CN": "栅格左右移动格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": -12, + "max": 12 + } + }, + "description": { + "zh_CN": "栅格左右移动格数(正数向右,负数向左)" + } + }, + { + "property": "no", + "label": { + "text": { + "zh_CN": "排序编号" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "max": 12 + } + }, + "description": { + "zh_CN": "排序编号(row中启用order生效)" + } + }, + { + "property": "offset", + "label": { + "text": { + "zh_CN": "间隔格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 0, + "max": 12 + } + }, + "description": { + "zh_CN": "栅格左侧的间隔格数" + } + }, + { + "property": "xs", + "label": { + "text": { + "zh_CN": "超小屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "<768px 响应式栅格数" + } + }, + { + "property": "sm", + "label": { + "text": { + "zh_CN": "小屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥768px 响应式栅格数" + } + }, + { + "property": "md", + "label": { + "text": { + "zh_CN": "中屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥992px 响应式栅格数" + } + }, + { + "property": "lg", + "label": { + "text": { + "zh_CN": "大屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥1200px 响应式栅格数" + } + }, + { + "property": "xl", + "label": { + "text": { + "zh_CN": "超大屏格数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "min": 1, + "max": 12 + } + }, + "description": { + "zh_CN": "≥1920px 响应式栅格数" + } + } + ] + } + ], + "events": {} + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label", "rules"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "按钮" + }, + "component": "TinyButton", + "icon": "button", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Button", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "type": "string", + "defaultValue": "按钮文案", + "label": { + "text": { + "zh_CN": "按钮文字" + } + }, + "cols": 12, + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "type": "select", + "label": { + "text": { + "zh_CN": "大小" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "large", + "value": "large" + }, + { + "label": "medium", + "value": "medium" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "mini", + "value": "mini" + } + ] + } + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "primary", + "value": "primary" + }, + { + "label": "success", + "value": "success" + }, + { + "label": "info", + "value": "info" + }, + { + "label": "warning", + "value": "warning" + }, + { + "label": "danger", + "value": "danger" + }, + { + "label": "text", + "value": "text" + } + ] + } + }, + "description": { + "zh_CN": "设置不同的主题样式" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "round", + "label": { + "text": { + "zh_CN": "圆角" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否圆角按钮" + }, + "labelPosition": "left" + }, + { + "property": "plain", + "label": { + "text": { + "zh_CN": "朴素按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否为朴素按钮" + }, + "labelPosition": "left" + }, + { + "property": "reset-time", + "label": { + "text": { + "zh_CN": "禁用时间" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "设置禁用时间,防止重复提交,单位毫秒" + } + }, + { + "property": "circle", + "label": { + "text": { + "zh_CN": "圆角" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否圆形按钮" + }, + "labelPosition": "left" + }, + { + "property": "autofocus", + "label": { + "text": { + "zh_CN": "聚焦" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否默认聚焦" + }, + "labelPosition": "left" + }, + { + "property": "loading", + "label": { + "text": { + "zh_CN": "加载中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否展示位加载中样式" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "按钮被点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "输入框" + }, + "component": "TinyInput", + "icon": "input", + "description": "通过鼠标或键盘输入字符", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Input", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "textarea", + "value": "textarea" + }, + { + "label": "text", + "value": "text" + }, + { + "label": "password", + "value": "password" + } + ] + } + }, + "description": { + "zh_CN": "设置input框的type属性" + } + }, + { + "property": "rows", + "label": { + "text": { + "zh_CN": "行数" + } + }, + "widget": { + "component": "MetaNumber" + }, + "description": { + "zh_CN": "输入框行数,只对 type='textarea' 有效" + } + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "medium", + "value": "medium" + }, + { + "label": "small", + "value": "small" + }, + { + "label": "mini", + "value": "mini" + } + ] + } + }, + "description": { + "zh_CN": "输入框尺寸。该属性的可选值为 medium / small / mini" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "maxlength", + "label": { + "text": { + "zh_CN": "最大长度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "设置 input 框的maxLength" + }, + "labelPosition": "left" + }, + { + "property": "autofocus", + "label": { + "text": { + "zh_CN": "聚焦" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "自动获取焦点" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值改变时触发" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框改变后的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onInput": { + "label": { + "zh_CN": "输入值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "输入框输入的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "在 Input 输入值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "slots": { + "prefix": { + "label": { + "zh_CN": "前置内容" + } + }, + "suffix": { + "label": { + "zh_CN": "后置内容" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "radio", + "name": { + "zh_CN": "单选" + }, + "component": "TinyRadio", + "description": "用于配置不同场景的选项,在一组备选项中进行单选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Radio", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 3, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "label", + "label": { + "text": { + "zh_CN": "单选框的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "label": { + "zh_CN": "其他" + }, + "description": { + "zh_CN": "" + }, + "content": [ + { + "property": "border", + "label": { + "text": { + "zh_CN": "显示边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "label": { + "text": { + "zh_CN": "单选框的尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "name", + "label": { + "text": { + "zh_CN": "原生 name 属性" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值变化事件" + }, + "description": { + "zh_CN": "绑定值变化时触发的事件" + } + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["visible", "width"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "select", + "name": { + "zh_CN": "下拉框" + }, + "component": "TinySelect", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Select", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 8, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "searchable", + "label": { + "text": { + "zh_CN": "下拉面板可搜索" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "下拉面板是否可搜索" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "下拉数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "配置 Select 下拉数据项" + }, + "labelPosition": "left" + }, + { + "property": "multiple", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许输入框输入或选择多个项" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "multiple-limit", + "label": { + "text": { + "zh_CN": "最大可选值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "多选时用户最多可以选择的项目数,为 0 则不限制" + }, + "labelPosition": "left" + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "下拉框的类名" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置下拉框自定义的类名" + }, + "labelPosition": "left" + }, + { + "property": "collapse-tags", + "label": { + "text": { + "zh_CN": "多选展示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "多选时是否将选中值按文字的形式展示" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "值改变时触发" + }, + "description": { + "zh_CN": "在下拉框值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "下拉框选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onBlur": { + "label": { + "zh_CN": "失去焦点时触发" + }, + "description": { + "zh_CN": "在 Input 失去焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onFocus": { + "label": { + "zh_CN": "获取焦点时触发" + }, + "description": { + "zh_CN": "在 Input 获取焦点时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClear": { + "label": { + "zh_CN": "点击清空按钮时触发" + }, + "description": { + "zh_CN": "点击清空按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onRemoveTag": { + "label": { + "zh_CN": "多选模式下移除tag时触发" + }, + "description": { + "zh_CN": "多选模式下移除tag时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "被移除Tag对应数据项的值字段" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + }, + "onBeforeMount": "console.log('table on load'); this.options = source.data" + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["multiple", "options"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "switch", + "name": { + "zh_CN": "开关" + }, + "component": "TinySwitch", + "description": "Switch 在两种状态间切换选择", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Switch", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 9, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "绑定默认值" + } + }, + { + "property": "true-value", + "label": { + "text": { + "zh_CN": "打开时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置打开时的值(Boolean / String / Number)" + }, + "labelPosition": "left" + }, + { + "property": "false-value", + "label": { + "text": { + "zh_CN": "关闭时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置关闭时的值(Boolean / String / Number)" + }, + "labelPosition": "left" + }, + { + "property": "mini", + "label": { + "text": { + "zh_CN": "迷你尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示为 mini 模式" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "按钮被点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "开关的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的开关状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "search", + "name": { + "zh_CN": "搜索框" + }, + "component": "TinySearch", + "description": "指定条件对象进行搜索数据", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Search", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "默认值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框内的默认搜索值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否被禁用" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本 " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框内的提示占位文本" + }, + "labelPosition": "left" + }, + { + "property": "clearable", + "label": { + "text": { + "zh_CN": "清空按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置显示清空图标按钮" + }, + "labelPosition": "left" + }, + { + "property": "isEnterSearch", + "label": { + "text": { + "zh_CN": "是否Enter键触发search事件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否在按下键盘Enter键的时候触发search事件" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他配置" + }, + "content": [ + { + "property": "mini", + "label": { + "text": { + "zh_CN": "迷你尺寸" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "迷你模式,配置为true时,搜索默认显示为一个带图标的圆形按钮,点击后展开" + }, + "labelPosition": "left" + }, + { + "property": "transparent", + "label": { + "text": { + "zh_CN": "透明模式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "配置为true时,边框变为透明且收缩后半透明显示,一般用在带有背景的场景,默认 false" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "输入完成时触发" + }, + "description": { + "zh_CN": "在 input 框中输入完成时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "搜索类型,默认值为 {} " + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前input框中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onSearch": { + "label": { + "zh_CN": "点击搜索按钮时触发" + }, + "description": { + "zh_CN": "展开状态点击搜索按钮时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "搜索类型,默认值为 {} " + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前input框中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["clearable", "mini"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "checkbox", + "name": { + "zh_CN": "复选框" + }, + "component": "TinyCheckbox", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Checkbox", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 4, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "checked", + "label": { + "text": { + "zh_CN": "勾选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当前是否勾选" + }, + "labelPosition": "left" + }, + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "复选框的文本" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "border", + "label": { + "text": { + "zh_CN": "边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示边框" + } + }, + { + "property": "false-label", + "label": { + "text": { + "zh_CN": "未选中的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "没有选中时的值" + } + }, + { + "property": "true-label", + "label": { + "text": { + "zh_CN": "选择时的值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "选中时的值" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["border", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "checkboxbutton", + "name": { + "zh_CN": "复选按钮" + }, + "component": "TinyCheckboxButton", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CheckboxButton", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "checked", + "label": { + "text": { + "zh_CN": "勾选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当前是否勾选" + }, + "labelPosition": "left" + }, + { + "property": "text", + "label": { + "text": { + "zh_CN": "文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "按钮文本" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "array", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["text", "size"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "checkboxgroup", + "name": { + "zh_CN": "复选按钮组" + }, + "component": "TinyCheckboxGroup", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CheckboxGroup", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "dataType": "Array" + } + }, + "description": { + "zh_CN": "双向绑定的当前选中值" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "数据列表" + } + }, + "defaultValue": [ + { + "label": "标签2" + }, + { + "label": "标签2" + } + ], + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "checkbox组件列表" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "button", + "value": "button" + }, + { + "label": "checkbox", + "value": "checkbox" + } + ] + } + }, + "description": { + "zh_CN": "checkbox组件类型(button/checkbox),该属性的默认值为 checkbox,配合 options 属性一起使用" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "勾选值改变后将触发" + }, + "description": { + "zh_CN": "勾选值改变后将触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "选中项的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "array", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "type"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "dialogbox", + "name": { + "zh_CN": "对话框" + }, + "component": "TinyDialogBox", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作。", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DialogBox", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 4, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "弹出框标题" + }, + "labelPosition": "left" + }, + { + "property": "visible", + "label": { + "text": { + "zh_CN": "显示与隐藏" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "控制弹出框显示与关闭" + }, + "labelPosition": "left" + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "弹出框的宽度" + }, + "labelPosition": "left" + }, + { + "property": "draggable", + "label": { + "text": { + "zh_CN": "可拖拽" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否开启弹窗的拖拽功能,默认值为 false 。" + } + }, + { + "property": "center", + "label": { + "text": { + "zh_CN": "居中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "弹出框的头部与底部内容会自动居中" + }, + "labelPosition": "left" + }, + { + "property": "dialog-class", + "label": { + "text": { + "zh_CN": "自定义类" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "自定义配置弹窗类名" + }, + "labelPosition": "left" + }, + { + "property": "append-to-body", + "label": { + "text": { + "zh_CN": "插入到 Body " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "DialogBox 本身是否插入到 body 上,嵌套的 Dialog 必须指定该属性并赋值为 true" + }, + "labelPosition": "left" + }, + { + "property": "show-close", + "label": { + "text": { + "zh_CN": "关闭按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示关闭按钮,默认值为 true 。" + } + } + ] + } + ], + "selector": ".TinyDialogBox", + "events": { + "onClose": { + "label": { + "zh_CN": "关闭弹窗时触发" + }, + "description": { + "zh_CN": "Dialog 关闭的回调" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:visible": { + "label": { + "zh_CN": "双向绑定的状态改变时触发" + }, + "description": { + "zh_CN": "显示或隐藏的状态值,发生改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的显示或隐藏的状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + }, + "slots": { + "title": { + "label": { + "zh_CN": "标题区" + }, + "description": { + "zh_CN": "Dialog 标题区的内容" + } + }, + "footer": { + "label": { + "zh_CN": "按钮操作区" + }, + "description": { + "zh_CN": "Dialog 按钮操作区的内容" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": true, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": ".tiny-dialog-box", + "shortcuts": { + "properties": ["visible", "width"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tabs", + "name": { + "zh_CN": "标签页" + }, + "component": "TinyTabs", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tabs", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 10, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "showEditIcon", + "label": { + "text": { + "zh_CN": "显示编辑ICON " + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示标题后编辑 ICON" + }, + "labelPosition": "left" + }, + { + "property": "tabs", + "label": { + "text": { + "zh_CN": "选项卡" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "", + "cols": 12, + "bindState": false, + "widget": { + "component": "MetaContainer", + "props": {} + }, + "description": { + "zh_CN": "tabs" + }, + "labelPosition": "none" + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "绑定值,选中选项卡的 name" + }, + "labelPosition": "left" + }, + { + "property": "with-add", + "label": { + "text": { + "zh_CN": "可新增" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "标签是否可增加" + }, + "labelPosition": "left" + }, + { + "property": "with-close", + "label": { + "text": { + "zh_CN": "可关闭" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "标签是否可关闭" + }, + "labelPosition": "left" + }, + { + "property": "tab-style", + "label": { + "text": { + "zh_CN": "标签页样式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "card", + "value": "card" + }, + { + "label": "border-card", + "value": "border-card" + } + ] + } + }, + "description": { + "zh_CN": "标签页样式" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击页签时触发事件" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "component", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前点击的页签对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "原生 event" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onEdit": { + "label": { + "zh_CN": "点击新增按钮或关闭按钮或者编辑按钮后触发" + }, + "description": { + "zh_CN": "点击新增按钮或关闭按钮或者编辑按钮后触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "tab", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前操作的页签对象" + } + }, + { + "name": "type", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前操作的类型(remove || add || edit)" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClose": { + "label": { + "zh_CN": "关闭页签时触发" + }, + "description": { + "zh_CN": "关闭页签时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "name", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "页签名称" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "clickCapture": false, + "isModal": false, + "nestingRule": { + "childWhitelist": ["TinyTabItem"], + "parentWhitelist": [], + "descendantBlacklist": [], + "ancestorWhitelist": [] + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["size", "tab-style"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tabitem", + "name": { + "zh_CN": "tab页签" + }, + "component": "TinyTabItem", + "description": "tab 标签页", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TinyTabItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "唯一表示" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "唯一表示" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标题" + } + } + ] + } + ], + "events": {}, + "slots": { + "title": { + "label": { + "zh_CN": "标题" + }, + "description": { + "zh_CN": "自定义标题" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": ["TinyTab"], + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["name", "title"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "breadcrumb", + "name": { + "zh_CN": "面包屑" + }, + "component": "TinyBreadcrumb", + "description": "告诉访问者他们目前在网站中的位置以及如何返回", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Select", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "separator", + "label": { + "text": { + "zh_CN": "分隔符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "自定义分隔符" + }, + "labelPosition": "left" + }, + { + "property": "options", + "label": { + "text": { + "zh_CN": "options" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "textField", + "label": { + "text": { + "zh_CN": "textField" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onSelect": { + "label": { + "zh_CN": "选择 breadcrumb 时触发" + }, + "description": { + "zh_CN": "选择 breadcrumb 时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "clickCapture": false, + "isModal": false, + "nestingRule": { + "childWhitelist": ["TinyBreadcrumbItem"], + "parentWhitelist": [], + "descendantBlacklist": [], + "ancestorWhitelist": [] + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["separator"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "breadcrumb", + "name": { + "zh_CN": "面包屑项" + }, + "component": "TinyBreadcrumbItem", + "description": "", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TinyBreadcrumbItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "to", + "label": { + "text": { + "zh_CN": "路由路径" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "面包屑项" + } + } + ] + } + ], + "slots": { + "default": { + "label": { + "zh_CN": "面包屑项标签" + }, + "description": { + "zh_CN": "面包屑项" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": ["TinyBreadcrumb"], + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["to"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "collapse", + "name": { + "zh_CN": "折叠面板" + }, + "component": "TinyCollapse", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Collapse", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 3, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "当前激活的面板" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定当前激活的面板" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "激活面板改变时触发" + }, + "description": { + "zh_CN": "当前激活面板改变时触发(如果是手风琴模式,参数 activeNames 类型为string,否则为array)" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前激活面板的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前激活面板的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "collapseitem", + "name": { + "zh_CN": "折叠面板项" + }, + "component": "TinyCollapseItem", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "CollapseItem", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "label": { + "text": { + "zh_CN": "唯一标志符" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "唯一标志符;String | Number" + }, + "labelPosition": "left" + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "面板标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "面板标题" + }, + "labelPosition": "left" + } + ] + } + ], + "events": {}, + "slots": { + "title": { + "label": { + "zh_CN": "标题" + }, + "description": { + "zh_CN": "自定义标题" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "grid", + "name": { + "zh_CN": "表格" + }, + "component": "TinyGrid", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Grid", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 2, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础属性" + }, + "description": { + "zh_CN": "基础属性" + }, + "collapse": { + "number": 15, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "data", + "label": { + "text": { + "zh_CN": "表格数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "onChange": "this.delProp('fetchData')", + "description": { + "zh_CN": "设置表格的数据" + } + }, + { + "property": "columns", + "label": { + "text": { + "zh_CN": "表格列" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "properties": [ + { + "label": { + "zh_CN": "默认分组" + }, + "content": [ + { + "property": "title", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列标题" + } + }, + "widget": { + "component": "MetaBindI18n", + "props": {} + } + }, + { + "property": "field", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列键值" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "sortable", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否排序" + } + }, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "width", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列宽" + } + }, + "widget": { + "component": "MetaNumber", + "props": {} + } + }, + { + "property": "formatText", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "内置渲染器" + } + }, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "整数", + "value": "integer" + }, + { + "label": "小数", + "value": "number" + }, + { + "label": "金额", + "value": "money" + }, + { + "label": "百分比", + "value": "rate" + }, + { + "label": "布尔", + "value": "boole" + }, + { + "label": "年月日", + "value": "date" + }, + { + "label": "年月日时分", + "value": "dateTime" + }, + { + "label": "时间", + "value": "time" + }, + { + "label": "省略", + "value": "ellipsis" + } + ] + } + } + }, + { + "property": "renderer", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "dataType": "JSFunction" + } + } + }, + { + "property": "slots", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "插槽" + } + }, + "labelPosition": "none", + "widget": { + "component": "MetaJsSlot", + "props": { + "slots": ["header", "default"] + } + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "列类型" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "索引列", + "value": "index" + }, + { + "label": "单选列", + "value": "radio" + }, + { + "label": "多选列", + "value": "selection" + }, + { + "label": "展开列", + "value": "expand" + } + ], + "clearable": true + } + }, + "description": { + "zh_CN": "设置内置列的类型,该属性的可选值为 index(序号)/ selection(复选框)/ radio(单选框)/ expand(展开行)" + }, + "labelPosition": "left" + }, + { + "property": "editor", + "label": { + "text": { + "zh_CN": "编辑配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "单元格编辑渲染配置项,也可以是函数 Function(h, params)" + }, + "labelPosition": "left" + }, + { + "property": "filter", + "label": { + "text": { + "zh_CN": "筛选配置" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息" + } + }, + { + "property": "showOverflow", + "label": { + "text": { + "zh_CN": "内容超出部分省略号配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "只显示省略号", + "value": "ellipsis" + }, + { + "label": "显示为原生 title", + "value": "title" + }, + { + "label": "显示为 tooltip 提示", + "value": "tooltip" + } + ], + "clearable": true + } + }, + "description": { + "zh_CN": "设置内置列的内容超出部分显示省略号配置,该属性的可选值为 ellipsis(只显示省略号)/ title(显示为原生 title)/ tooltip(显示为 tooltip 提示)" + }, + "labelPosition": "left" + } + ] + } + ], + "widget": { + "component": "MetaArrayItem", + "props": { + "type": "object", + "textField": "title", + "language": "json", + "buttonText": "编辑列配置", + "title": "编辑列配置", + "expand": true + } + }, + "description": { + "zh_CN": "表格列的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "fetchData", + "label": { + "text": { + "zh_CN": "服务端数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "onChange": "this.delProp('data')", + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "name": "fetchData", + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "服务端数据查询方法" + } + }, + { + "property": "pager", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "defaultValue": { + "attrs": { + "currentPage": 1 + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "name": "pager", + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "分页配置" + } + }, + { + "property": "resizable", + "label": { + "text": { + "zh_CN": "调整列宽" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许调整列宽" + }, + "labelPosition": "left" + }, + { + "property": "row-id", + "label": { + "text": { + "zh_CN": "行数据唯一标识的字段名" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "placeholder": "比如:id" + } + }, + "description": { + "zh_CN": "行数据唯一标识的字段名" + }, + "labelPosition": "left" + }, + { + "property": "select-config", + "label": { + "text": { + "zh_CN": "复选框配置" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "dataType": "JSExpression" + } + }, + "description": { + "zh_CN": "表格行数据复选框配置项" + }, + "labelPosition": "left" + }, + { + "property": "edit-rules", + "label": { + "text": { + "zh_CN": "校验规则" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表格校验规则配置项" + }, + "labelPosition": "left" + }, + { + "property": "edit-config", + "label": { + "text": { + "zh_CN": "编辑配置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "表格编辑配置项" + } + }, + { + "property": "expand-config", + "label": { + "text": { + "zh_CN": "复选框配置项" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "复选框配置项" + }, + "labelPosition": "left" + }, + { + "property": "sortable", + "label": { + "text": { + "zh_CN": "可排序" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许列数据排序。默认为 true 可排序" + }, + "labelPosition": "left" + } + ] + }, + { + "label": { + "zh_CN": "其他属性" + }, + "description": { + "zh_CN": "其他属性" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "auto-resize", + "label": { + "text": { + "zh_CN": "可排序" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否允许列数据排序。默认为 true 可排序" + }, + "labelPosition": "left" + }, + { + "property": "border", + "label": { + "text": { + "zh_CN": "边框" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否带有纵向边框" + }, + "labelPosition": "left" + }, + { + "property": "seq-serial", + "label": { + "text": { + "zh_CN": "行号连续" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置行序号是否连续,开启分页时有效,该属性的默认值为 false" + }, + "labelPosition": "left" + }, + { + "property": "highlight-current-row", + "label": { + "text": { + "zh_CN": "高亮当前行" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "高亮当前行" + }, + "labelPosition": "left" + }, + { + "property": "highlight-hover-row", + "label": { + "text": { + "zh_CN": "hover 时候高亮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "鼠标移到行是否要高亮显示" + }, + "labelPosition": "left" + }, + { + "property": "row-class-name", + "label": { + "text": { + "zh_CN": "hover 高亮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "给行附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex})" + }, + "labelPosition": "left" + }, + { + "property": "max-height", + "label": { + "text": { + "zh_CN": "最大高度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "设置表格内容区域(不含表格头部,底部)的最大高度。" + }, + "labelPosition": "left" + }, + { + "property": "row-span", + "label": { + "text": { + "zh_CN": "行合并" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置行合并,该属性仅适用于普通表格,不可与 tree-config 同时使用" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onFilterChange": { + "label": { + "zh_CN": "筛选条件改变时触发改事件" + }, + "description": { + "zh_CN": "配置 remote-filter 开启服务端过滤,服务端过滤会调用表格 fetch-data 进行查询,filter-change 服务端过滤后触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "{$table,filters} 包含 table 实例对象和过滤条件的对象" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onSortChange": { + "label": { + "zh_CN": "点击列头,执行数据排序前触发的事件" + }, + "description": { + "zh_CN": "配置 remote-filter 开启服务端过滤,服务端过滤会调用表格 fetch-data 进行查询,filter-change 服务端过滤后触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "{$table,filters} 包含 table 实例对象和过滤条件的对象" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onSelectAll": { + "label": { + "zh_CN": "当手动勾选全选时触发的事件" + }, + "description": { + "zh_CN": "只对 type=selection 有效,当手动勾选全选时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " 包含 table 实例对象" + } + }, + { + "name": "checked", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "勾选状态" + } + }, + { + "name": "selction", + "type": "Array", + "defaultValue": "", + "description": { + "zh_CN": "选中的表格数据数组" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onSelectChange": { + "label": { + "zh_CN": "手动勾选并且值发生改变时触发的事件" + }, + "description": { + "zh_CN": "只对 type=selection 有效,当手动勾选并且值发生改变时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " table 实例对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " 原生 Event" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onToggleExpandChange": { + "label": { + "zh_CN": "当行展开或收起时会触发该事件" + }, + "description": { + "zh_CN": "当行展开或收起时会触发该事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "table", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "{$table,row,rowIndex} 包含 table 实例对象和当前行数据的对象" + } + }, + { + "name": "event", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": " 原生 Event" + } + } + ], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + }, + "onCurrentChange": { + "label": { + "zh_CN": "行点击时触发" + }, + "description": { + "zh_CN": "行点击时触发" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": ["sortable", "columns"] + }, + "contentMenu": { + "actions": ["create symbol"] + }, + "onBeforeMount": "console.log('table on load'); this.pager = source.pager; this.fetchData = source.fetchData; this.data = source.data ;this.columns = source.columns" + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["sortable", "columns"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "分页" + }, + "component": "TinyPager", + "icon": "pager", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Pager", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 1, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 10, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "currentPage", + "label": { + "text": { + "zh_CN": "当前页数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "当前页数,支持 .sync 修饰符" + }, + "labelPosition": "left" + }, + { + "property": "pageSize", + "label": { + "text": { + "zh_CN": "每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "每页显示条目个数" + }, + "labelPosition": "left" + }, + { + "property": "pageSizes", + "label": { + "text": { + "zh_CN": "可选每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置可选择的每页显示条数" + } + }, + { + "property": "total", + "label": { + "text": { + "zh_CN": "总条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "数据总条数" + }, + "labelPosition": "left" + }, + { + "property": "layout", + "label": { + "text": { + "zh_CN": "布局" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "defaultValue": "total,sizes,prev, pager, next", + "widget": { + "component": "MetaInput", + "props": { + "type": "textarea" + } + }, + "description": { + "zh_CN": "组件布局,子组件名用逗号分隔" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onCurrentChange ": { + "label": { + "zh_CN": "切换页码时触发" + }, + "description": { + "zh_CN": "切换页码时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前页的值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onPrevClick ": { + "label": { + "zh_CN": "点击上一页按钮时触发" + }, + "description": { + "zh_CN": "点击上一页按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "page", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页的页码值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onNextClick": { + "label": { + "zh_CN": "点击下一页按钮时触发" + }, + "description": { + "zh_CN": "点击上一页按钮时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "page", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页的页码值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["currentPage", "total"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "name": { + "zh_CN": "弹出编辑" + }, + "component": "TinyPopeditor", + "icon": "popEditor", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "PopEditor", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 6, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "show-clear-btn", + "label": { + "text": { + "zh_CN": "清除按钮" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示清除按钮" + }, + "labelPosition": "left" + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板的宽度(单位像素)" + }, + "labelPosition": "left" + }, + { + "property": "conditions", + "label": { + "text": { + "zh_CN": "过滤条件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "当弹出面板配置的是表格时,设置弹出面板中的过滤条件" + }, + "labelPosition": "left" + }, + { + "property": "grid-op", + "label": { + "text": { + "zh_CN": "表格配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板中表格组件的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "pager-op", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "设置弹出编辑框中分页配置" + }, + "labelPosition": "left" + }, + { + "property": "multi", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置弹出面板中的数据是否可多选" + }, + "labelPosition": "left" + }, + { + "property": "show-pager", + "label": { + "text": { + "zh_CN": "启用分页" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "当 popseletor 为 grid 时才能生效,配置为 true 后还需配置 pagerOp 属性" + } + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "选中值改变时触发" + }, + "description": { + "zh_CN": "在 Input 值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前选中项的值" + } + }, + { + "name": "value", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中对象" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "当前选中的值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的当前选中值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onClose": { + "label": { + "zh_CN": "弹框关闭时触发的事件" + }, + "description": { + "zh_CN": "弹框关闭时触发的事件" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + }, + "onPageChange": { + "label": { + "zh_CN": "分页切换事件" + }, + "description": { + "zh_CN": "表格模式下分页切换事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "String", + "defaultValue": "", + "description": { + "zh_CN": "当前页码数" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["modelValue", "disabled"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tree", + "name": { + "zh_CN": "树" + }, + "component": "TinyTree", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tree", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 12, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "show-checkbox", + "label": { + "text": { + "zh_CN": "多选" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "设置接口是否可以多选" + }, + "labelPosition": "left" + }, + { + "property": "data", + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": [ + { + "label": "一级 1", + "children": [ + { + "label": "二级 1-1" + } + ] + } + ], + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "可配置静态数据源和动态数据源" + } + }, + { + "property": "node-key", + "label": { + "text": { + "zh_CN": "唯一标识" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "节点唯一标识属性名称" + }, + "labelPosition": "left" + }, + { + "property": "icon-trigger-click-node", + "label": { + "text": { + "zh_CN": "触发NodeClick 事件" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "点击图标展开节点时是否触发 node-click 事件" + }, + "labelPosition": "left" + }, + { + "property": "expand-icon", + "label": { + "text": { + "zh_CN": "展开图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点展开图标" + }, + "labelPosition": "left" + }, + { + "property": "shrink-icon", + "label": { + "text": { + "zh_CN": "收缩图标" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点收缩的图标" + }, + "labelPosition": "left" + } + ] + }, + { + "name": "1", + "label": { + "zh_CN": "其他" + }, + "content": [ + { + "property": "check-on-click-node", + "label": { + "text": { + "zh_CN": "点击节点选中" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点" + }, + "labelPosition": "left" + }, + { + "property": "filter-node-method", + "label": { + "text": { + "zh_CN": "筛选函数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "节点筛选函数" + }, + "labelPosition": "left" + } + ], + "description": { + "zh_CN": "" + } + } + ], + "events": { + "onCheck": { + "label": { + "zh_CN": "勾选节点后的事件" + }, + "description": { + "zh_CN": "勾选节点后的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中节点信息" + } + }, + { + "name": "currentNode", + "type": "object", + "defaultValue": "", + "description": { + "zh_CN": "树组件目前的选中状态信息,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性" + } + } + ], + "returns": {} + }, + "defaultValue": "" + }, + "onNodeClick": { + "label": { + "zh_CN": "点击节点后的事件" + }, + "description": { + "zh_CN": "点击节点后的事件" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "data", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "当前选中节点信息" + } + }, + { + "name": "node", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "树组件目前的选中状态信息,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性" + } + }, + { + "name": "vm", + "type": "Object", + "defaultValue": "", + "description": { + "zh_CN": "树组件实例" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["data", "show-checkbox"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "timeline", + "name": { + "zh_CN": "时间线" + }, + "component": "TinyTimeLine", + "description": "TimeLine 时间线", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "TimeLine", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 3, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "horizontal", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "水平布局" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "节点和文字横向布局" + } + }, + { + "property": "vertical", + "type": "Boolean", + "defaultValue": { + "type": "i18n", + "zh_CN": "垂直布局", + "en_US": "layout", + "key": "" + }, + "label": { + "text": { + "zh_CN": "垂直布局" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "节点和文字垂直布局" + } + }, + { + "property": "active", + "label": { + "text": { + "zh_CN": "选中值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "步骤条的选中步骤值" + }, + "labelPosition": "left" + }, + { + "property": "data", + "label": { + "text": { + "zh_CN": "数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": [ + { + "name": "配置基本信息", + "status": "ready" + }, + { + "name": "配置报价", + "status": "wait" + }, + { + "name": "完成报价", + "status": "wait" + } + ], + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json" + } + }, + "description": { + "zh_CN": "时间线步骤条数据" + }, + "labelPosition": "left" + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "节点的点击时触发" + }, + "description": { + "zh_CN": "节点的点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "type", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "点击节点的下标" + } + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "description": { + "zh_CN": "当前节点对象:{ name: 节点名称, time: 时间 }" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": false, + "isModal": false, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["active", "data"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "tooltip", + "name": { + "zh_CN": "文字提示框" + }, + "component": "TinyTooltip", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Tooltip", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 11, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 20, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "placement", + "label": { + "text": { + "zh_CN": "提示位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + }, + { + "label": "left", + "value": "left" + }, + { + "label": "left-start", + "value": "left-start" + }, + { + "label": "left-end", + "value": "left-end" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "right-start", + "value": "right-start" + }, + { + "label": "right-end", + "value": "right-end" + } + ] + } + }, + "description": { + "zh_CN": "Tooltip 的出现位置" + }, + "labelPosition": "left" + }, + { + "property": "content", + "label": { + "text": { + "zh_CN": "内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "defaultValue": "提示信息", + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot#content 传入 DOM" + } + }, + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "是否可见" + } + }, + "defaultValue": true, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "状态是否可见" + } + }, + { + "property": "manual", + "label": { + "text": { + "zh_CN": "手动控制" + } + }, + "defaultValue": true, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "手动控制模式,设置为 true 后,mouseenter 和 mouseleave 事件将不会生效" + } + } + ] + } + ], + "events": {}, + "slots": { + "content": { + "label": { + "zh_CN": "提示内容" + }, + "description": { + "zh_CN": "自定义提示内容" + } + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "isPopper": true, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["disabled", "content"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + }, + { + "icon": "popover", + "name": { + "zh_CN": "提示框" + }, + "component": "TinyPopover", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Popover", + "version": "", + "destructuring": true + }, + "group": "component", + "priority": 7, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "modelValue", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "双向绑定,手动控制是否可见的状态值" + }, + "labelPosition": "left" + }, + { + "property": "placement", + "label": { + "text": { + "zh_CN": "位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "top", + "value": "top" + }, + { + "label": "top-start", + "value": "top-start" + }, + { + "label": "top-end", + "value": "top-end" + }, + { + "label": "bottom", + "value": "bottom" + }, + { + "label": "bottom-start", + "value": "bottom-start" + }, + { + "label": "bottom-end", + "value": "bottom-end" + }, + { + "label": "left", + "value": "left" + }, + { + "label": "left-start", + "value": "left-start" + }, + { + "label": "left-end", + "value": "left-end" + }, + { + "label": "right", + "value": "right" + }, + { + "label": "right-start", + "value": "right-start" + }, + { + "label": "right-end", + "value": "right-end" + } + ] + } + }, + "description": { + "zh_CN": "" + }, + "labelPosition": "left" + }, + { + "property": "trigger", + "label": { + "text": { + "zh_CN": "触发方式" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "click", + "value": "click" + }, + { + "label": "focus", + "value": "focus" + }, + { + "label": "hover", + "value": "hover" + }, + { + "label": "manual", + "value": "manual" + } + ] + } + }, + "description": { + "zh_CN": "触发方式,该属性的可选值为 click / focus / hover / manual,该属性的默认值为 click" + } + }, + { + "property": "popper-class", + "label": { + "text": { + "zh_CN": "自定义类" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "为 popper 添加类名" + }, + "labelPosition": "left" + }, + { + "property": "visible-arrow", + "label": { + "text": { + "zh_CN": "显示箭头" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示 Tooltip 箭头" + } + }, + { + "property": "append-to-body", + "label": { + "text": { + "zh_CN": "添加到body上" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "Popover弹窗是否添加到body上" + } + }, + { + "property": "arrow-offset", + "label": { + "text": { + "zh_CN": "箭头的位置偏移" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "箭头的位置偏移,该属性的默认值为 0" + } + }, + { + "property": "close-delay", + "label": { + "text": { + "zh_CN": "隐藏延迟" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "触发方式为 hover 时的隐藏延迟,单位为毫秒" + } + }, + { + "property": "content", + "label": { + "text": { + "zh_CN": "显示的内容" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot 传入 DOM" + } + }, + { + "property": "disabled", + "label": { + "text": { + "zh_CN": "禁用" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "Popover 是否可用" + } + }, + { + "property": "offset", + "label": { + "text": { + "zh_CN": "位置偏移量" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "出现位置的偏移量" + } + }, + { + "property": "open-delay", + "label": { + "text": { + "zh_CN": "显示延迟" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "触发方式为 hover 时的显示延迟,单位为毫秒" + } + }, + { + "property": "popper-options", + "label": { + "text": { + "zh_CN": "popper.js的参数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "popper.js 的参数" + } + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "标题" + } + }, + { + "property": "transform-origin", + "label": { + "text": { + "zh_CN": "旋转中心点" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "组件的旋转中心点,组件的旋转中心点" + } + }, + { + "property": "transition", + "label": { + "text": { + "zh_CN": "定义渐变动画" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "该属性的默认值为 fade-in-linear" + } + }, + { + "property": "width", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": {} + }, + "description": { + "zh_CN": "宽度" + } + } + ] + } + ], + "events": { + "onUpdate:modelValue": { + "label": { + "zh_CN": "双向绑定的值改变时触发" + }, + "description": { + "zh_CN": "手动控制是否可见的状态值改变时触发" + }, + "type": "event", + "functionInfo": { + "params": [ + { + "name": "value", + "type": "boolean", + "defaultValue": "", + "description": { + "zh_CN": "双向绑定的可见状态值" + } + } + ], + "returns": {} + }, + "defaultValue": "" + } + } + }, + "configure": { + "loop": true, + "condition": true, + "styles": true, + "isContainer": true, + "isModal": false, + "isPopper": true, + "nestingRule": { + "childWhitelist": "", + "parentWhitelist": "", + "descendantBlacklist": "", + "ancestorWhitelist": "" + }, + "isNullNode": false, + "isLayout": false, + "rootSelector": "", + "shortcuts": { + "properties": ["visible", "width"] + }, + "contextMenu": { + "actions": ["create symbol"], + "disable": ["copy", "remove"] + } + } + } + ] + }, + "app": { + "id": 918, + "name": "portal-app", + "app_website": null, + "platform": { + "id": 897, + "name": "portal-platform" + }, + "obs_url": "", + "created_by": null, + "updated_by": null, + "created_at": "2022-06-08T07:19:01.000Z", + "updated_at": "2023-09-04T08:55:40.000Z", + "state": null, + "published": false, + "createdBy": 86, + "updatedBy": 564, + "tenant": 1, + "home_page": "NTJ4MjvqoVj8OVsc", + "css": null, + "config": {}, + "git_group": "", + "project_name": "", + "constants": null, + "data_handler": { + "type": "JSFunction", + "value": "function dataHanlder(res){\n return res;\n}" + }, + "description": "demo应用", + "latest": 22, + "platform_history": null, + "editor_url": "", + "branch": "develop", + "visit_url": null, + "is_demo": null, + "image_url": "", + "is_default": true, + "template_type": null, + "set_template_time": null, + "set_template_by": null, + "set_default_by": 169, + "framework": "Vue", + "global_state": [], + "default_lang": null, + "extend_config": { + "business": { + "serviceName": "", + "endpointName": "cce", + "endpointId": "ee", + "serviceId": "ee", + "router": "ee" + }, + "env": { + "alpha": { + "regions": [ + { + "name": "", + "baseUrl": "", + "isDefault": false + } + ], + "isDefault": true + } + }, + "type": "console" + }, + "assets_url": "", + "data_hash": "ae128e37f6bc378f1b9c21d75bd05551", + "can_associate": true, + "data_source_global": { + "dataHandler": { + "type": "JSFunction", + "value": "function dataHanlder(res){\n return res;\n}" + } + } + } +} diff --git a/dl-flow-frontend/mockServer/src/services/block.js b/dl-flow-frontend/mockServer/src/services/block.js new file mode 100644 index 0000000..c8071fe --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/block.js @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ +import path from 'path' +import DateStore from '@seald-io/nedb' +import { getResponseData } from '../tool/Common' +export default class BlockService { + constructor() { + this.db = new DateStore({ + filename: path.resolve(__dirname, '../database/blocks.db'), + autoload: true + }) + + this.db.ensureIndex({ + fieldName: 'label', + unique: true + }) + + this.userInfo = { + id: 86, + username: '开发者', + email: 'developer@lowcode.com', + resetPasswordToken: 'developer', + confirmationToken: 'dfb2c162-351f-4f44-ad5f-8998', + is_admin: true + } + + this.blockModel = { + id: '', + label: '', + name_cn: '', + framework: [], + content: {}, + description: '', + path: '', + screenshot: '', + created_app: '', + tags: '', + categories: [], + occupier: { + id: 86, + username: '开发者', + resetPasswordToken: 'developer' + }, + isDefault: null, + isOfficial: null + } + } + + async create(params) { + const blockData = { ...this.blockModel, ...params } + const result = await this.db.insertAsync(blockData) + const { _id } = result + await this.db.updateAsync({ _id }, { $set: { id: _id } }) + result.id = result._id + return result + } + + async update(id, params) { + await this.db.updateAsync({ _id: id }, { $set: params }) + const result = await this.db.findOneAsync({ _id: id }) + return getResponseData(result) + } + + async detail(blockId) { + const result = await this.db.findOneAsync({ _id: blockId }) + return result + } + + async delete(blockId) { + const result = await this.db.findOneAsync({ _id: blockId }) + await this.db.removeAsync({ _id: blockId }) + return getResponseData(result) + } + + async list(appId) { + const result = await this.db.findAsync() + return getResponseData(result) + } + + async find(params) { + const result = await this.db.findAsync(params) + return result + } +} diff --git a/dl-flow-frontend/mockServer/src/services/blockCategory.js b/dl-flow-frontend/mockServer/src/services/blockCategory.js new file mode 100644 index 0000000..401b963 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/blockCategory.js @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ +import path from 'path' +import DateStore from '@seald-io/nedb' +import { getResponseData } from '../tool/Common' +import appinfo from './appinfo.json' +export default class BlockCategoryService { + constructor() { + this.db = new DateStore({ + filename: path.resolve(__dirname, '../database/blockCategories.db'), + autoload: true + }) + + this.db.ensureIndex({ + fieldName: 'name', + unique: true + }) + + this.blockCategoriesModel = { + id: '', + app: '', + name: '', + desc: '', + blocks: [] + } + } + + async create(params) { + const blockCategoriesData = { ...this.blockCategoriesModel, ...params } + blockCategoriesData.app = appinfo.app + const result = await this.db.insertAsync(blockCategoriesData) + const { _id } = result + await this.db.updateAsync({ _id }, { $set: { id: _id } }) + result.id = result._id + return getResponseData(result) + } + + async update(id, params) { + if (params?._id) { + const categories = await this.db.findOneAsync({ _id: id }) + categories.blocks.push(params._id) + await this.db.updateAsync({ _id: id }, { $set: categories }) + return getResponseData(categories) + } + params.app = appinfo.app + await this.db.updateAsync({ _id: id }, { $set: params }) + + const result = await this.db.findOneAsync({ _id: id }) + return getResponseData(result) + } + + async find(params) { + const result = await this.db.findAsync() + return getResponseData(result) + } + + async delete(id) { + const result = await this.db.findOneAsync({ _id: id }) + await this.db.removeAsync({ _id: id }) + return getResponseData(result) + } + + async list(appId) { + const result = await this.db.findAsync() + return getResponseData(result) + } +} diff --git a/dl-flow-frontend/mockServer/src/services/blockGroup.js b/dl-flow-frontend/mockServer/src/services/blockGroup.js new file mode 100644 index 0000000..01cd868 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/blockGroup.js @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ +import path from 'path' +import DateStore from '@seald-io/nedb' +import { getResponseData } from '../tool/Common' +import appinfo from './appinfo.json' +export default class BlockGroupService { + constructor() { + this.db = new DateStore({ + filename: path.resolve(__dirname, '../database/blockGroups.db'), + autoload: true + }) + + this.db.ensureIndex({ + fieldName: 'name', + unique: true + }) + + this.blockGroupModel = { + id: '', + app: '', + name: '', + desc: '', + blocks: [] + } + } + + async create(params) { + const blockGroupData = { ...this.blockGroupModel, ...params } + blockGroupData.app = appinfo.app + const result = await this.db.insertAsync(blockGroupData) + const { _id } = result + await this.db.updateAsync({ _id }, { $set: { id: _id } }) + result.id = result._id + return getResponseData(result) + } + + async update(id, params) { + params.app = appinfo.app + await this.db.updateAsync({ _id: id }, { $set: params }) + + const result = await this.db.findOneAsync({ _id: id }) + return getResponseData(result) + } + + async find(params) { + if (params?.app || !params?.id) { + const result = await this.db.findAsync() + return getResponseData(result) + } + const { id } = params + const blockGroup = await this.db.findOneAsync({ _id: id }) + return getResponseData([blockGroup]) + } + + async delete(blockGroupId) { + const result = await this.db.findOneAsync({ _id: blockGroupId }) + await this.db.removeAsync({ _id: blockGroupId }) + return getResponseData(result) + } + + async list(appId) { + const result = await this.db.findAsync() + return getResponseData(result) + } +} diff --git a/dl-flow-frontend/mockServer/src/services/blocks.json b/dl-flow-frontend/mockServer/src/services/blocks.json new file mode 100644 index 0000000..df91f08 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/blocks.json @@ -0,0 +1,436 @@ +{ + "PortalHome": { + "id": 989, + "label": "PortalHome", + "framework": "Vue", + "content": { + "state": { + "logoUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAF8CAYAAADM5wDKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OEVGOTU4RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI5OEVGOTU5RTg2NDExRUM5MDhERjU4NjRDOUUxQTUwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Mjk4RUY5NTZFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Mjk4RUY5NTdFODY0MTFFQzkwOERGNTg2NEM5RTFBNTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4dZkpJAAAvNElEQVR42uyd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", + "loginImgUrl": "data:image/png;base64,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" + }, + "componentName": "Block", + "css": ".home-content {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n text-align: center;\r\n height: calc(100vh - 262px);\r\n \r\n}\r\n.home-content .btn {\r\n margin-top: 24px;\r\n \r\n }\r\n .home-content .btn button {\r\n border: none;\r\n border-radius: 30px;\r\n background: #5e7ce0;\r\n \r\n font-size: 14px;\r\n color: #fff;\r\n \r\n cursor: pointer;\r\n }\r\n\r\n .home-content .text {\r\n font-size: 18px;\r\n }\r\n\r\n .home-content .account {\r\n margin-top: 16px;\r\n \r\n \r\n }\r\n\r\n .home-content .account .sub-text {\r\n color: #575d6c;\r\n }\r\n .home-content .account .login {\r\n color: #1890ff;\r\n cursor: pointer;\r\n }\r\n .home-content .logo img{\r\n border-radius: 50%;\r\n overflow: hidden;\r\n }", + "props": {}, + "children": [ + { + "componentName": "div", + "props": { + "className": "home", + "style": "height: 100vh; display: flex;" + }, + "id": "357534ab", + "children": [ + { + "componentName": "TinyRow", + "props": { + "align": "middle", + "flex": true, + "style": "" + }, + "children": [ + { + "componentName": "TinyCol", + "props": { + "span": 6, + "style": "text-align: center; display: flex; justify-content: center;" + }, + "id": "f01b66ea", + "children": [ + { + "componentName": "div", + "props": { + "style": "width: 90%; height: 50%;" + }, + "id": "8197d016", + "children": [ + { + "componentName": "Img", + "props": { + "style": "width: 100%; height: 100%;", + "src": { + "type": "JSExpression", + "value": "this.state.loginImgUrl" + } + }, + "id": "471e30f3" + } + ] + } + ] + }, + { + "componentName": "TinyCol", + "props": { + "span": "6", + "style": "text-align: center;" + }, + "id": "781d5b46", + "children": [ + { + "componentName": "div", + "props": { + "className": "home-content", + "style": "font-size: 14px;" + }, + "id": "08638b8a", + "children": [ + { + "componentName": "div", + "props": { + "className": "text" + }, + "id": "18712ee2", + "children": [ + { + "componentName": "div", + "props": { + "style": "font-size: 16px;" + }, + "id": "07e6794c", + "children": [ + { + "componentName": "div", + "props": { + "className": "logo" + }, + "id": "07cad264", + "children": [ + { + "componentName": "Img", + "props": { + "style": "width: 105px; height: 105px; border-radius: 100px;", + "src": { + "type": "JSExpression", + "value": "this.state.logoUrl" + } + }, + "id": "f4489e27" + } + ] + }, + { + "componentName": "Text", + "props": { + "text": "TinyLowCode 低代码平台", + "style": "display: block; font-size: 28px; margin-top: 12px; margin-bottom: 12px; font-weight: bold;", + "ref": "", + "className": "title" + }, + "id": "e82108ce" + }, + { + "componentName": "Text", + "props": { + "text": "致力于通过友好的用户交互提升业务的开发效率", + "style": "display: block; margin-bottom: 12px;" + }, + "id": "65a2f1ad" + }, + { + "componentName": "Text", + "props": { + "text": "欢迎一起来解锁~~", + "style": "margin-top: 12px;" + }, + "id": "bb879abb" + } + ] + }, + { + "componentName": "div", + "props": { + "className": "btn" + }, + "id": "44b2bcbd", + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "立即体验", + "round": true, + "type": "primary", + "style": "margin-top: 40px;" + }, + "id": "9580c5e7" + }, + { + "componentName": "div", + "props": { + "className": "account" + }, + "id": "6a8ffa3e", + "children": [ + { + "componentName": "div", + "props": { + "style": "font-size: 14px; margin-top: 4px;" + }, + "id": "bfc6eb6c", + "children": [ + { + "componentName": "Text", + "props": { + "text": "已有团队?", + "style": "color: #777777;" + }, + "id": "3d993264" + }, + { + "componentName": "Text", + "props": { + "text": "立即进入", + "style": "color: #5e7ce0;", + "onClick": { + "type": "JSExpression", + "value": "this.handleClick(event)" + } + }, + "id": "21390118" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ], + "id": "4545fea2" + } + ] + } + ], + "methods": { + "handleClick": { + "type": "JSFunction", + "value": "function (event) {this.emit('goto-home', event)\n}" + } + }, + "fileName": "PortalHome", + "meta": { + "id": 1722, + "parentId": "0", + "group": "staticPages", + "title": null, + "occupier": null, + "isHome": false, + "description": "", + "router": "/", + "rootElement": "div", + "creator": "开发者", + "gmt_create": "2022-06-08 03:25:51", + "gmt_modified": "2022-06-09 05:19:09" + }, + "id": 1722, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [] + } + ], + "events": { + "onGotoHome": { + "label": { + "zh_CN": "点击立即进入触发方法" + }, + "description": { + "zh_CN": "点击立即进入触发方法" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "", + "linked": { + "id": "21390118", + "componentName": "Text", + "event": "onClick" + } + } + }, + "slots": {} + }, + "dataSource": {}, + "i18n": {} + }, + "created_at": "2022-06-13T07:56:51.000Z", + "updated_at": "2023-01-13T08:12:51.000Z", + "assets": { + "material": [], + "scripts": [ + "http://localhost:9090/assets/js/989web-components.es.js", + "http://localhost:9090/assets/js/989web-components.umd.js" + ], + "styles": [] + }, + "createdBy": 86, + "description": null, + "tags": "", + "current_history": 1655, + "screenshot": "", + "path": "common/components/home", + "occupier": null, + "isOfficial": true, + "public": 1, + "isDefault": null, + "tiny_reserved": false, + "author": null, + "name_cn": null, + "created_app": null, + "content_blocks": null, + "current_version": "x" + }, + "portalBlock": { + "id": 1005, + "label": "PortalBlock", + "framework": "Vue", + "content": { + "state": {}, + "methods": {}, + "componentName": "Block", + "fileName": "PortalBlock", + "css": "", + "props": {}, + "children": [ + { + "componentName": "div", + "props": { + "style": "font-size: 18px; height: 40px; border-bottom: 1px solid rgb(223, 225, 230); margin-top: 20px;" + }, + "id": "d38cea57", + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconChevronLeft" + }, + "id": "86c6e6b0" + }, + { + "componentName": "Text", + "props": { + "text": "编辑物料资产包 | ", + "style": "margin-left: 10px; font-weight: bold;" + }, + "id": "38d9fbc8" + }, + { + "componentName": "Text", + "props": { + "text": { + "type": "JSExpression", + "value": "this.props.blockName" + }, + "style": "margin-left: 10px; font-weight: bold;" + }, + "id": "6cd76396" + } + ] + } + ], + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "blockName", + "type": "String", + "defaultValue": "MT0526-React 1.0", + "label": { + "text": { + "zh_CN": "区块名称" + } + }, + "cols": 12, + "rules": [], + "handle": { + "getter": "", + "setter": "" + }, + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": { + "modelValue": "MT0526-React 1.0" + } + } + } + ] + } + ], + "events": {}, + "slots": {} + }, + "dataSource": {} + }, + "created_at": "2022-06-28T08:59:54.000Z", + "updated_at": "2023-01-13T08:20:09.000Z", + "assets": { + "material": [], + "scripts": [ + "http://localhost:9090/assets/js/1005web-components.es.js", + "http://localhost:9090/assets/js/1005web-components.umd.js" + ], + "styles": [] + }, + "createdBy": { + "id": 86, + "username": "开发者", + "resetPasswordToken": "developer" + }, + "description": null, + "tags": null, + "current_history": 1665, + "screenshot": "", + "path": "portal", + "occupier": { + "id": 86, + "username": "开发者", + "resetPasswordToken": "developer" + }, + "isOfficial": null, + "public": 1, + "isDefault": null, + "tiny_reserved": false, + "author": null, + "name_cn": null, + "created_app": null, + "content_blocks": null, + "categories": [], + "public_scope_tenants": [], + "histories_length": 1 + } +} \ No newline at end of file diff --git a/dl-flow-frontend/mockServer/src/services/mockService.js b/dl-flow-frontend/mockServer/src/services/mockService.js new file mode 100644 index 0000000..5f05fd3 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/mockService.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ +import PageService from './pages' +import AppService from './app' +import BlockService from './block' +import SourceService from './source' +import BlockGroupService from './blockGroup' +import BlockCategoryService from './blockCategory' +import Schema2CodeServcice from './schema2code' +export default class MockService { + schema2codeService + pageService + appService + blockService + sourceService + blockGroupService + blockCategoryService + + constructor() { + this.schema2codeService = new Schema2CodeServcice() + this.pageService = new PageService() + this.appService = new AppService() + this.blockService = new BlockService() + this.sourceService = new SourceService() + this.blockGroupService = new BlockGroupService() + this.blockCategoryService = new BlockCategoryService() + } +} diff --git a/dl-flow-frontend/mockServer/src/services/pageSchema.js b/dl-flow-frontend/mockServer/src/services/pageSchema.js new file mode 100644 index 0000000..2b78b9b --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/pageSchema.js @@ -0,0 +1,178 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { E_SchemaFormatFunc } from './utils' +import { getResponseData } from '../tool/Common' + +const config = { + pageMeta: { + convert: { + page_desc: 'description', + route: 'router', + isBody: 'rootElement', + createdBy: 'creator', + created_at: 'gmt_create', + updated_at: 'gmt_modified' + }, + include: [ + 'id', + 'title', + 'page_desc', + 'createdBy', + 'parentId', + 'created_at', + 'updated_at', + 'isHome', + 'isBody', + 'group', + 'route', + 'occupier' + ], + format: { + created_at: E_SchemaFormatFunc.ToLocalTimestamp, + updated_at: E_SchemaFormatFunc.ToLocalTimestamp, + isBody: E_SchemaFormatFunc.ToRootElement, + group: E_SchemaFormatFunc.ToGroupName, + createdBy: E_SchemaFormatFunc.ToCreatorName + } + }, + pageContent: { + include: ['fileName', 'componentName', 'props', 'css', 'children', 'methods', 'state', 'lifeCycles'] + }, + folder: { + convert: { + name: 'folderName', + route: 'router', + created_at: 'gmt_create', + updated_at: 'gmt_modified' + }, + include: ['name', 'route', 'created_at', 'updated_at', 'id', 'parentId', 'depth'], + format: { + created_at: E_SchemaFormatFunc.ToLocalTimestamp, + updated_at: E_SchemaFormatFunc.ToLocalTimestamp + } + } +} + +export default class PageSchemaService { + constructor() { + this.config = config + } + + + assembleFields(originalData, type) { + let dataCopy = JSON.parse(JSON.stringify(originalData.data)) + const conf = this.config[type] + if (conf.include || conf.exclude) { + dataCopy = this.filterFields(dataCopy, conf) + } + if (conf.format) { + dataCopy = this.formatFields(dataCopy, conf) + } + if (conf.convert) { + dataCopy = this.convertFields(dataCopy, conf) + } + return getResponseData(dataCopy) + } + + // 转换数据表字段为schema中的字段命名 + convertFields(data, conf) { + const convertConf = conf.convert || {} + Object.keys(convertConf).forEach((key) => { + data[convertConf[key]] = data[key] + delete data[key] + }) + return data + } + + // 筛选数据 + filterFields(data, conf) { + const excludeConf = conf.exclude || [] + const includeConf = conf.include || [] + let res = {} + // include 优先级高于 exclude + if (includeConf.length) { + for (const key in data) { + if (includeConf.includes(key)) { + res[key] = data[key] + } + } + } else if (excludeConf.length) { + for (const key in data) { + if (!excludeConf.includes(key)) { + res[key] = data[key] + } + } + } else { + res = data + } + + return res + } + + // 格式化数据 + formatFields(data, conf) { + const { format = {} } = conf + Object.keys(format).forEach((key) => { + const funcName = format[key] + const func = this[funcName] + if (func) { + data[key] = func(data[key]) + } + }) + return data + } + + // 获取页面元数据 + getSchemaMeta(pageData) { + return this.assembleFields(pageData, 'pageMeta') + } + + // 提取page_schema + getSchemaBase(pageData) { + const pageMate = JSON.parse(JSON.stringify(pageData.data)) + const pageContent = pageMate.page_content || {} + pageContent.fileName = pageMate.name + return this.assembleFields( + { + data: pageContent + }, + 'pageContent' + ) + } + + // 获取folder schema数据 todo + getFolderSchema(param) { + const schema = this.assembleFields( + { + data: param + }, + 'folder' + ) + schema.data.componentName = 'Folder' + return schema + } + + // 获取页面的schema + getSchema(pageInfo) { + const pageInfoData = { + data: pageInfo + } + if (!pageInfo.isPage) { + return this.getFolderSchema(pageInfo) + } + const schema = this.getSchemaBase(pageInfoData).data + // 从page_schema中获取基本字段 + schema.meta = this.getSchemaMeta(pageInfoData).data + return getResponseData(schema) + } +} diff --git a/dl-flow-frontend/mockServer/src/services/pages.js b/dl-flow-frontend/mockServer/src/services/pages.js new file mode 100644 index 0000000..07b743e --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/pages.js @@ -0,0 +1,102 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import path from 'path' +import DateStore from '@seald-io/nedb' +import { getResponseData } from '../tool/Common' + +export default class PageService { + constructor() { + this.db = new DateStore({ + filename: path.resolve(__dirname, '../database/pages.db'), + autoload: true + }) + + this.db.ensureIndex({ + fieldName: 'route', + unique: true + }) + + this.userInfo = { + id: 86, + username: '开发者', + email: 'developer@lowcode.com', + resetPasswordToken: 'developer', + confirmationToken: 'dfb2c162-351f-4f44-ad5f-8998', + is_admin: true + } + + this.pageModel = { + name: '', + id: '', + app: '918', + route: '', + page_content: {}, + tenant: 1, + isBody: true, + parentId: '', + depth: 0, + isPage: true, + isDefault: false, + group: 'staticPages', + occupier: { + id: 86, + username: '开发者', + email: 'developer@lowcode.com', + resetPasswordToken: 'developer', + confirmationToken: 'dfb2c162-351f-4f44-ad5f-8998', + is_admin: true + } + } + + this.folderModel = { + parentId: '0', + route: 'test', + name: 'test', + app: '918', + isPage: false, + group: 'staticPages' + } + } + + async create(params) { + const model = params.isPage ? this.pageModel : this.folderModel + const pageData = { ...model, ...params } + const result = await this.db.insertAsync(pageData) + const { _id } = result + await this.db.updateAsync({ _id }, { $set: { id: _id } }) + result.id = result._id + return getResponseData(result) + } + + async update(id, params) { + await this.db.updateAsync({ _id: id }, { $set: params }) + const result = await this.db.findOneAsync({ _id: id }) + return getResponseData(result) + } + + async list(appId) { + const result = await this.db.findAsync({ app: appId.toString() }) + return getResponseData(result) + } + + async detail(pageId) { + const result = await this.db.findOneAsync({ _id: pageId }) + return getResponseData(result) + } + + async delete(pageId) { + const result = await this.db.findOneAsync({ _id: pageId }) + await this.db.removeAsync({ _id: pageId }) + return getResponseData(result) + } +} diff --git a/dl-flow-frontend/mockServer/src/services/schema2code.js b/dl-flow-frontend/mockServer/src/services/schema2code.js new file mode 100644 index 0000000..9b27000 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/schema2code.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { pageService } from '../routes/main-routes' +import appInfo from './appinfo.json' + +export default class Schema2CodeServcice { + constructor() { + this.blockHistories = appInfo.blockHistories + this.components = appInfo.materialHistory.components + } + + schema2code(pageInfo, type = 'page') { + const { schema, name } = pageInfo + return this.translateSchema({ + schema, + name, + type + }) + } + + /** + * 通过dsl 将页面/区块schema数据生成对应代码 + * @param { I_TranslateSchemaParam } params + * @return {Promise} dsl函数返回数据 + */ + translateSchema(params) { + const { schema, name, type, blockHistories = this.blockHistories, components = this.components } = params + // 页面/区块 预览只需将页面、区块路径和区块构建产物路径统一设置为 ./components 即可 + const defaultMain = './components' + let componentsMap = this.getComponentSchema(components) + componentsMap = componentsMap.concat(this.getBlockSchema(blockHistories)) + componentsMap.forEach((component) => { + if (component.main !== undefined) { + component.main = defaultMain + } + }) + + componentsMap.push({ + componentName: name, + main: defaultMain + }) + + const { generateCode } = require('@opentiny/tiny-engine-dsl-vue') + let code + try { + code = generateCode({ + pageInfo: { schema, name }, + blocksData: [], + componentsMap + }) + } catch (e) { + this.getResponseData(null, e) + } + + return this.getResponseData(code) + } + + getResponseData(data, error) { + const res = { + data + } + + if (error) { + const err_code = error.code || '' + res.error = { + code: err_code, + message: error.message || '' + } + } + return res + } + + getComponentSchema(components) { + return components.map((component) => { + const { + component: componentName, + npm: { package: packageName, exportName, version, destructuring } = {} + } = component + return { + componentName, + package: packageName, + exportName, + destructuring, + version + } + }) + } + + // 将区块组装成schema数据 + getBlockSchema(blockHistories) { + return blockHistories.map((blockHistory) => { + const { path, version } = blockHistory + // 每个区块历史记录必有content + const { fileName: componentName } = blockHistory.content + return { + componentName, + main: path || '', + destructuring: false, + version: version || 'N/A' + } + }) + } +} diff --git a/dl-flow-frontend/mockServer/src/services/source.js b/dl-flow-frontend/mockServer/src/services/source.js new file mode 100644 index 0000000..be25719 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/source.js @@ -0,0 +1,21 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { getResponseData } from '../tool/Common' +import sources from './sources.json' +export default class soueceService { + detail(id) { + const sourceData = sources[id] || {} + return getResponseData(sourceData) + } + +} diff --git a/dl-flow-frontend/mockServer/src/services/sources.json b/dl-flow-frontend/mockServer/src/services/sources.json new file mode 100644 index 0000000..2c0c8b8 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/sources.json @@ -0,0 +1,669 @@ +{ + "132": { + "id": 132, + "name": "getAllComponent", + "data": { + "data": [], + "type": "array" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T06:26:26.000Z", + "updated_at": "2022-06-28T07:02:30.000Z" + }, + "133": { + "id": 133, + "name": "getAllList", + "data": { + "columns": [ + { + "name": "test", + "title": "测试", + "field": "test", + "type": "string", + "format": {} + }, + { + "name": "test1", + "title": "测试1", + "field": "test1", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "test": "test1", + "test1": "test1", + "_id": "341efc48" + }, + { + "test": "test2", + "test1": "test1", + "_id": "b86b516c" + }, + { + "test": "test3", + "test1": "test1", + "_id": "f680cd78" + } + ], + "options": { + "uri": "https://mock.demo.com/mock/198/material-center/api/component/list", + "method": "GET" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-28T07:32:16.000Z", + "updated_at": "2023-01-19T03:29:11.000Z" + }, + "135": { + "id": 135, + "name": "getAllMaterialList", + "data": { + "columns": [ + { + "name": "id", + "title": "id", + "field": "id", + "type": "string", + "format": {} + }, + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": {} + }, + { + "name": "framework", + "title": "framework", + "field": "framework", + "type": "string", + "format": { + "required": true + } + }, + { + "name": "components", + "title": "components", + "field": "components", + "type": "string", + "format": {} + }, + { + "name": "content", + "title": "content", + "field": "content", + "type": "string", + "format": {} + }, + { + "name": "url", + "title": "url", + "field": "url", + "type": "string", + "format": {} + }, + { + "name": "published_at", + "title": "published_at", + "field": "published_at", + "type": "string", + "format": {} + }, + { + "name": "created_at", + "title": "created_at", + "field": "created_at", + "type": "string", + "format": {} + }, + { + "name": "updated_at", + "title": "updated_at", + "field": "updated_at", + "type": "string", + "format": {} + }, + { + "name": "published", + "title": "published", + "field": "published", + "type": "string", + "format": {} + }, + { + "name": "last_build_info", + "title": "last_build_info", + "field": "last_build_info", + "type": "string", + "format": {} + }, + { + "name": "tenant", + "title": "tenant", + "field": "tenant", + "type": "string", + "format": {} + }, + { + "name": "version", + "title": "version", + "field": "version", + "type": "string", + "format": {} + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": {} + } + ], + "type": "array", + "data": [ + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "2a23e653" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "06b253be" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "c55a41ed" + }, + { + "id": "f37123ec", + "url": "", + "name": "ng-material", + "tenant": "", + "content": "", + "version": "1.0.0", + "framework": "Angular", + "published": "", + "components": "", + "created_at": "2021-11-02T11:32:22.000Z", + "updated_at": "2021-11-02T11:32:22.000Z", + "description": "angular组件库物料", + "published_at": "2021-11-02T11:32:22.000Z", + "last_build_info": "", + "_id": "f37123ec" + }, + { + "id": "7a63c1a2", + "url": "", + "name": "tiny-vue", + "tenant": "", + "content": "Tiny Vue物料", + "version": "1.0.0", + "framework": "Vue", + "published": "", + "components": "", + "created_at": "", + "updated_at": "", + "description": "Tiny Vue物料", + "published_at": "", + "last_build_info": "", + "_id": "7a63c1a2" + } + ], + "options": { + "uri": "https://mock.demo.com/mock/198/material-center/api/material/list", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-29T00:57:50.000Z", + "updated_at": "2023-05-15T02:37:12.000Z" + }, + "139": { + "id": 139, + "name": "treedata", + "data": { + "data": [ + { + "label": "level111", + "value": "111", + "id": "f6609643", + "pid": "", + "_RID": "row_4" + }, + { + "label": "level1-son", + "value": "111-1", + "id": "af1f937f", + "pid": "f6609643", + "_RID": "row_5" + }, + { + "label": "level222", + "value": "222", + "id": "28e3709c", + "pid": "", + "_RID": "row_6" + }, + { + "label": "level2-son", + "value": "222-1", + "id": "6b571bef", + "pid": "28e3709c", + "_RID": "row_5" + }, + { + "id": "6317c2cc", + "pid": "fdfa", + "label": "fsdfaa", + "value": "fsadf", + "_RID": "row_6" + }, + { + "id": "9cce369f", + "pid": "test", + "label": "test1", + "value": "001" + } + ], + "type": "tree" + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-06-30T06:13:57.000Z", + "updated_at": "2022-07-29T03:14:55.000Z" + }, + "150": { + "id": 150, + "name": "componentList", + "data": { + "data": [ + { + "_RID": "row_1", + "name": "表单", + "isSelected": "true", + "description": "由按钮、输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据" + }, + { + "name": "按钮", + "isSelected": "false", + "description": "常用的操作按钮,提供包括默认按钮、图标按钮、图片按钮、下拉按钮等类型" + }, + { + "id": "490f8a00", + "_RID": "row_3", + "name": "表单项", + "framework": "", + "materials": "", + "description": "Form 组件下的 FormItem 配置" + }, + { + "id": "c259b8b3", + "_RID": "row_4", + "name": "开关", + "framework": "", + "materials": "", + "description": "关闭或打开" + }, + { + "id": "083ed9c7", + "_RID": "row_5", + "name": "互斥按钮组", + "framework": "", + "materials": "", + "description": "以按钮组的方式出现,常用于多项类似操作" + }, + { + "id": "09136cea", + "_RID": "row_6", + "name": "提示框", + "framework": "", + "materials": "", + "description": "Popover可通过对一个触发源操作触发弹出框,支持自定义弹出内容,延迟触发和渐变动画" + }, + { + "id": "a63b57d5", + "_RID": "row_7", + "name": "文字提示框", + "framework": "", + "materials": "", + "description": "动态显示提示信息,一般通过鼠标事件进行响应;提供 warning、error、info、success 四种类型显示不同类别的信" + }, + { + "id": "a0f6e8a3", + "_RID": "row_8", + "name": "树", + "framework": "", + "materials": "", + "description": "可进行展示有父子层级的数据,支持选择,异步加载等功能。但不推荐用它来展示菜单,展示菜单推荐使用树菜单" + }, + { + "id": "d1aa18fc", + "_RID": "row_9", + "name": "分页", + "framework": "", + "materials": "", + "description": "当数据量过多时,使用分页分解数据,常用于 Grid 和 Repeater 组件" + }, + { + "id": "ca49cc52", + "_RID": "row_10", + "name": "表格", + "framework": "", + "materials": "", + "description": "提供了非常强大数据表格功能,可以展示数据列表,可以对数据列表进行选择、编辑等" + }, + { + "id": "4e20ecc9", + "name": "搜索框", + "framework": "", + "materials": "", + "description": "指定条件对象进行搜索数据" + }, + { + "id": "6b093ee5", + "name": "折叠面板", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "0a09abc0", + "name": "对话框", + "framework": "", + "materials": "", + "description": "模态对话框,在浮层中显示,引导用户进行相关操作" + }, + { + "id": "f814b901", + "name": "标签页签项", + "framework": "", + "materials": "", + "description": "tab页签" + }, + { + "id": "c5ae797c", + "name": "单选", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,在一组备选项中进行单选" + }, + { + "id": "33d0c590", + "_RID": "row_13", + "name": "弹出编辑", + "framework": "", + "materials": "", + "description": "该组件只能在弹出的面板中选择数据,不能手动输入数据;弹出面板中显示为 Tree 组件或者 Grid 组件" + }, + { + "id": "16711dfa", + "_RID": "row_14", + "name": "下拉框", + "framework": "", + "materials": "", + "description": "Select 选择器是一种通过点击弹出下拉列表展示数据并进行选择的 UI 组件" + }, + { + "id": "a9fd190a", + "_RID": "row_15", + "name": "折叠面板项", + "framework": "", + "materials": "", + "description": "内容区可指定动态页面或自定义 html 等,支持展开收起操作" + }, + { + "id": "a7dfa9ec", + "_RID": "row_16", + "name": "复选框", + "framework": "", + "materials": "", + "description": "用于配置不同场景的选项,提供用户可在一组选项中进行多选" + }, + { + "id": "d4bb8330", + "name": "输入框", + "framework": "", + "materials": "", + "description": "通过鼠标或键盘输入字符" + }, + { + "id": "ced3dc83", + "name": "时间线", + "framework": "", + "materials": "", + "description": "时间线" + } + ], + "type": "array", + "columns": [ + { + "name": "name", + "type": "string", + "field": "name", + "title": "name", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "description", + "type": "string", + "field": "description", + "title": "description", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + }, + { + "name": "isSelected", + "type": "string", + "field": "isSelected", + "title": "isSelected", + "format": { + "max": 0, + "min": 0, + "dateTime": false, + "required": false, + "stringType": "" + } + } + ], + "options": { + "uri": "http://localhost:9090/assets/json/bundle.json", + "method": "GET" + }, + "willFetch": { + "type": "JSFunction", + "value": "function willFetch(option) {\n return option \n}" + }, + "dataHandler": { + "type": "JSFunction", + "value": "function dataHandler(data) { \n return data \n}" + }, + "shouldFetch": { + "type": "JSFunction", + "value": "function shouldFetch(option) {\n return true \n}" + }, + "errorHandler": { + "type": "JSFunction", + "value": "function errorHandler(err) {}" + } + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T02:20:07.000Z", + "updated_at": "2022-07-04T06:25:29.000Z" + }, + "151": { + "id": 151, + "name": "selectedComponents", + "data": { + "columns": [ + { + "name": "name", + "title": "name", + "field": "name", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "description", + "title": "description", + "field": "description", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + }, + { + "name": "isSelected", + "title": "isSelected", + "field": "isSelected", + "type": "string", + "format": { + "required": false, + "stringType": "", + "min": 0, + "max": 0, + "dateTime": false + } + } + ], + "type": "array", + "data": [ + { + "name": "标签页", + "description": "分隔内容上有关联但属于不同类别的数据集合", + "isSelected": "true", + "_RID": "row_2" + }, + { + "name": "布局列", + "description": "列配置信息", + "isSelected": "true", + "id": "76a7080a", + "_RID": "row_4" + }, + { + "name": "日期选择器", + "description": "用于设置/选择日期,包括年月/年月日/年月日时分/年月日时分秒日期格式", + "isSelected": "true", + "id": "76b20d73", + "_RID": "row_1" + }, + { + "name": "走马灯", + "description": "常用于一组图片或卡片轮播,当内容空间不足时,可以用走马灯的形式进行收纳,进行轮播展现", + "isSelected": "true", + "id": "4c884c3d" + } + ] + }, + "tpl": null, + "app": "918", + "desc": null, + "created_at": "2022-07-04T03:04:05.000Z", + "updated_at": "2022-07-04T03:43:40.000Z" + }, + "locale": "zh-cn" +} diff --git a/dl-flow-frontend/mockServer/src/services/utils.js b/dl-flow-frontend/mockServer/src/services/utils.js new file mode 100644 index 0000000..853dc42 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/services/utils.js @@ -0,0 +1,43 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import moment from 'moment' + +export const E_SchemaFormatFunc = { + toLocalTimestamp(time) { + return moment(time).format('YYYY-MM-DD hh:mm:ss') + }, + toRootElement(isBody) { + return isBody ? 'body' : 'div' + }, + toGroupName(group) { + // 调整一下group命名 + if (['static', 'public'].includes(group)) { + return `${group}Pages` + } + return group + }, + toCreatorName(createdBy) { + // 历史原因 数据库中有页面的createdBy为null + return (createdBy || {}).username || '' + }, + + // 数字转字符串 + toFormatString(param) { + return param.toString() + }, + + // 给global_state设置默认值 + toArrayValue(state) { + return Array.isArray(state) ? state : [] + } +} diff --git a/dl-flow-frontend/mockServer/src/tool/Common.js b/dl-flow-frontend/mockServer/src/tool/Common.js new file mode 100644 index 0000000..23d7988 --- /dev/null +++ b/dl-flow-frontend/mockServer/src/tool/Common.js @@ -0,0 +1,75 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +// 截取字符串,多余的部分用...代替 +export const setString = (str, len) => { + let StrLen = 0 + let s = '' + for (let i = 0; i < str.length; i++) { + if (str.charCodeAt(i) > 128) { + StrLen += 2 + } else { + StrLen++ + } + s += str.charAt(i) + if (StrLen >= len) { + return s + '...' + } + } + return s +} + +// 格式化设置 +export const OptionFormat = (GetOptions) => { + let options = '{' + for (let n = 0; n < GetOptions.length; n++) { + options = options + "'" + GetOptions[n].option_name + "':'" + GetOptions[n].option_value + "'" + if (n < GetOptions.length - 1) { + options = options + ',' + } + } + return JSON.parse(options + '}') +} + + +// 数组去重 +export const HovercUnique = (arr) => { + const n = {} + const r = [] + for (let i = 0; i < arr.length; i++) { + if (!n[arr[i]]) { + n[arr[i]] = true + r.push(arr[i]) + } + } + return r +} + +// 获取json长度 +export const getJsonLength = (jsonData) => { + return Object.keys(jsonData).length +} + +export const getResponseData = (data, error) => { + const res = { + data + } + + if (error) { + const err_code = error.code + res.error = { + code: err_code, + message: error.message + } + } + return res +} diff --git a/dl-flow-frontend/mockServer/test/app.test.js b/dl-flow-frontend/mockServer/test/app.test.js new file mode 100644 index 0000000..1af2aa3 --- /dev/null +++ b/dl-flow-frontend/mockServer/test/app.test.js @@ -0,0 +1,19 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import app from '../src/app' + +describe('Example', () => { + test('should be defined', () => { + expect(app).toBeDefined() + }) +}) diff --git a/dl-flow-frontend/package.json b/dl-flow-frontend/package.json new file mode 100644 index 0000000..4937f07 --- /dev/null +++ b/dl-flow-frontend/package.json @@ -0,0 +1,77 @@ +{ + "name": "tiny-engine", + "private": true, + "scripts": { + "preinstall": "npx only-allow pnpm", + "dev": "pnpm run setup && concurrently 'pnpm:serve:backend' 'pnpm:serve:frontend'", + "dev:mock": "pnpm --filter @opentiny/tiny-engine dev", + "serve:frontend": "pnpm --filter @opentiny/tiny-engine serve", + "serve:backend": "pnpm --filter @opentiny/tiny-engine-mock dev", + "build:plugin": "pnpm --filter @opentiny/tiny-engine-* build && pnpm --filter dl-flow-* build", + "build:alpha": "pnpm --filter @opentiny/tiny-engine build:alpha", + "build:prod": "pnpm --filter @opentiny/tiny-engine build:prod", + "buildComponentSchemas": "node scripts/buildComponentSchemas.js", + "preview": "pnpm --filter @opentiny/tiny-engine preview", + "lint": "eslint . --ext .js,.vue,.jsx --fix", + "format": "prettier --write **/*{.vue,.js,.ts,.html,.json}", + "prepare": "node -e \"if(require('fs').existsSync('.git')){process.exit(1)}\" || husky install", + "pub:premajor": "pnpm run build:plugin && pnpm run build:alpha && pnpm lerna version premajor --preid beta --no-push --yes && lerna publish from-package --pre-dist-tag beta --yes", + "pub:preminor": "pnpm run build:plugin && pnpm run build:alpha && pnpm lerna version preminor --preid beta --no-push --yes && lerna publish from-package --pre-dist-tag beta --yes", + "pub:prepatch": "pnpm run build:plugin && pnpm run build:alpha && pnpm lerna version prepatch --preid beta --no-push --yes && lerna publish from-package --pre-dist-tag beta --yes", + "pub:prerelease": "pnpm run build:plugin && pnpm run build:alpha && pnpm lerna version prerelease --preid beta --no-push --yes && lerna publish from-package --pre-dist-tag beta --yes", + "setup": "node ./scripts/setup.js", + "splitMaterials": "node ./scripts/splitMaterials.mjs", + "buildMaterials": "node ./scripts/buildMaterials.mjs" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.21.3", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "@types/antlr4": "^4.11.6", + "@types/node": "^18.0.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.2", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "chokidar": "^3.5.3", + "concurrently": "^8.2.0", + "cross-env": "^7.0.3", + "dotenv": "^16.3.1", + "eslint": "^8.38.0", + "eslint-plugin-vue": "^8.0.0", + "fast-glob": "^3.3.2", + "fs-extra": "^10.1.0", + "husky": "^8.0.0", + "lerna": "^7.2.0", + "less": "^4.1.2", + "lint-staged": "^13.2.0", + "mysql": "^2.18.1", + "path": "^0.12.7", + "picocolors": "^1.0.0", + "rimraf": "^3.0.2", + "rollup-plugin-polyfill-node": "^0.12.0", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-visualizer": "^5.8.3", + "svg-sprite-loader": "^6.0.11", + "vite": "^4.3.7", + "vite-plugin-monaco-editor": "^1.0.10", + "vite-plugin-svg-icons": "^2.0.1", + "vue-eslint-parser": "^8.0.1" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ], + "engines": { + "node": ">=14", + "pnpm": ">=7" + }, + "dependencies": { + "@antv/x6": "^2.17.1", + "@antv/x6-plugin-keyboard": "^2.2.2", + "@antv/x6-plugin-selection": "^2.2.1", + "@antv/x6-vue-shape": "^2.1.1", + "dt-python-parser": "^0.9.0" + } +} diff --git a/dl-flow-frontend/packages/blockToWebComponentTemplate/README.md b/dl-flow-frontend/packages/blockToWebComponentTemplate/README.md new file mode 100644 index 0000000..cb10454 --- /dev/null +++ b/dl-flow-frontend/packages/blockToWebComponentTemplate/README.md @@ -0,0 +1,12 @@ +# @opentiny/tiny-engine-blockToWebComponentTemplate + +将区块转换成 webComponent,使得不同技术栈的区块可以统一在 vue 的画布上面运行 + +## 使用 + +- 后端拉取 template +- 将区块 schema 转换成 高代码,并写入 src 文件夹中 +- 写入 lib.js,替换 BlockFileName 为实际出码的文件名 +- 执行 `pnpm install` 安装依赖 +- 运行 `pnpm run build:block` 命令 +- 得到 webcomponent 转换产物 \ No newline at end of file diff --git a/dl-flow-frontend/packages/blockToWebComponentTemplate/package.json b/dl-flow-frontend/packages/blockToWebComponentTemplate/package.json new file mode 100644 index 0000000..4568941 --- /dev/null +++ b/dl-flow-frontend/packages/blockToWebComponentTemplate/package.json @@ -0,0 +1,47 @@ +{ + "name": "@opentiny/tiny-engine-block-build", + "version": "1.0.1", + "description": "translate block to webcomponent template", + "main": "./dist/web-components.es.js", + "scripts": { + "build:block": "vite build --mode block" + }, + "keywords": [ + "vue", + "vue3", + "frontend", + "opentiny", + "lowcode", + "tiny-engine", + "webComponent" + ], + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/builtinComponent" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-i18n-host": "workspace:*", + "@opentiny/tiny-engine-webcomponent-core": "workspace:*", + "@opentiny/vue": "~3.11.0", + "@opentiny/vue-icon": "~3.11.0", + "@opentiny/vue-theme": "~3.11.0", + "@vue/shared": "^3.3.11", + "vue": "^3.3.11", + "vue-i18n": "^9.8.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.5.2", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/blockToWebComponentTemplate/src/BlockFileName.vue b/dl-flow-frontend/packages/blockToWebComponentTemplate/src/BlockFileName.vue new file mode 100644 index 0000000..90791a4 --- /dev/null +++ b/dl-flow-frontend/packages/blockToWebComponentTemplate/src/BlockFileName.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/dl-flow-frontend/packages/blockToWebComponentTemplate/src/lib.js b/dl-flow-frontend/packages/blockToWebComponentTemplate/src/lib.js new file mode 100644 index 0000000..61a538b --- /dev/null +++ b/dl-flow-frontend/packages/blockToWebComponentTemplate/src/lib.js @@ -0,0 +1,20 @@ +import { hyphenate } from '@vue/shared' +import { defineCustomElement } from '@opentiny/tiny-engine-webcomponent-core' +import block from './BlockFileName.vue' + +window.TinyLowcodeResource = window.TinyLowcodeResource || {} + +const blockName = hyphenate('BlockFileName') + +if (customElements.get(blockName)) { + if (window.TinyLowcodeResource[blockName]) { + Object.assign(window.TinyLowcodeResource[blockName], block) + } +} else { + block.links = process.env.VUE_APP_UI_LIB_FULL_STYLE_FILE_URL + block.styles = ['svg { width: 10px; height: 10px;}', ...(block.styles || [])] + window.TinyLowcodeResource[blockName] = block + customElements.define(blockName, defineCustomElement(block)) +} + +export default block diff --git a/dl-flow-frontend/packages/blockToWebComponentTemplate/vite.config.js b/dl-flow-frontend/packages/blockToWebComponentTemplate/vite.config.js new file mode 100644 index 0000000..446d005 --- /dev/null +++ b/dl-flow-frontend/packages/blockToWebComponentTemplate/vite.config.js @@ -0,0 +1,66 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import path from 'path' + +const config = { + define: {}, + resolve: { + alias: {} + }, + build: { + cssCodeSplit: false, + minify: false, + commonjsOptions: { + transformMixedEsModules: true + }, + rollupOptions: { + external: [ + 'vue', + 'vue-i18n', + '@opentiny/tiny-engine-i18n-host', + '@opentiny/tiny-engine-webcomponent-core', + '@opentiny/vue', + '@opentiny/vue-icon' + ], + output: { + globals: { + vue: 'Vue', + 'vue-i18n': 'VueI18n', + '@opentiny/tiny-engine-i18n-host': 'TinyI18nHost', + '@opentiny/tiny-engine-webcomponent-core': 'TinyWebcomponentCore', + '@opentiny/vue': 'TinyVue', + '@opentiny/vue-icon': 'TinyVueIcon' + } + } + } + } +} + +export default defineConfig(({ command, mode }) => { + if (command !== 'build' || mode !== 'block') { + return config + } + + const vuePluginConfig = {} + const styleLinks = ['https://npm.onmicrosoft.cn/@opentiny/vue-theme@3.11/index.css'] + + config.publicDir = false + + config.build.lib = { + entry: path.resolve(__dirname, './src/lib.js'), + name: 'TinyVueBlock', + formats: ['umd', 'es'], + fileName: (format) => `js/web-component.${format}.js` + } + + vuePluginConfig.customElement = true + + config.plugins = [vue(vuePluginConfig), vueJsx()] + + config.define['process.env'] = { + VUE_APP_UI_LIB_FULL_STYLE_FILE_URL: styleLinks + } + + return config +}) diff --git a/dl-flow-frontend/packages/builtinComponent/README.md b/dl-flow-frontend/packages/builtinComponent/README.md new file mode 100644 index 0000000..5670a81 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/README.md @@ -0,0 +1,9 @@ +# 内置组件 + +## 目前内置的组件 + +### CanvasRow + +### CanvasCol + +### CanvasRowColContainer diff --git a/dl-flow-frontend/packages/builtinComponent/index.js b/dl-flow-frontend/packages/builtinComponent/index.js new file mode 100644 index 0000000..99242b7 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/index.js @@ -0,0 +1,4 @@ +export { default as CanvasCol } from './src/components/CanvasCol.vue' +export { default as CanvasRow } from './src/components/CanvasRow.vue' +export { default as CanvasRowColContainer } from './src/components/CanvasRowColContainer.vue' +export { default as meta } from './src/meta' diff --git a/dl-flow-frontend/packages/builtinComponent/package.json b/dl-flow-frontend/packages/builtinComponent/package.json new file mode 100644 index 0000000..89adbac --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/package.json @@ -0,0 +1,31 @@ +{ + "name": "@opentiny/tiny-engine-builtin-component", + "version": "1.0.0", + "description": "", + "main": "dist/index.js", + "module": "dist/index.js", + "publishConfig": { + "access": "public" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/builtinComponent" + }, + "scripts": { + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@opentiny/vue": "~3.10.0", + "vite-plugin-css-injected-by-js": "^3.3.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "vite": "^4.5.0" + } +} diff --git a/dl-flow-frontend/packages/builtinComponent/src/components/CanvasCol.vue b/dl-flow-frontend/packages/builtinComponent/src/components/CanvasCol.vue new file mode 100644 index 0000000..7bbaeb4 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/components/CanvasCol.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/dl-flow-frontend/packages/builtinComponent/src/components/CanvasRow.vue b/dl-flow-frontend/packages/builtinComponent/src/components/CanvasRow.vue new file mode 100644 index 0000000..5c7ba54 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/components/CanvasRow.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/dl-flow-frontend/packages/builtinComponent/src/components/CanvasRowColContainer.vue b/dl-flow-frontend/packages/builtinComponent/src/components/CanvasRowColContainer.vue new file mode 100644 index 0000000..ad46e40 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/components/CanvasRowColContainer.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/dl-flow-frontend/packages/builtinComponent/src/components/helper.js b/dl-flow-frontend/packages/builtinComponent/src/components/helper.js new file mode 100644 index 0000000..5920027 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/components/helper.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +export const getStyleValue = (value) => { + if (typeof value === 'number' || /^\d+\.?\d*$/.test(value)) { + return `${value}px` + } + + if (/^\d+\.?\d*(px|%|pt|em|rem|vw|vh)$/.test(value)) { + return value + } + + return '' +} + +export const alignMap = { + 'flex-start': 'flex-start', + 'flex-end': 'flex-end', + center: 'center', + stretch: 'stretch', + start: 'start', + end: 'end' +} + +export const justAlignMap = { + 'space-between': 'space-between', + 'space-around': 'space-around', + 'space-evenly': 'space-evenly', + 'flex-start': 'flex-start', + 'flex-end': 'flex-end', + stretch: 'stretch', + center: 'center', + start: 'start', + end: 'end', + left: 'left', + right: 'right' +} diff --git a/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasCol.json b/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasCol.json new file mode 100644 index 0000000..33c68b5 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasCol.json @@ -0,0 +1,196 @@ +{ + "components": { + "icon": "Box", + "name": { + "zh_CN": "CanvasCol" + }, + "component": "CanvasCol", + "schema": { + "slots": {}, + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "widthType", + "type": "String", + "defaultValue": "auto", + "label": { + "text": { + "zh_CN": "宽度类型" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaRadioGroup", + "props": { + "options": [ + { "label": "auto", "text": "自适应" }, + { "label": "fixed", "text": "固定" } + ], + "type": "button" + } + } + }, + { + "property": "flexBasis", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "固定宽度" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "rowGap", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "行间距" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "colGap", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列间距" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "align", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "副轴对齐" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { "value": "flex-start", "label": "头部对齐" }, + { "value": "center", "label": "中间对齐" }, + { "value": "flex-end", "label": "尾端对齐" }, + { "value": "stretch", "label": "拉伸对齐" } + ], + "type": "button" + } + } + }, + { + "property": "justAlign", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "主轴对齐" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { "value": "flex-start", "label": "头部对齐" }, + { "value": "center", "label": "中间对齐" }, + { "value": "flex-end", "label": "尾端对齐" }, + { "value": "space-between", "label": "两端对齐" }, + { "value": "space-evenly", "label": "均分对齐" } + ], + "type": "button" + } + } + }, + { + "property": "grow", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "增长" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "shrink", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "收缩" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true, + "isContainer": true, + "nestingRule": { + "childWhitelist": [], + "descendantBlacklist": [] + } + } + } +} diff --git a/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasRow.json b/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasRow.json new file mode 100644 index 0000000..5033b30 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasRow.json @@ -0,0 +1,142 @@ +{ + "components": { + "icon": "Box", + "name": { + "zh_CN": "CanvasRow" + }, + "component": "CanvasRow", + "schema": { + "slots": {}, + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "minHeight", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "最小高度" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "rowGap", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "行间距" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "colGap", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "列间距" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "align", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "副轴对齐" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { "value": "flex-start", "label": "头部对齐" }, + { "value": "center", "label": "中间对齐" }, + { "value": "flex-end", "label": "尾端对齐" }, + { "value": "stretch", "label": "拉伸对齐" } + ], + "type": "button" + } + } + }, + { + "property": "justAlign", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "主轴对齐" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { "value": "flex-start", "label": "头部对齐" }, + { "value": "center", "label": "中间对齐" }, + { "value": "flex-end", "label": "尾端对齐" }, + { "value": "space-between", "label": "两端对齐" }, + { "value": "space-evenly", "label": "均分对齐" } + ], + "type": "button" + } + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true, + "isContainer": true, + "nestingRule": { + "childWhitelist": [], + "descendantBlacklist": [] + } + } + } +} diff --git a/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasRowColContainer.json b/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasRowColContainer.json new file mode 100644 index 0000000..e363530 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/meta/CanvasRowColContainer.json @@ -0,0 +1,96 @@ +{ + "components": { + "icon": "Box", + "name": { + "zh_CN": "行列容器" + }, + "component": "CanvasRowColContainer", + "schema": { + "slots": {}, + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "rowGap", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "行间距" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true, + "isContainer": true, + "nestingRule": { + "childWhitelist": [], + "descendantBlacklist": [] + } + } + }, + "snippets": { + "name": { + "zh_CN": "行列容器" + }, + "screenshot": "", + "snippetName": "CanvasRowColContainer", + "icon": "Box", + "schema": { + "componentName": "CanvasRowColContainer", + "props": { + "rowGap": "20px" + }, + "children": [ + { + "componentName": "CanvasRow", + "props": { + "rowGap": "20px", + "colGap": "20px" + }, + "children": [ + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + } + } + ] + } + ] + } + } +} diff --git a/dl-flow-frontend/packages/builtinComponent/src/meta/index.js b/dl-flow-frontend/packages/builtinComponent/src/meta/index.js new file mode 100644 index 0000000..fa2fca6 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/src/meta/index.js @@ -0,0 +1,18 @@ +import CanvasCol from './CanvasCol.json' +import CanvasRow from './CanvasRow.json' +import CanvasRowColContainer from './CanvasRowColContainer.json' + +export default { + components: [ + { + group: '内置组件', + children: [{ ...CanvasCol.components }, { ...CanvasRow.components }, { ...CanvasRowColContainer.components }] + } + ], + snippets: [ + { + group: '内置组件', + children: [{ ...CanvasRowColContainer.snippets }] + } + ] +} diff --git a/dl-flow-frontend/packages/builtinComponent/vite.config.js b/dl-flow-frontend/packages/builtinComponent/vite.config.js new file mode 100644 index 0000000..d77e390 --- /dev/null +++ b/dl-flow-frontend/packages/builtinComponent/vite.config.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import vitePluginCssInjectedByJs from 'vite-plugin-css-injected-by-js' + +export default defineConfig({ + plugins: [vue(), vueJsx(), vitePluginCssInjectedByJs()], + publicDir: false, + build: { + cssCodeSplit: false, + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'builtinComponent', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + external: ['vue'] + } + } +}) diff --git a/dl-flow-frontend/packages/canvas/.eslintrc.js b/dl-flow-frontend/packages/canvas/.eslintrc.js new file mode 100644 index 0000000..7e042cf --- /dev/null +++ b/dl-flow-frontend/packages/canvas/.eslintrc.js @@ -0,0 +1,42 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +module.exports = { + env: { + browser: true, + es2015: true, + node: true, + jest: true + }, + extends: ['eslint:recommended', 'plugin:vue/vue3-essential'], + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@babel/eslint-parser', + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + babelOptions: { + parserOpts: { + plugins: ['jsx'] + } + } + }, + plugins: ['vue'], + rules: { + 'no-console': 'error', + 'no-debugger': 'error', + 'space-before-function-paren': 'off', + 'vue/multi-word-component-names': 'off', + 'no-use-before-define': 'error', + 'no-unused-vars': ['error', { ignoreRestSiblings: true, varsIgnorePattern: '^_', argsIgnorePattern: '^_' }] + } +} diff --git a/dl-flow-frontend/packages/canvas/.gitignore b/dl-flow-frontend/packages/canvas/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/dl-flow-frontend/packages/canvas/README.md b/dl-flow-frontend/packages/canvas/README.md new file mode 100644 index 0000000..eea15ce --- /dev/null +++ b/dl-flow-frontend/packages/canvas/README.md @@ -0,0 +1,7 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/dl-flow-frontend/packages/canvas/index.html b/dl-flow-frontend/packages/canvas/index.html new file mode 100644 index 0000000..030a6ff --- /dev/null +++ b/dl-flow-frontend/packages/canvas/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/dl-flow-frontend/packages/canvas/package.json b/dl-flow-frontend/packages/canvas/package.json new file mode 100644 index 0000000..f724005 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/package.json @@ -0,0 +1,52 @@ +{ + "name": "@opentiny/tiny-engine-canvas", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/canvas" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@babel/core": "7.18.13", + "@opentiny/tiny-engine-builtin-component": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/tiny-engine-webcomponent-core": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0", + "@vue/babel-plugin-jsx": "1.1.1", + "@vue/shared": "^3.3.4", + "@vueuse/components": "^10.7.2", + "@vueuse/core": "^9.6.0", + "vue": "3.2.45", + "vue-i18n": "9.2.2" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "rollup-plugin-terser": "^7.0.2", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/canvas/public/favicon.ico b/dl-flow-frontend/packages/canvas/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/dl-flow-frontend/packages/canvas/public/favicon.ico differ diff --git a/dl-flow-frontend/packages/canvas/src/Design.vue b/dl-flow-frontend/packages/canvas/src/Design.vue new file mode 100644 index 0000000..886bc7d --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/Design.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/assets/logo.png b/dl-flow-frontend/packages/canvas/src/assets/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/dl-flow-frontend/packages/canvas/src/assets/logo.png differ diff --git a/dl-flow-frontend/packages/canvas/src/canvas.js b/dl-flow-frontend/packages/canvas/src/canvas.js new file mode 100644 index 0000000..853f02f --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/canvas.js @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { createApp } from 'vue' +import * as TinyVue from '@opentiny/vue' + +import { RenderMain } from './index' + +import { I18nInjectionKey, createI18n } from 'vue-i18n' + +window.TinyLowcodeComponent = {} + +Object.entries(TinyVue).forEach(([_key, component]) => { + const { name } = component + if (name) { + window.TinyLowcodeComponent[name] = component + } +}) + +const i18nHost = createI18n({ + locale: 'zh_CN', + messages: {} +}) + +createApp(RenderMain).use(i18nHost).provide(I18nInjectionKey, i18nHost).mount('#app') diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasBox.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasBox.vue new file mode 100644 index 0000000..96beea7 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasBox.vue @@ -0,0 +1,22 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCol.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCol.vue new file mode 100644 index 0000000..5c0a5cb --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCol.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCollection.js b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCollection.js new file mode 100644 index 0000000..98def24 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCollection.js @@ -0,0 +1,278 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { getController } from '../render/render' +import { api } from '../render/RenderMain' +import { useModal } from '@opentiny/tiny-engine-controller' + +const NAME_PREFIX = { + loop: 'loop', + table: 'getTableData', + page: 'pageConfig', + grid: 'tinyGrid', + tree: 'tinyTree', + select: 'tinySelect' +} + +const genRemoteMethodToLifeSetup = (variableName, sourceRef, pageSchema) => { + if (sourceRef.value.data?.option) { + const setupFn = pageSchema.lifeCycles?.setup?.value + const fetchBody = ` + this.state.${variableName} = [] + this.dataSourceMap.${sourceRef.value.name}.load().then(data=>{ this.state.${variableName}=data })` + + if (!setupFn) { + pageSchema.lifeCycles = pageSchema.lifeCycles || {} + pageSchema.lifeCycles.setup = { + type: 'JSFunction', + value: `function setup({ props, state, watch, onMounted }) {${fetchBody}}` + } + } else { + pageSchema.lifeCycles.setup.value = setupFn.trim().replace(/\}$/, fetchBody + '}') + } + } +} + +const removeState = (pageSchema, variableName) => { + delete pageSchema.state[variableName] + + const { parse, traverse, generate } = getController().ast + const setupFn = pageSchema.lifeCycles?.setup?.value + + try { + const ast = parse(setupFn) + + traverse(ast, { + ExpressionStatement(path) { + path.toString().includes(variableName) && path.remove() + } + }) + + pageSchema.lifeCycles.setup.value = generate(ast).code + } catch (error) { + // do nothing + } +} + +const setStateWithSourceRef = (pageSchema, variableName, sourceRef, data) => { + api.setState({ [variableName]: data }) + pageSchema.state[variableName] = data + + if (sourceRef.value.data?.option?.isSync) { + genRemoteMethodToLifeSetup(variableName, sourceRef, pageSchema) + } +} + +const defaultHandlerTemplate = ({ node, sourceRef, schemaId, pageSchema }) => { + const genVarName = (schemaId) => `${NAME_PREFIX.loop}${schemaId}` + + const updateNode = () => { + const { configure } = getController().getMaterial(node?.componentName) + + if (!configure?.loop) { + return + } + + const variableName = genVarName(schemaId) + + setStateWithSourceRef(pageSchema, variableName, sourceRef, sourceRef.value.data?.data) + + node.loop = { + type: 'JSExpression', + value: `this.state.${variableName}` + } + } + + const clearBindVar = () => { + const variableName = genVarName(schemaId) + + removeState(pageSchema, variableName) + } + + return { + updateNode, + clearBindVar + } +} + +const generateAssginColumns = (newColumns, oldColumns) => { + newColumns.forEach((item) => { + const targetColumn = oldColumns.find((value) => value.field === item.field) + if (targetColumn) { + Object.assign(item, targetColumn) + } + }) + return newColumns +} + +const askShouldImportData = ({ node, sourceRef }) => { + useModal().confirm({ + message: '检测到表格存在配置的数据,是否需要引入?', + exec() { + const sourceColums = sourceRef.value?.data?.columns?.map(({ title, field }) => ({ title, field })) || [] + // 这里需要找到对应列,然后进行列合并 + node.props.columns = generateAssginColumns(sourceColums, node.props.columns) + }, + cancel() { + node.props.columns = [...sourceRef.value.data?.columns] + } + }) +} + +const updateNodeHandler = ({ node, sourceRef, pageSchema, sourceName, methodName }) => { + if (!node || !node.props) { + return + } + + // 如果使用了数据元则需要删除表格的data属性 + delete node?.props?.data + + if (node.props.columns.length) { + askShouldImportData({ node, sourceRef }) + } else { + node.props.columns = [...sourceRef.value.data?.columns] + } + + const pageConfig = { + attrs: { + currentPage: 1, + pageSize: 50, + pageSizes: [10, 20, 50], + total: 0, + layout: 'sizes,total, prev, pager, next, jumper' + } + } + + node.props.pager = pageConfig + + pageSchema.methods[methodName] = { + type: 'JSFunction', + value: `function ${methodName}({ page, sort, sortBy, filters}) { +/** +* @param {Object} sort 排序数据 +* @param {Array} sortBy 排序方式 +* @param {Object} page 分页数据 +* @param {Array} filters 筛选数据 +* @returns {Object} 返回一个promise对象,并且resolve格式为{ result: Array, page: { total: Number } } +*/ +return new Promise((resolve, reject) => { +this.dataSourceMap.${sourceName}.load().then((res) => { + // 如果按照数据源面板的建议格式编写dataHandler + // 那么dataSourceMap的res格式应该是:{ code: string, msg: string, data: {items: any[], total: number} } + resolve({ result: res.data.items, page: { total: res.data.total } }); +}); +}); +}` + } +} + +const extraHandlerMap = { + TinyGrid: ({ node, sourceRef, schemaId, pageSchema }) => { + const sourceName = sourceRef.value?.name + const methodName = `${NAME_PREFIX.table}${schemaId}` + + node.props.fetchData = { + type: 'JSExpression', + value: `{ api: this.${methodName} }` + } + + const updateNode = () => updateNodeHandler({ node, sourceRef, pageSchema, sourceName, methodName }) + + const clearBindVar = () => { + // 当数据源组件children字段为空时,及时清空创建的methods + delete pageSchema.methods[methodName] + } + + return { + updateNode, + clearBindVar + } + }, + TinyTree: ({ node, sourceRef, schemaId, pageSchema }) => { + const genVarName = (schemaId) => `${NAME_PREFIX.tree}${schemaId}` + + const updateNode = () => { + const variableName = genVarName(schemaId) + + const arrayToTree = (data) => { + const map = {} + const tree = [] + let node = null + let i = 0 + + for (i = 0; i < data.length; i++) { + map[data[i].id] = data[i] + data[i].children = [] + } + + for (i = 0; i < data.length; i++) { + node = data[i] + if (node.pid !== '') { + map[node.pid]?.children?.push(node) + } else { + tree.push(node) + } + } + + return tree + } + + setStateWithSourceRef(pageSchema, variableName, sourceRef, arrayToTree(sourceRef.value.data?.data)) + + node.props.data = { + type: 'JSExpression', + value: `this.state.${variableName}` + } + } + + const clearBindVar = () => { + const variableName = genVarName(schemaId) + + removeState(pageSchema, variableName) + } + + return { + updateNode, + clearBindVar + } + }, + TinySelect: ({ node, sourceRef, schemaId, pageSchema }) => { + const genVarName = (schemaId) => `${NAME_PREFIX.select}${schemaId}` + + const updateNode = () => { + const variableName = genVarName(schemaId) + + setStateWithSourceRef(pageSchema, variableName, sourceRef, sourceRef.value.data?.data) + + node.props.options = { + type: 'JSExpression', + value: `this.state.${variableName}` + } + } + + const clearBindVar = () => { + const variableName = genVarName(schemaId) + + removeState(pageSchema, variableName) + } + + return { + updateNode, + clearBindVar + } + } +} + +export const getHandler = ({ node, sourceRef, schemaId, pageSchema }) => + extraHandlerMap[node.componentName] + ? extraHandlerMap[node.componentName]({ node, sourceRef, schemaId, pageSchema }) + : defaultHandlerTemplate({ node, sourceRef, schemaId, pageSchema }) diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCollection.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCollection.vue new file mode 100644 index 0000000..35173f1 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasCollection.vue @@ -0,0 +1,106 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasIcon.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasIcon.vue new file mode 100644 index 0000000..4256731 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasIcon.vue @@ -0,0 +1,30 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasImg.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasImg.vue new file mode 100644 index 0000000..2581381 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasImg.vue @@ -0,0 +1,18 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasPlaceholder.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasPlaceholder.vue new file mode 100644 index 0000000..698df4d --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasPlaceholder.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasRow.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasRow.vue new file mode 100644 index 0000000..03c86db --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasRow.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasRowColContainer.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasRowColContainer.vue new file mode 100644 index 0000000..ccef5fb --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasRowColContainer.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasSlot.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasSlot.vue new file mode 100644 index 0000000..2c54559 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasSlot.vue @@ -0,0 +1,22 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasText.vue b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasText.vue new file mode 100644 index 0000000..ec9de29 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/CanvasText.vue @@ -0,0 +1,18 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/builtin.json b/dl-flow-frontend/packages/canvas/src/components/builtin/builtin.json new file mode 100644 index 0000000..313f94f --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/builtin.json @@ -0,0 +1,73 @@ +{ + "data": { + "materials": [ + { + "label": { + "zhCN": "1D 卷积神经网络", + "enUS": "Conv 1D" + }, + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "properties": [ + { + "zhCN": "输入通道数", + "enUS": "in_channels", + "type": "number" + }, + { + "zhCN": "输出通道数", + "enus": "out_channels", + "type": "number" + }, + { + "zhCN": "卷积核大小", + "enUS": "kernal_size", + "type": "number" + }, + { + "zhCN": "步长", + "enUS": "stride", + "type": "number" + }, + { + "zhCN": "空洞大小", + "enUS": "dilation", + "type": "number" + }, + { + "zhCN": "组数", + "enUS": "groups", + "type": "number" + }, + { + "zhCN": "填充模式", + "enUS": "padding_mode", + "type": "enums", + "data": [ + { "id": 1, "label": "zeros", "value": "zeros", "default": true }, + { "id": 2, "label": "reflect", "value": "reflect" }, + { "id": 3, "label": "replicate", "value": "replicate" }, + { "id": 4, "label": "circular", "value": "circular" } + ] + }, + { + "zhCN": "权重参数", + "enUS": "weight_attr", + "type": "ParamAttr" + }, + { + "zhCN": "偏置参数", + "enUS": "bias_attr", + "type": "ParamAttr" + }, + { + "zhCN": "数据格式", + "enUS": "data_format", + "type": "string" + } + ] + } + ] + } +} diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/helper.js b/dl-flow-frontend/packages/canvas/src/components/builtin/helper.js new file mode 100644 index 0000000..8f884f7 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/helper.js @@ -0,0 +1,46 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export const getStyleValue = (value) => { + if (typeof value === 'number' || /^\d+\.?\d*$/.test(value)) { + return `${value}px` + } + + if (/^\d+\.?\d*(px|%|pt|em|rem|vw|vh)$/.test(value)) { + return value + } + + return '' +} + +export const alignMap = { + 'flex-start': 'flex-start', + 'flex-end': 'flex-end', + center: 'center', + stretch: 'stretch', + start: 'start', + end: 'end' +} + +export const justAlignMap = { + 'space-between': 'space-between', + 'space-around': 'space-around', + 'space-evenly': 'space-evenly', + 'flex-start': 'flex-start', + 'flex-end': 'flex-end', + stretch: 'stretch', + center: 'center', + start: 'start', + end: 'end', + left: 'left', + right: 'right' +} diff --git a/dl-flow-frontend/packages/canvas/src/components/builtin/index.js b/dl-flow-frontend/packages/canvas/src/components/builtin/index.js new file mode 100644 index 0000000..f857ff1 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/builtin/index.js @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import CanvasText from './CanvasText.vue' +import CanvasBox from './CanvasBox.vue' +import CanvasCollection from './CanvasCollection.vue' +import CanvasIcon from './CanvasIcon.vue' +import CanvasSlot from './CanvasSlot.vue' +import CanvasImg from './CanvasImg.vue' +import CanvasPlaceholder from './CanvasPlaceholder.vue' + +export { CanvasText, CanvasBox, CanvasCollection, CanvasIcon, CanvasSlot, CanvasImg, CanvasPlaceholder } diff --git a/dl-flow-frontend/packages/canvas/src/components/common/index.js b/dl-flow-frontend/packages/canvas/src/components/common/index.js new file mode 100644 index 0000000..68a7097 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/common/index.js @@ -0,0 +1,158 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export const NODE_UID = 'data-uid' +export const NODE_TAG = 'data-tag' +export const NODE_LOOP = 'loop-id' + +export const addScript = (src, doc = document) => { + return new Promise((resolve, reject) => { + const script = doc.createElement('script') + + script.setAttribute('type', 'text/javascript') + script.setAttribute('src', src) + + script.async = false + + script.onload = resolve + script.onerror = reject + + doc.querySelector('head').appendChild(script) + }) +} + +export const addStyle = (href, doc = document) => { + return new Promise((resolve, reject) => { + const link = doc.createElement('link') + + link.setAttribute('href', href) + link.setAttribute('rel', 'stylesheet') + + link.onload = resolve + link.onerror = reject + + doc.querySelector('head').appendChild(link) + }) +} + +export const copyObject = (node) => { + if (typeof node === 'object') { + if (!node) { + return node + } + + if (Array.isArray(node)) { + return node.map(copyObject) + } + + const res = {} + Object.keys(node).forEach((key) => { + res[key] = copyObject(node[key]) + }) + + const { componentName, id } = res + + if (componentName && id) { + delete res.id + } + + return res + } + + return node +} + +/** + * 复制节点的schema对象到剪切板,以String形式保存 + * @param {*} event ClipboardEvent + * @param {*} node 节点的schema对象 + * @return 复制的剪切板的String + */ +export const setClipboardSchema = (event, node) => { + let text + + if (typeof node === 'object') { + text = JSON.stringify(node) + } else { + text = String(node) + } + + event.clipboardData.setData('text/plain', text) + event.preventDefault() + + return text +} + +const translateStringToSchame = (clipText) => { + if (!clipText) { + return null + } + + let data + + try { + data = JSON.parse(clipText) + if (!data || !data.componentName) { + data = null + } + } catch (error) { + data = null + } + + return data +} + +/** + * 获得剪切板的内容,转换成schema + * @param {*} event ClipboardEvent + * @return 节点的schema对象 + */ +export const getClipboardSchema = (event) => translateStringToSchame(event.clipboardData.getData('text/plain')) + +/** + * 动态导入组件,缓存组件对象 + * @param {object} param0 组件的依赖: { package: 包名,script:js文件cdn, components:组件id和导出组件名的映射关系} + * @returns + */ +export const dynamicImportComponents = async ({ package: pkg, script, components }) => { + if (!script) return + + if (!window.TinyComponentLibs[pkg]) { + const modules = await import(/* @vite-ignore */ script) + + window.TinyComponentLibs[pkg] = modules + } + + Object.entries(components).forEach(([componentId, exportName]) => { + const modules = window.TinyComponentLibs[pkg] + + if (!window.TinyLowcodeComponent[componentId]) { + window.TinyLowcodeComponent[componentId] = modules[exportName] + } + }) +} + +/** + * 更新区块/组件依赖 + * @param {object} param0 依赖的CDN信息 + */ +export const updateDependencies = ({ detail }) => { + const { scripts = [], styles = [] } = detail || {} + const { styles: canvasStyles } = window.thirdPartyDeps + const newStyles = [...styles].filter((item) => !canvasStyles.has(item)) + + newStyles.forEach((item) => canvasStyles.add(item)) + + const promises = [...newStyles].map((src) => addStyle(src)).concat(scripts.map(dynamicImportComponents)) + + Promise.allSettled(promises) +} diff --git a/dl-flow-frontend/packages/canvas/src/components/container/AlgoNode.vue b/dl-flow-frontend/packages/canvas/src/components/container/AlgoNode.vue new file mode 100644 index 0000000..d91b0d0 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/AlgoNode.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/container/CanvasContainer.vue b/dl-flow-frontend/packages/canvas/src/components/container/CanvasContainer.vue new file mode 100644 index 0000000..9365f7f --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/CanvasContainer.vue @@ -0,0 +1,7 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/container/GroupNode.vue b/dl-flow-frontend/packages/canvas/src/components/container/GroupNode.vue new file mode 100644 index 0000000..dc7105d --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/GroupNode.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/canvas/src/components/container/X6Canvas.vue b/dl-flow-frontend/packages/canvas/src/components/container/X6Canvas.vue new file mode 100644 index 0000000..2d50048 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/X6Canvas.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/container/container.js b/dl-flow-frontend/packages/canvas/src/components/container/container.js new file mode 100644 index 0000000..e946ad5 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/container.js @@ -0,0 +1,808 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive, toRaw, nextTick, shallowReactive } from 'vue' +import { + addScript as appendScript, + addStyle as appendStyle, + copyObject, + NODE_UID, + NODE_TAG, + NODE_LOOP +} from '../common' +import { useCanvas, useLayout, useResource, useTranslate } from '@opentiny/tiny-engine-controller' +export const POSITION = Object.freeze({ + TOP: 'top', + BOTTOM: 'bottom', + LEFT: 'left', + RIGHT: 'right', + IN: 'in', + FORBID: 'forbid' +}) +import { isVsCodeEnv } from '@opentiny/tiny-engine-common/js/environments' + +const initialDragState = { + keydown: false, + draging: false, + data: null, + position: null, // ghost位置 + mouse: null, // iframe里鼠标位置 + element: null, + offset: {} +} + +export const canvasState = shallowReactive({ + type: 'normal', + schema: null, + renderer: null, // 存放画布内的api + iframe: null, + loading: true, + current: null, + parent: null, + loopId: null +}) + +export const getContext = () => { + return getRenderer().getContext() +} + +// 记录拖拽状态 +export const dragState = reactive({ + ...initialDragState +}) + +export const initialRectState = { + top: 0, + height: 0, + width: 0, + left: 0, + schema: null, + configure: null, + componentName: '' +} + +const initialLineState = { + top: 0, + height: 0, + width: 0, + left: 0, + position: '', + id: '', + config: null +} + +// 选中画布中元素时的状态 +export const selectState = reactive({ + ...initialRectState +}) + +// 鼠标移入画布中元素时的状态 +export const hoverState = reactive({ + ...initialRectState +}) + +// 拖拽时的位置状态 +export const lineState = reactive({ + ...initialLineState +}) + +export const dragStart = ( + data, + element, + { offsetX = 0, offsetY = 0, horizontal, vertical, width, height, x, y } = {} +) => { + // 表示鼠标按下开始拖拽 + dragState.keydown = true + dragState.data = data || {} + + // 记录上次一开始拖拽的时间 + dragState.timer = Date.now() + + // 如果element存在表示在iframe内部拖拽 + dragState.element = element + dragState.offset = { offsetX, offsetY, horizontal, vertical, width, height, x, y } + clearHover() +} + +export const clearLineState = () => { + Object.assign(lineState, initialLineState) +} + +export const dragEnd = () => { + const { element, data } = dragState + + if (element && canvasState.type === 'absolute') { + data.props = data.props || {} + data.props.style = element.style.cssText + } + + // 重置拖拽状态 + Object.assign(dragState, initialDragState) + + // 重置拖拽插入位置状态 + clearLineState() + smoothScroll.stop() +} + +export const getOffset = (element) => { + if (element.ownerDocument === document) { + return { x: 0, y: 0 } + } + const { x, y, bottom, top } = canvasState.iframe.getBoundingClientRect() + return { x, y, bottom, top } +} + +export const getElement = (element) => { + // 如果当前元素是body + if (element === element.ownerDocument.body) { + return element + } + if (!element || element.nodeType !== 1) { + return undefined + } + + if (element.getAttribute(NODE_UID)) { + return element + } else if (element.parentElement) { + return getElement(element.parentElement) + } + + return undefined +} + +const inserAfter = ({ parent, node, data }) => { + const parentChildren = parent.children + const index = parentChildren.indexOf(node) + parent.children.splice(index + 1, 0, data) +} + +const insertBefore = ({ parent, node, data }) => { + const parentChildren = parent.children + const index = parentChildren.indexOf(node) + parent.children.splice(index, 0, data) +} + +const insertInner = ({ node, data }, position) => { + node.children = node.children || [] + + if (position === POSITION.TOP || position === POSITION.LEFT) { + node.children.unshift(data) + } else { + node.children.push(data) + } +} + +export const removeNode = ({ parent, node }) => { + const parentChildren = parent.children || parent.value + const index = parentChildren.indexOf(node) + + if (index > -1) { + parentChildren.splice(index, 1) + } else { + const templates = parentChildren.filter(({ componentName }) => componentName === 'Template') + + templates.forEach((template) => { + const { children } = template + + if (children.length) { + children.splice(children.indexOf(node), 1) + } + + if (!children.length) { + parentChildren.splice(parentChildren.indexOf(template), 1) + } + }) + } +} + +export const removeNodeById = (id) => { + if (!id) { + return + } + + removeNode(getNode(id, true)) + clearSelect() + getController().addHistory() + canvasState.emit('remove') +} + +export const insertNode = (node, position = POSITION.IN, select = true) => { + if (!node.parent) { + insertInner({ node: canvasState.schema, data: node.data }, position) + } else { + switch (position) { + case POSITION.TOP: + case POSITION.LEFT: + insertBefore(node) + break + case POSITION.BOTTOM: + case POSITION.RIGHT: + inserAfter(node) + break + case POSITION.IN: + insertInner(node) + break + default: + insertInner(node) + break + } + } + + select && setTimeout(() => selectNode(node.data.id)) + + getController().addHistory() +} + +export const addComponent = (data, position) => { + const { schema, parent } = getCurrent() + + insertNode({ node: schema, parent, data }, position) +} + +export const copyNode = (id) => { + if (!id) { + return + } + const { node, parent } = getNode(id, true) + + inserAfter({ parent, node, data: copyObject(node) }) + getController().addHistory() +} + +export const onMouseUp = ({ target }) => { + const { draging, data } = dragState + const { position } = lineState + const absolute = canvasState.type === 'absolute' + const sourceId = data?.id + const lineId = lineState.id + const allowInsert = position !== POSITION.FORBID + + if (draging && allowInsert) { + const { parent, node } = getNode(lineId, true) || {} // target + const targetNode = { parent, node, data: toRaw(data) } + + if (sourceId) { + // 内部拖拽 + if (sourceId !== lineId && !absolute) { + removeNode(getNode(sourceId, true)) + insertNode(targetNode, position) + } + } else { + // 从外部拖拽进来的无ID,insert + if (absolute) { + targetNode.node = getSchema() + data.props = data.props || {} + data.props.style = { + position: 'absolute', + top: dragState.mouse.y + 'px', + left: dragState.mouse.x + 'px' + } + } + + insertNode(targetNode, position) + } + } + + // 重置拖拽状态 + dragEnd() +} + +const smoothScroll = { + timmer: null, + /** + * + * @param {*} up 方向 + * @param {*} step 每次滚动距离 + * @param {*} time 滚动延时(不得大于系统滚动时长,否则可能出现卡顿效果) + */ + start(up, step = 40, time = 100) { + const dom = getDocument().documentElement + const fn = () => { + const top = up ? dom.scrollTop + step : dom.scrollTop - step + + dom.scrollTo({ top, behavior: 'smooth' }) + this.timmer = setTimeout(fn, time) + } + + this.timmer || fn() + }, + stop() { + clearTimeout(this.timmer) + this.timmer = null + } +} + +// 绝对布局 +const absoluteMove = (event, element) => { + const { clientX, clientY } = event + const { offsetX, offsetY, horizontal, vertical, height, width, x, y } = dragState.offset + + element.style.position = 'absolute' + + if (!horizontal) { + // 未传方向信息时判断为移动元素位置 + element.style.top = `${clientY - offsetY}px` + element.style.left = `${clientX - offsetX}px` + } else { + // 调整元素大小 + if (horizontal === 'start') { + element.style.left = `${clientX}px` + element.style.width = `${width + (x - clientX)}px` + } + + if (horizontal === 'end') { + element.style.width = `${clientX - x}px` + } + + if (vertical === 'start') { + element.style.top = `${clientY}px` + element.style.height = `${height + (y - clientY)}px` + } + + if (vertical === 'end') { + element.style.height = `${clientY - y}px` + } + } + updateRect() +} + +const setDragPosition = ({ clientX, x, clientY, y, offsetBottom, offsetTop }) => { + const left = clientX + x + const top = clientY + y + if (clientY < 20) { + smoothScroll.start(false) + } else if (offsetBottom - clientY - offsetTop < 20) { + smoothScroll.start(true) + } else { + smoothScroll.stop() + } + + dragState.position = { left, top } +} + +export const dragMove = (event, isHover) => { + if (!dragState.draging && dragState.keydown && new Date().getTime() - dragState.timer < 200) { + return + } + + const { x, y, bottom: offsetBottom, top: offsetTop } = getOffset(event.target) + const { clientX, clientY } = event + const { element } = dragState + const absolute = canvasState.type === 'absolute' + + dragState.draging = dragState.keydown + + dragState.mouse = { x: clientX, y: clientY } + + // 如果仅仅是mouseover事件直接return,并重置拖拽位置状态,优化性能 + if (isHover) { + lineState.position = '' + setHoverRect(getElement(event.target), null) + + return + } + + setHoverRect(getElement(event.target), dragState.data) + + if (dragState.draging) { + // 绝对布局时走的逻辑 + if (element && absolute) { + absoluteMove(event, element) + } + setDragPosition({ clientX, x, clientY, y, offsetBottom, offsetTop }) + } +} + +export const clearHover = () => { + Object.assign(hoverState, initialRectState, { slot: null }) +} + +export const clearSelect = () => { + canvasState.current = null + canvasState.parent = null + Object.assign(selectState, initialRectState) + // 临时借用 remote 事件出发 currentSchema 更新 + canvasState?.emit?.('remove') +} + +export const querySelectById = (id, type = '') => { + let selector = `[${NODE_UID}="${id}"]` + const doc = canvasState.iframe.contentDocument + let element = doc.querySelector(selector) + const loopId = element?.getAttribute('loop-id') + if (element && loopId) { + const currentLoopId = getCurrent().loopId + selector = `[${NODE_UID}="${id}"][${NODE_LOOP}="${currentLoopId}"]` + element = doc.querySelector(selector) + } + return element +} + +export const getCurrentElement = () => querySelectById(getCurrent().schema?.id) + +export const updateRect = (id) => { + id = (typeof id === 'string' && id) || getCurrent().schema?.id + clearHover() + + if (id) { + setTimeout(() => setSelectRect(querySelectById(id))) + } else { + clearSelect() + } +} +// type == clickTree, 为点击大纲; type == loop-id=xxx ,为点击循环数据 +export const selectNode = async (id, type) => { + if (type && type.indexOf('loop-id') > -1) { + const loopId = type.split('=')[1] + canvasState.loopId = loopId + } + const { node, parent } = getNode(id, true) || {} + let element = querySelectById(id, type) + + if (element) { + const { rootSelector } = getConfigure(node.componentName) + element = rootSelector ? element.querySelector(rootSelector) : element + } + + canvasState.current = node + canvasState.parent = parent + + await scrollToNode(element) + setSelectRect(element) + canvasState.emit('selected', node, parent, type) + + return node +} + +export const hoverNode = (id, data) => { + const element = querySelectById(id) + element && setHoverRect(element, data) +} + +export const scrollToNode = (element) => { + if (element) { + const container = getDocument().documentElement + const h = container?.clientHeight + const { y, height } = element.getBoundingClientRect() + + if (y < 0) { + container.scrollTo({ top: container.scrollTop + y - 15 }) + } else if (y > h) { + container.scrollTo({ top: y + height - h + 15 }) + } + } + + return nextTick() +} +const setSelectRect = (element) => { + element = element || getDocument().body + + const { left, height, top, width } = element.getBoundingClientRect() + const { x, y } = getOffset(element) + const componentName = getCurrent().schema?.componentName || '' + const scale = useLayout().getScale() + clearHover() + Object.assign(selectState, { + width: width * scale, + height: height * scale, + top: top * scale + y, + left: left * scale + x, + componentName + }) +} + +const isBodyEl = (element) => element.nodeName === 'BODY' + +const setHoverRect = (element, data) => { + if (!element) { + return clearHover() + } + const componentName = element.getAttribute(NODE_TAG) + const id = element.getAttribute(NODE_UID) + const configure = getConfigure(componentName) + const rect = element.getBoundingClientRect() + const { left, height, top, width } = rect + const { x, y } = getOffset(element) + const scale = useLayout().getScale() + + hoverState.configure = configure + + if (data) { + let childEle = null + lineState.id = id + lineState.configure = configure + const rectType = isBodyEl(element) ? POSITION.IN : getPosLine(rect, configure).type + + // 如果拖拽经过的元素是body或者是带有容器属性的盒子,并且在元素内部插入,则需要特殊处理 + if ((isBodyEl(element) || configure?.isContainer) && rectType === POSITION.IN) { + const { node } = isBodyEl(element) ? { node: getSchema() } : getNode(id, true) || {} + const children = node?.children || [] + if (children.length > 0) { + // 如果容器盒子有子节点,则以最后一个子节点为拖拽参照物 + const lastNode = children[children.length - 1] + childEle = querySelectById(lastNode.id) + const childComponentName = element.getAttribute(childEle) + const Childconfigure = getConfigure(childComponentName) + lineState.id = lastNode.id + lineState.configure = Childconfigure + } + } + + // 如果容器盒子有子元素 + if (childEle) { + const childRect = childEle.getBoundingClientRect() + const { left, height, top, width } = childRect + const { x, y } = getOffset(childEle) + Object.assign(lineState, { + width: width * scale, + height: height * scale, + top: top * scale + y, + left: left * scale + x, + position: canvasState.type === 'absolute' || getPosLine(childRect, lineState.configure).type + }) + } else { + Object.assign(lineState, { + width: width * scale, + height: height * scale, + top: top * scale + y, + left: left * scale + x, + position: canvasState.type === 'absolute' || getPosLine(rect, configure).type + }) + } + + useLayout().closePlugin() + } + + // 设置元素hover状态 + Object.assign(hoverState, { + width: width * scale, + height: height * scale, + top: top * scale + y, + left: left * scale + x, + componentName + }) + return undefined +} + +/** + * 是否允许插入 + * @param {*} configure 当前放置目标的 configure,比如getConfigure(componentName) + * @param {*} data 当前插入目标的schame数据 + * @returns + */ +export const allowInsert = (configure = hoverState.configure || {}, data = dragState.data || {}) => { + const { nestingRule = {} } = configure + const { childWhitelist = [], descendantBlacklist = [] } = nestingRule + + // 要插入的父节点必须是容器 + if (!configure.isContainer) { + return false + } + + let flag = true + // 白名单 + flag = childWhitelist.length ? childWhitelist.includes(data?.componentName) : true + + // 黑名单 + if (descendantBlacklist.length) { + flag = !descendantBlacklist.includes(data?.componentName) + } + + return flag +} + +export const getConfigure = (targetName) => { + const material = getController().getMaterial(targetName) + + // 这里如果是区块插槽,则返回标识为容器的对象 + if (targetName === 'Template') { + return { + isContainer: true + } + } + + return material?.content?.configure || material.configure || {} +} + +// 获取位置信息,返回状态 +const lineAbs = 20 +const getPosLine = (rect, configure) => { + const mousePos = dragState.mouse + const yAbs = Math.min(lineAbs, rect.height / 3) + const xAbs = Math.min(lineAbs, rect.width / 3) + let type + + if (mousePos.y < rect.top + yAbs) { + type = POSITION.TOP + } else if (mousePos.y > rect.bottom - yAbs) { + type = POSITION.BOTTOM + } else if (mousePos.x < rect.left + xAbs) { + type = POSITION.LEFT + } else if (mousePos.x > rect.right - xAbs) { + type = POSITION.RIGHT + } else if (configure.isContainer) { + type = allowInsert() ? POSITION.IN : POSITION.FORBID + } else { + type = POSITION.BOTTOM + } + + return { type } +} + +export const setPageCss = (css = '') => { + const id = 'page-css' + const document = getDocument() + let element = document.getElementById(id) + const head = document.querySelector('head') + + document.body.setAttribute('style', '') + + if (!element) { + element = document.createElement('style') + element.setAttribute('type', 'text/css') + element.setAttribute('id', id) + + element.innerHTML = css + head.appendChild(element) + } else { + element.innerHTML = css + } +} + +export const addStyle = (href) => appendStyle(href, getDocument()) + +export const addScript = (src) => appendScript(src, getDocument()) + +/** + * + * @param {*} messages + * @param {*} merge 是否合并,默认是重置所有数据 + */ +export const setLocales = (messages, merge) => { + const i18n = getRenderer().getI18n() + + Object.keys(messages).forEach((lang) => { + const fn = merge ? 'mergeLocaleMessage' : 'setLocaleMessage' + i18n.global[fn](lang, messages[lang]) + }) +} + +export const setState = (state) => { + getRenderer().setState(state) +} + +export const setUtils = (utils, clear, isForceRefresh) => { + getRenderer().setUtils(utils, clear, isForceRefresh) +} + +export const updateUtils = (utils) => { + getRenderer().updateUtils(utils) +} + +export const deleteUtils = (utils) => { + getRenderer().deleteUtils(utils) +} + +export const deleteState = (variable) => { + getRenderer().deleteState(variable) +} + +export const setGlobalState = (state) => { + useResource().resState.globalState = state + getRenderer().setGlobalState(state) +} + +export const getGlobalState = () => getRenderer().getGlobalState() + +export const getRenderer = () => canvasState.renderer + +export const getController = () => canvasState.controller + +export const getNode = (id, parent) => getRenderer()?.getNode(id, parent) + +export const getDocument = () => canvasState.iframe.contentDocument + +export const getWindow = () => canvasState.iframe.contentWindow + +export const getCurrent = () => { + return { + schema: canvasState.current, + parent: canvasState.parent, + loopId: canvasState.loopId + } +} + +export const getNodePath = (id, nodes = []) => { + const { parent, node } = getNode(id, true) || {} + + node && nodes.unshift({ name: node.componentName, node: id }) + + if (parent) { + parent && getNodePath(parent.id, nodes) + } else { + nodes.unshift({ name: 'BODY', node: id }) + } + + return nodes +} + +export const setSchema = async (schema) => { + clearHover() + clearSelect() + canvasState.schema = await getRenderer()?.setSchema(schema) + + return canvasState.schema +} + +export const getSchema = () => getRenderer()?.getSchema() + +export const setConfigure = (configure) => { + getRenderer().setConfigure(configure) +} + +export const setProps = (data) => getRenderer()?.setProps(data) + +export const setI18n = (data) => { + const messages = data || useTranslate().getData() + const i18n = getRenderer().getI18n() + Object.keys(messages).forEach((lang) => { + i18n.global.mergeLocaleMessage(lang, messages[lang]) + }) +} + +export const setCanvasType = (type) => { + canvasState.type = type || 'normal' + getDocument().body.className = type === 'absolute' ? 'canvas-grid-bg' : '' +} + +export const getCanvasType = () => canvasState.type + +/** + * 画布派发事件 + * @param {string} name 事件名称 + * @param {any} data 派发的数据 + */ +export const canvasDispatch = (name, data, doc = getDocument()) => { + if (!doc) return + + doc.dispatchEvent(new CustomEvent(name, data)) +} + +export const initCanvas = ({ renderer, iframe, emit, controller }) => { + const currentSchema = getSchema() + + // 在点击刷新按钮的情况下继续保留最新的schema.json + const schema = currentSchema ? currentSchema : useCanvas().getPageSchema() + + canvasState.iframe = iframe + canvasState.emit = emit + // 存放画布外层传进来的插件api + canvasState.controller = controller + canvasState.renderer = renderer + renderer.setController(controller) + setLocales(useTranslate().getData(), true) + if (isVsCodeEnv) { + const parent = window.parent + const senterMessage = parent.postMessage + // 发消息给webview + senterMessage({ type: 'i18nReady', value: true }, '*') + } + + setGlobalState(useResource().resState.globalState) + renderer.setDataSourceMap(useResource().resState.dataSource) + // 设置画布全局的utils工具类上下文环境 + setUtils(useResource().resState.utils) + setSchema(schema) + setConfigure(useResource().getConfigureMap()) + canvasDispatch('updateDependencies', { detail: useResource().resState.thirdPartyDeps }) + canvasState.loading = false +} diff --git a/dl-flow-frontend/packages/canvas/src/components/container/keyboard.js b/dl-flow-frontend/packages/canvas/src/components/container/keyboard.js new file mode 100644 index 0000000..3ac5242 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/keyboard.js @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { + getCurrent, + insertNode, + selectNode, + getSchema, + POSITION, + removeNodeById, + allowInsert, + getConfigure, + clearHover, + hoverState +} from './container' +import { useHistory } from '@opentiny/tiny-engine-controller' +import { copyObject, getClipboardSchema, setClipboardSchema } from '../common' + +const KEY_Y = 89 +const KEY_Z = 90 +const KEY_RIGHT = 39 +const KEY_LEFT = 37 +const KEY_UP = 38 +const KEY_DOWN = 40 +const KEY_DEL = 46 + +function handlerLeft({ parent }) { + selectNode(parent?.id) +} +function handlerRight({ schema }) { + const id = schema.children?.[0]?.id + id && selectNode(id) +} +function handlerUp({ index, parent }) { + const id = (parent.children[index - 1] || parent)?.id + id && selectNode(id) +} +function handlerDown({ index, parent }) { + const id = parent.children[index + 1]?.id + id && selectNode(id) +} +function handlerDelete({ schema }) { + if (hoverState.id === schema.id) { + clearHover() + } + removeNodeById(schema.id) +} + +const handlerArrow = (keyCode) => { + let { schema, parent } = getCurrent() + let index = null + + if (schema) { + index = parent.children.indexOf(schema) + } else { + schema = getSchema() + } + + let obj = { + [KEY_LEFT]: handlerLeft, + [KEY_RIGHT]: handlerRight, + [KEY_UP]: handlerUp, + [KEY_DOWN]: handlerDown, + [KEY_DEL]: handlerDelete + } + if (obj[keyCode]) { + obj[keyCode]({ index, schema, parent }) + } +} + +const handlerCtrl = (keyCode) => { + switch (keyCode) { + case KEY_Y: + useHistory().forward() + break + case KEY_Z: + useHistory().back() + break + default: + break + } +} + +const handleClipboardCut = (event, schema) => { + if (setClipboardSchema(event, copyObject(schema))) { + removeNodeById(schema?.id) + } +} + +const handleClipboardPaste = (node, schema, parent) => { + if (node?.componentName && schema?.componentName && allowInsert(getConfigure(schema.componentName), node)) { + insertNode({ parent, node: schema, data: { ...node } }, POSITION.IN) + } +} + +const handlerClipboardEvent = (event) => { + const { schema, parent } = getCurrent() + const node = getClipboardSchema(event) + switch (event.type) { + case 'copy': + setClipboardSchema(event, copyObject(schema)) + break + case 'paste': + handleClipboardPaste(node, schema, parent) + break + case 'cut': + handleClipboardCut(event, schema) + break + default: + break + } +} + +const keyboardHandler = (event) => { + if (event.ctrlKey) { + getCurrent()?.schema && handlerCtrl(event.keyCode) + } + + handlerArrow(event.keyCode) +} + +const removeHostkeyEvent = (dom) => { + dom.removeEventListener('keydown', keyboardHandler) + dom.removeEventListener('copy', handlerClipboardEvent) + dom.removeEventListener('cut', handlerClipboardEvent) + dom.removeEventListener('paste', handlerClipboardEvent) +} + +const registerHostkeyEvent = (dom) => { + removeHostkeyEvent(dom) + + dom.addEventListener('keydown', keyboardHandler) + dom.addEventListener('copy', handlerClipboardEvent) + dom.addEventListener('cut', handlerClipboardEvent) + dom.addEventListener('paste', handlerClipboardEvent) +} + +export { registerHostkeyEvent, removeHostkeyEvent } diff --git a/dl-flow-frontend/packages/canvas/src/components/container/shortCutPopover.vue b/dl-flow-frontend/packages/canvas/src/components/container/shortCutPopover.vue new file mode 100644 index 0000000..1bfda8c --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/shortCutPopover.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/container/x6.js b/dl-flow-frontend/packages/canvas/src/components/container/x6.js new file mode 100644 index 0000000..a098320 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/container/x6.js @@ -0,0 +1,193 @@ +import { Graph, Path } from '@antv/x6' +import { register } from '@antv/x6-vue-shape' +import AlgoNode from './AlgoNode.vue' +/** + * + * @param {`in-${string}` | `out-${string}`} a + * @param {`in-${string}` | `out-${string}`} b + */ +/** @type {Graph | undefined} */ +let g +/** @type {import('@antv/x6').Graph.Options} */ +const DEFAULT_OPTION = { + background: { + color: '#F2F7FA' + }, + grid: { + visible: true, + type: 'doubleMesh', + args: [ + { + color: '#eee', + thickness: 1 + }, + { + color: '#ddd', + thickness: 1, + factor: 4 + } + ] + }, + panning: true, + mousewheel: { + enabled: true, + modifiers: 'Ctrl', + maxScale: 4, + minScale: 0.2 + }, + autoResize: true, + connecting: { + snap: true, + allowBlank: false, + allowLoop: false, + highlight: true, + allowNode: false, + connector: 'algo-connector', + connectionPoint: 'anchor', + anchor: 'center', + validateMagnet(args) { + const { magnet } = args + return magnet.getAttribute('port-group') !== 'top' + }, + createEdge() { + return g.createEdge({ + shape: 'dag-edge', + attrs: { + line: { + strokeDasharray: '5 5' + } + }, + zIndex: -1 + }) + }, + validateEdge(args) { + const { + edge: { source, target } + } = args + return ( + (source.port.includes('in') && target.port.includes('out')) || + (source.port.includes('out') && target.port.includes('in')) + ) + } + } +} +let ready = false +const graphPreapre = () => { + if (ready) { + return ready + } + Graph.registerEdge( + 'dag-edge', + { + inherit: 'edge', + attrs: { + line: { + stroke: '#C2C8D5', + strokeWidth: 1, + targetMarker: null + } + } + }, + true + ) + register({ + shape: 'dag-node', + width: 180, + height: 36, + component: AlgoNode, + ports: { + groups: { + top: { + position: 'top', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#C2C8D5', + strokeWidth: 1, + fill: '#fff' + } + } + }, + bottom: { + position: 'bottom', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#C2C8D5', + strokeWidth: 1, + fill: '#fff' + } + } + } + } + } + }) + Graph.registerConnector( + 'algo-connector', + (s, e) => { + const offset = 4 + const deltaY = Math.abs(e.y - s.y) + const control = Math.floor((deltaY / 3) * 2) + + const v1 = { x: s.x, y: s.y + offset + control } + const v2 = { x: e.x, y: e.y - offset - control } + + return Path.normalize( + `M ${s.x} ${s.y} + L ${s.x} ${s.y + offset} + C ${v1.x} ${v1.y} ${v2.x} ${v2.y} ${e.x} ${e.y - offset} + L ${e.x} ${e.y} + ` + ) + }, + true + ) + // TODO: 从后端获取node + ready = true + return ready +} + +/** + * + * @param {string} id + * @param {Partial} option + * @returns {Graph} + */ +export const useX6 = (id, option) => { + if (g) { + return g + } + + if (!graphPreapre()) { + throw new Error('出现未知错误') + } + g = new Graph({ + container: document.getElementById(id), + ...{ + ...option, + ...DEFAULT_OPTION + } + }) + return g +} + +/** + * + * @returns {Graph | null} + */ +export const getX6 = () => g + +/** + * @param {string} name + * @returns {import('@antv/x6').Node | undefined} + */ +export const addNode = (name) => { + const x6 = getX6() + if (!x6) { + return + } + const node = x6.addNode(name) + return node +} diff --git a/dl-flow-frontend/packages/canvas/src/components/render/CanvasEmpty.vue b/dl-flow-frontend/packages/canvas/src/components/render/CanvasEmpty.vue new file mode 100644 index 0000000..c6dc2c4 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/render/CanvasEmpty.vue @@ -0,0 +1,14 @@ + + + diff --git a/dl-flow-frontend/packages/canvas/src/components/render/RenderMain.js b/dl-flow-frontend/packages/canvas/src/components/render/RenderMain.js new file mode 100644 index 0000000..532821b --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/render/RenderMain.js @@ -0,0 +1,423 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { h, provide, inject, nextTick, shallowReactive, reactive, ref, watch, watchEffect } from 'vue' +import { I18nInjectionKey } from 'vue-i18n' +import { useBroadcastChannel } from '@vueuse/core' +import { constants } from '@opentiny/tiny-engine-utils' +import { generateFunction } from '@opentiny/tiny-engine-controller/utils' +import renderer, { parseData, setConfigure, setController, globalNotify, isStateAccessor } from './render' +import { getNode as getNodeById, clearNodes, getRoot, setContext, getContext, setCondition, context } from './context' +import CanvasEmpty from './CanvasEmpty.vue' + +const { BROADCAST_CHANNEL } = constants + +const reset = (obj) => { + Object.keys(obj).forEach((key) => delete obj[key]) +} + +const refreshKey = ref(0) +const methods = {} +const schema = reactive({}) +const state = shallowReactive({}) +const bridge = {} +const utils = {} +const props = {} + +const globalState = ref([]) +const stores = shallowReactive({}) +const dataSourceMap = shallowReactive({}) + +const Func = Function + +watchEffect(() => { + reset(stores) + globalState.value.forEach(({ id, state = {}, getters = {} }) => { + const computedGetters = Object.keys(getters).reduce( + (acc, key) => ({ + ...acc, + [key]: new Func('return ' + getters[key].value)().call(acc, state) + }), + {} + ) + + stores[id] = { ...state, ...computedGetters } + }) +}) + +const getUtils = () => utils + +const setUtils = (data, clear, isForceRefresh) => { + if (clear) { + reset(utils) + } + const utilsCollection = {} + // 目前画布还不具备远程加载utils工具类的功能,目前只能加载TinyVue组件库中的组件工具 + data?.forEach((item) => { + const util = window.TinyVue[item.content.exportName] + if (util) { + utilsCollection[item.name] = util + } + + // 此处需要把工具类中的icon图标也加入utils上下文环境 + const utilIcon = window.TinyVueIcon[item.content.exportName] + if (utilIcon) { + utilsCollection[item.name] = utilIcon + } + + // 解析函数式的工具类 + if (item.type === 'function') { + const defaultFn = () => {} + utilsCollection[item.name] = generateFunction(item.content.value, context) || defaultFn + } + }) + Object.assign(utils, utilsCollection) + + // 因为工具类并不具有响应式行为,所以需要通过修改key来强制刷新画布 + if (isForceRefresh) { + refreshKey.value++ + } +} + +const updateUtils = (data) => { + setUtils(data, false, true) +} + +const deleteUtils = (data) => { + data?.forEach((item) => { + if (utils[item.name]) { + delete utils[item.name] + } + }) + setUtils([], false, true) +} + +const setBridge = (data, clear) => { + clear && reset(bridge) + Object.assign(bridge, data) +} + +const getBridge = () => bridge + +const getMethods = () => methods + +const setMethods = (data = {}, clear) => { + clear && reset(methods) + // 这里有些方法在画布还是有执行的必要的,比如说表格的renderer和formatText方法,包括一些自定义渲染函数 + Object.assign( + methods, + Object.fromEntries( + Object.keys(data).map((key) => { + return [key, parseData(data[key], {}, getContext())] + }) + ) + ) + setContext(methods) +} + +const getState = () => state + +const deleteState = (variable) => { + delete state[variable] +} + +const generateAccessor = (type, accessor, property) => { + const accessorFn = generateFunction(accessor[type].value, context) + + return { property, accessorFn, type } +} + +// 这里缓存状态变量对应的访问器,用于watchEffect更新和取消监听 +const stateAccessorMap = new Map() + +// 缓存区块属性的访问器 +const propsAccessorMap = new Map() + +const generateStateAccessors = (type, accessor, key) => { + const stateWatchEffectKey = `${key}${type}` + const { property, accessorFn } = generateAccessor(type, accessor, key) + + // 将之前已有的watchEffect取消监听,这里操作很有必要,不然会造成数据混乱 + stateAccessorMap.get(stateWatchEffectKey)?.() + + // 更新watchEffect监听 + stateAccessorMap.set( + stateWatchEffectKey, + watchEffect(() => { + try { + accessorFn() + } catch (error) { + globalNotify({ + type: 'warning', + title: `状态变量${property}的访问器函数:${accessorFn.name}执行报错`, + message: error?.message || `状态变量${property}的访问器函数:${accessorFn.name}执行报错,请检查语法` + }) + } + }) + ) +} + +const setState = (data, clear) => { + clear && reset(state) + if (!schema.state) { + schema.state = data + } + + Object.assign(state, parseData(data, {}, getContext()) || {}) + + // 在状态变量合并之后,执行访问器中watchEffect,为了可以在访问器函数中可以访问其他state变量 + Object.entries(data || {})?.forEach(([key, stateData]) => { + if (isStateAccessor(stateData)) { + const accessor = stateData.accessor + if (accessor?.getter?.value) { + generateStateAccessors('getter', accessor, key) + } + + if (accessor?.setter?.value) { + generateStateAccessors('setter', accessor, key) + } + } + }) +} + +const getDataSourceMap = () => { + return dataSourceMap.value +} + +const setDataSourceMap = (list) => { + dataSourceMap.value = list.reduce((dMap, config) => { + const dataSource = { config: config.data } + + const result = { + code: '', + msg: 'success', + data: {} + } + result.data = + dataSource.config.type === 'array' + ? { items: dataSource?.config?.data, total: dataSource?.config?.data?.length } + : dataSource?.config?.data + + dataSource.load = () => Promise.resolve(result) + dMap[config.name] = dataSource + + return dMap + }, {}) +} + +const getGlobalState = () => { + return globalState.value +} + +const setGlobalState = (data = []) => { + globalState.value = data +} + +const setProps = (data, clear) => { + clear && reset(props) + Object.assign(props, data) +} + +const getProps = () => props + +const initProps = (properties = []) => { + const props = {} + const accessorFunctions = [] + + properties.forEach(({ content = [] }) => { + content.forEach(({ defaultValue, property, accessor }) => { + // 如果没有设置defaultValue就是undefined这和vue处理方式一样 + props[property] = defaultValue + + // 如果区块属性有访问器accessor,则先解析getter和setter函数 + if (accessor?.getter?.value) { + // 此处不能直接执行watchEffect,需要在上下文环境设置好之后去执行,此处只是收集函数 + accessorFunctions.push(generateAccessor('getter', accessor, property)) + } + + if (accessor?.setter?.value) { + accessorFunctions.push(generateAccessor('setter', accessor, property)) + } + }) + }) + + setProps(props, true) + + return accessorFunctions +} + +const getSchema = () => schema + +const setPagecss = (css = '') => { + const id = 'page-css' + let element = document.getElementById(id) + const head = document.querySelector('head') + + document.body.setAttribute('style', '') + + if (!element) { + element = document.createElement('style') + element.setAttribute('type', 'text/css') + element.setAttribute('id', id) + + element.innerHTML = css + head.appendChild(element) + } else { + element.innerHTML = css + } +} + +const setSchema = async (data) => { + const newSchema = JSON.parse(JSON.stringify(data || schema)) + reset(schema) + // 页面初始化的时候取消所有状态变量的watchEffect监听 + stateAccessorMap.forEach((stateAccessorFn) => { + stateAccessorFn() + }) + + // 区块初始化的时候取消所有的区块属性watchEffect监听 + propsAccessorMap.forEach((propsAccessorFn) => { + propsAccessorFn() + }) + + // 清空存状态变量和区块props访问器的缓存 + stateAccessorMap.clear() + propsAccessorMap.clear() + + const context = { + utils, + bridge, + stores, + state, + props, + dataSourceMap: {}, + emit: () => {} // 兼容访问器中getter和setter中this.emit写法 + } + Object.defineProperty(context, 'dataSourceMap', { + get: getDataSourceMap + }) + // 此处提升很重要,因为setState、initProps也会触发画布重新渲染,所以需要提升上下文环境的设置时间 + setContext(context, true) + + // 设置方法调用上下文 + setMethods(newSchema.methods, true) + + // 如果是区块则需要设置对外暴露的props + const accessorFunctions = initProps(newSchema.schema?.properties) + + // 这里setState(会触发画布渲染),是因为状态管理里面的变量会用到props、utils、bridge、stores、methods + setState(newSchema.state, true) + clearNodes() + await nextTick() + setPagecss(data.css) + Object.assign(schema, newSchema) + + // 当上下文环境设置完成之后再去处理区块属性访问器的watchEffect + accessorFunctions.forEach(({ property, accessorFn, type }) => { + const propsWatchEffectKey = `${property}${type}` + propsAccessorMap.set( + propsWatchEffectKey, + watchEffect(() => { + try { + accessorFn() + } catch (error) { + globalNotify({ + type: 'warning', + title: `区块属性${property}的访问器函数:${accessorFn.name}执行报错`, + message: error?.message || `区块属性${property}的访问器函数:${accessorFn.name}执行报错,请检查语法` + }) + } + }) + ) + }) + + return schema +} + +const getNode = (id, parent) => (id ? getNodeById(id, parent) : schema) + +export default { + setup() { + provide('rootSchema', schema) + + const { locale } = inject(I18nInjectionKey).global + const { data } = useBroadcastChannel({ name: BROADCAST_CHANNEL.CanvasLang }) + const { post } = useBroadcastChannel({ name: BROADCAST_CHANNEL.SchemaLength }) + + watch(data, () => { + locale.value = data.value + }) + + watch( + () => schema?.children?.length, + (length) => { + post(length) + } + ) + + // 这里监听schema.methods,为了保证methods上下文环境始终为最新 + watch( + () => schema.methods, + (value) => { + setMethods(value, true) + }, + { + deep: true + } + ) + }, + render() { + return h( + 'tiny-i18n-host', + { + locale: 'zh_CN', + key: refreshKey.value, + ref: 'page', + className: 'design-page' + }, + schema.children?.length + ? schema.children.map((child) => h(renderer, { schema: child, parent: schema })) + : [h(CanvasEmpty)] + ) + } +} + +export const api = { + getUtils, + setUtils, + updateUtils, + deleteUtils, + getBridge, + setBridge, + getMethods, + setMethods, + setController, + setConfigure, + getSchema, + setSchema, + getState, + deleteState, + setState, + getProps, + setProps, + getContext, + getNode, + getRoot, + setPagecss, + setCondition, + getGlobalState, + getDataSourceMap, + setDataSourceMap, + setGlobalState +} + +window.api = api diff --git a/dl-flow-frontend/packages/canvas/src/components/render/context.js b/dl-flow-frontend/packages/canvas/src/components/render/context.js new file mode 100644 index 0000000..96b8ca6 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/render/context.js @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { shallowReactive } from 'vue' +import { utils } from '@opentiny/tiny-engine-utils' + +export const context = shallowReactive({}) + +// 从大纲树控制隐藏 +export const conditions = shallowReactive({}) + +const nodes = {} + +export const setNode = (schema, parent) => { + schema.id = schema.id || utils.guid() + nodes[schema.id] = { node: schema, parent } +} + +export const getNode = (id, parent) => { + return parent ? nodes[id] : nodes[id].node +} + +export const delNode = (id) => delete nodes[id] + +export const clearNodes = () => { + Object.keys(nodes).forEach(delNode) +} + +export const getRoot = (id) => { + const { parent } = getNode(id, true) + + return parent?.id ? getRoot(parent.id) : parent +} + +export const setContext = (ctx, clear) => { + clear && Object.keys(context).forEach((key) => delete context[key]) + Object.assign(context, ctx) +} + +export const getContext = () => context + +export const setCondition = (id, visible = false) => { + conditions[id] = visible +} diff --git a/dl-flow-frontend/packages/canvas/src/components/render/render.js b/dl-flow-frontend/packages/canvas/src/components/render/render.js new file mode 100644 index 0000000..cb94380 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/render/render.js @@ -0,0 +1,720 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { h, provide, reactive } from 'vue' +import { isHTMLTag, hyphenate } from '@vue/shared' +import { useBroadcastChannel } from '@vueuse/core' +import { constants, utils } from '@opentiny/tiny-engine-utils' +import babelPluginJSX from '@vue/babel-plugin-jsx' +import { transformSync } from '@babel/core' +import i18nHost from '@opentiny/tiny-engine-i18n-host' +import { CanvasRow, CanvasCol, CanvasRowColContainer } from '@opentiny/tiny-engine-builtin-component' +import { context, conditions, setNode } from './context' +import { + CanvasBox, + CanvasCollection, + CanvasIcon, + CanvasText, + CanvasSlot, + CanvasImg, + CanvasPlaceholder +} from '../builtin' +import { NODE_UID as DESIGN_UIDKEY, NODE_TAG as DESIGN_TAGKEY, NODE_LOOP as DESIGN_LOOPID } from '../common' + +const { BROADCAST_CHANNEL } = constants +const { hyphenateRE } = utils +const customElements = {} + +const transformJSX = (code) => { + const res = transformSync(code, { + plugins: [ + [ + babelPluginJSX, + { + pragma: 'h', + isCustomElement: (name) => customElements[name] + } + ] + ] + }) + return (res.code || '') + .replace(/import \{.+\} from "vue";/, '') + .replace(/h\(_?resolveComponent\((.*?)\)/g, `h(this.getComponent($1)`) + .replace(/_?resolveComponent/g, 'h') + .replace(/_?createTextVNode\((.*?)\)/g, '$1') + .trim() +} + +export const blockSlotDataMap = reactive({}) + +const Mapper = { + Icon: CanvasIcon, + Text: CanvasText, + Collection: CanvasCollection, + div: CanvasBox, + Slot: CanvasSlot, + slot: CanvasSlot, + Template: CanvasBox, + Img: CanvasImg, + CanvasRow, + CanvasCol, + CanvasRowColContainer, + CanvasPlaceholder +} + +const { post } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) + +// 此处向外层window传递notify配置参数 +export const globalNotify = (options) => post(options) + +export const collectionMethodsMap = {} + +const getNative = (name) => { + return window.TinyLowcodeComponent?.[name] +} + +const getBlock = (name) => { + return window.blocks?.[name] +} + +const configure = {} +const controller = {} + +export const setConfigure = (configureData) => { + Object.assign(configure, configureData) +} + +export const setController = (controllerData) => { + Object.assign(controller, controllerData) +} + +export const getController = () => controller + +const isI18nData = (data) => { + return data && data.type === 'i18n' +} + +const isJSSlot = (data) => { + return data && data.type === 'JSSlot' +} + +const isJSExpression = (data) => { + return data && data.type === 'JSExpression' +} + +const isJSFunction = (data) => { + return data && data.type === 'JSFunction' +} + +const isJSResource = (data) => { + return data && data.type === 'JSResource' +} + +const isString = (data) => { + return typeof data === 'string' +} + +const isArray = (data) => { + return Array.isArray(data) +} + +const isFunction = (data) => { + return typeof data === 'function' +} + +const isObject = (data) => { + return typeof data === 'object' +} + +// 判断是否是状态访问器 +export const isStateAccessor = (stateData) => + stateData?.accessor?.getter?.type === 'JSFunction' || stateData?.accessor?.setter?.type === 'JSFunction' + +// 规避创建function eslint报错 +export const newFn = (...argv) => { + const Fn = Function + return new Fn(...argv) +} + +const parseExpression = (data, scope, ctx, isJsx = false) => { + try { + if (data.value.indexOf('this.i18n') > -1) { + ctx.i18n = i18nHost.global.t + } else if (data.value.indexOf('t(') > -1) { + ctx.t = i18nHost.global.t + } + + const expression = isJsx ? transformJSX(data.value) : data.value + return newFn('$scope', `with($scope || {}) { return ${expression} }`).call(ctx, { + ...ctx, + ...scope, + slotScope: scope + }) + } catch (err) { + // 解析抛出异常,则再尝试解析 JSX 语法。如果解析 JSX 语法仍然出现错误,isJsx 变量会确保不会再次递归执行解析 + if (!isJsx) { + return parseExpression(data, scope, ctx, true) + } + return undefined + } +} + +const parseI18n = (i18n, scope, ctx) => { + return parseExpression( + { + type: 'JSExpression', + value: `this.i18n('${i18n.key}', ${JSON.stringify(i18n.params)})` + }, + scope, + { i18n: i18nHost.global.t, ...ctx } + ) +} + +const renderDefault = (children, scope, parent) => + children.map?.((child) => + // eslint-disable-next-line no-use-before-define + h(renderer, { + schema: child, + scope, + parent + }) + ) + +const parseJSSlot = (data, scope) => { + return ($scope) => renderDefault(data.value, { ...scope, ...$scope }, data) +} + +export const generateFn = (innerFn, context) => { + return (...args) => { + // 如果有数据源标识,则表格的fetchData返回数据源的静态数据 + const sourceId = collectionMethodsMap[innerFn.realName || innerFn.name] + if (sourceId) { + return innerFn.call(context, ...args) + } else { + let result = null + + // 这里是为了兼容用户写法报错导致画布异常,但无法捕获promise内部的异常 + try { + result = innerFn.call(context, ...args) + } catch (error) { + globalNotify({ + type: 'warning', + title: `函数:${innerFn.name}执行报错`, + message: error?.message || `函数:${innerFn.name}执行报错,请检查语法` + }) + } + + // 这里注意如果innerFn返回的是一个promise则需要捕获异常,重新返回默认一条空数据 + if (result.then) { + result = new Promise((resolve) => { + result.then(resolve).catch((error) => { + globalNotify({ + type: 'warning', + title: '异步函数执行报错', + message: error?.message || '异步函数执行报错,请检查语法' + }) + // 这里需要至少返回一条空数据,方便用户使用表格默认插槽 + resolve({ + result: [{}], + page: { total: 1 } + }) + }) + }) + } + + return result + } + } +} + +// 解析函数字符串结构 +const parseFunctionString = (fnStr) => { + const fnRegexp = /(async)?.*?(\w+) *\(([\s\S]*?)\) *\{([\s\S]*)\}/ + const result = fnRegexp.exec(fnStr) + if (result) { + return { + type: result[1] || '', + name: result[2], + params: result[3] + .split(',') + .map((item) => item.trim()) + .filter((item) => Boolean(item)), + body: result[4] + } + } + return null +} + +const getPlainProps = (object = {}) => { + const { slot, ...rest } = object + const props = {} + + if (slot) { + rest.slot = slot.name || slot + } + + Object.entries(rest).forEach(([key, value]) => { + let renderKey = key + + // html 标签属性会忽略大小写,所以传递包含大写的 props 需要转换为 kebab 形式的 props + if (!/on[A-Z]/.test(renderKey) && hyphenateRE.test(renderKey)) { + renderKey = hyphenate(renderKey) + } + + if (['boolean', 'string', 'number'].includes(typeof value)) { + props[renderKey] = value + } else { + // 如果传给webcomponent标签的是对象或者数组需要使用.prop修饰符,转化成h函数就是如下写法 + props[`.${renderKey}`] = value + } + }) + return props +} + +const generateCollection = (schema) => { + if (schema.componentName === 'Collection' && schema.props?.dataSource && schema.children) { + schema.children.forEach((item) => { + const fetchData = item.props?.fetchData + const methodMatch = fetchData?.value?.match(/this\.(.+?)}/) + if (fetchData && methodMatch?.[1]) { + const methodName = methodMatch[1].trim() + // 缓存表格fetchData对应的数据源信息 + collectionMethodsMap[methodName] = schema.props.dataSource + } + }) + } +} + +const generateBlockContent = (schema) => { + if (schema?.componentName === 'Collection') { + generateCollection(schema) + } + if (Array.isArray(schema?.children)) { + schema.children.forEach((item) => { + generateBlockContent(item) + }) + } +} + +const registerBlock = (componentName) => { + getController() + .registerBlock?.(componentName) + .then((res) => { + const blockSchema = res.content + + // 拿到区块数据,建立区块中数据源的映射关系 + generateBlockContent(blockSchema) + + // 如果区块的根节点有百分比高度,则需要特殊处理,把高度百分比传递下去,适配大屏应用 + if (/height:\s*?[\d|.]+?%/.test(blockSchema?.props?.style)) { + const blockDoms = document.querySelectorAll(hyphenate(componentName)) + blockDoms.forEach((item) => { + item.style.height = '100%' + }) + } + }) +} + +export const wrapCustomElement = (componentName) => { + const material = getController().getMaterial(componentName) + + if (!Object.keys(material).length) { + registerBlock(componentName) + } + + customElements[componentName] = { + name: componentName + '.ce', + render() { + return h( + hyphenate(componentName), + window.parent.TinyGlobalConfig.dslMode === 'Vue' ? getPlainProps(this.$attrs) : this.$attrs, + this.$slots.default?.() + ) + } + } + + return customElements[componentName] +} + +export const getComponent = (name) => { + return ( + Mapper[name] || + getNative(name) || + getBlock(name) || + customElements[name] || + (isHTMLTag(name) ? name : wrapCustomElement(name)) + ) +} + +// 解析JSX字符串为可执行函数 +const parseJSXFunction = (data, ctx) => { + try { + const newValue = transformJSX(data.value) + const fnInfo = parseFunctionString(newValue) + if (!fnInfo) throw Error('函数解析失败,请检查格式。示例:function fnName() { }') + + return newFn(...fnInfo.params, fnInfo.body).bind({ + ...ctx, + getComponent + }) + } catch (error) { + globalNotify({ + type: 'warning', + title: '函数声明解析报错', + message: error?.message || '函数声明解析报错,请检查语法' + }) + + return newFn() + } +} + +const parseJSFunction = (data, scope, ctx = context) => { + try { + const innerFn = newFn(`return ${data.value}`).bind(ctx)() + return generateFn(innerFn, ctx) + } catch (error) { + return parseJSXFunction(data, ctx) + } +} + +const parseList = [] + +export function parseData(data, scope, ctx = context) { + let res = data + parseList.some((item) => { + if (item.type(data)) { + res = item.parseFunc(data, scope, ctx) + + return true + } + + return false + }) + + return res +} + +const parseCondition = (condition, scope, ctx = context) => { + // eslint-disable-next-line no-eq-null + return condition == null ? true : parseData(condition, scope, ctx) +} + +const parseLoopArgs = (_loop) => { + if (_loop) { + const { item, index, loopArgs = '' } = _loop + const body = `return {${loopArgs[0] || 'item'}: item, ${loopArgs[1] || 'index'} : index }` + return newFn('item,index', body)(item, index) + } + return undefined +} + +export const getIcon = (name) => window.TinyVueIcon?.[name]?.() || '' + +const parseObjectData = (data, scope, ctx) => { + if (!data) { + return data + } + + // 如果是状态访问器,则直接解析默认值 + if (isStateAccessor(data)) { + return parseData(data.defaultValue) + } + + // 解析通过属性传递icon图标组件 + if (data.componentName === 'Icon') { + return getIcon(data.props.name) + } + const res = {} + Object.entries(data).forEach(([key, value]) => { + // 如果是插槽则需要进行特殊处理 + if (key === 'slot' && value?.name) { + res[key] = value.name + } else { + res[key] = parseData(value, scope, ctx) + } + }) + return res +} + +const parseString = (data) => { + return data.trim() +} + +const parseArray = (data, scope, ctx) => { + return data.map((item) => parseData(item, scope, ctx)) +} + +const parseFunction = (data, scope, ctx) => { + return data.bind(ctx) +} + +parseList.push( + ...[ + { + type: isJSExpression, + parseFunc: parseExpression + }, + { + type: isI18nData, + parseFunc: parseI18n + }, + { + type: isJSFunction, + parseFunc: parseJSFunction + }, + { + type: isJSResource, + parseFunc: parseExpression + }, + { + type: isJSSlot, + parseFunc: parseJSSlot + }, + { + type: isString, + parseFunc: parseString + }, + { + type: isArray, + parseFunc: parseArray + }, + { + type: isFunction, + parseFunc: parseFunction + }, + { + type: isObject, + parseFunc: parseObjectData + } + ] +) + +const stopEvent = (event) => { + event.preventDefault?.() + event.stopPropagation?.() + return false +} + +const generateSlotGroup = (children, isCustomElm, schema) => { + const slotGroup = {} + + children.forEach((child) => { + const { componentName, children, params = [], props } = child + const slot = child.slot || props?.slot?.name || props?.slot || 'default' + const isNotEmptyTemplate = componentName === 'Template' && children.length + + isCustomElm && (child.props.slot = 'slot') // CE下需要给子节点加上slot标识 + slotGroup[slot] = slotGroup[slot] || { + value: [], + params, + parent: isNotEmptyTemplate ? child : schema + } + + slotGroup[slot].value.push(...(isNotEmptyTemplate ? children : [child])) // template 标签直接过滤掉 + }) + + return slotGroup +} + +const renderSlot = (children, scope, schema, isCustomElm) => { + if (children.some((a) => a.componentName === 'Template')) { + const slotGroup = generateSlotGroup(children, isCustomElm, schema) + const slots = {} + + Object.keys(slotGroup).forEach((slotName) => { + const currentSlot = slotGroup[slotName] + + slots[slotName] = ($scope) => renderDefault(currentSlot.value, { ...scope, ...$scope }, currentSlot.parent) + }) + + return slots + } + + return { default: () => renderDefault(children, scope, schema) } +} + +const checkGroup = (componentName) => configure[componentName]?.nestingRule?.childWhitelist?.length + +const clickCapture = (componentName) => configure[componentName]?.clickCapture !== false + +const getBindProps = (schema, scope) => { + const { id, componentName } = schema + const invalidity = configure[componentName]?.invalidity || [] + + if (componentName === 'CanvasPlaceholder') { + return {} + } + + const bindProps = { + ...parseData(schema.props, scope), + [DESIGN_UIDKEY]: id, + [DESIGN_TAGKEY]: componentName, + onMoseover: stopEvent, + onFocus: stopEvent + } + if (scope) { + bindProps[DESIGN_LOOPID] = scope.index === undefined ? scope.idx : scope.index + } + + // 在捕获阶段阻止事件的传播 + if (clickCapture(componentName)) { + bindProps.onClickCapture = stopEvent + } + + if (Mapper[componentName]) { + bindProps.schema = schema + } + + // 绑定组件属性时需要将 className 重命名为 class,防止覆盖组件内置 class + bindProps.class = bindProps.className + delete bindProps.className + + // 使画布中元素可拖拽 + bindProps.draggable = true + + // 过滤在门户网站上配置的画布丢弃的属性 + invalidity.forEach((prop) => delete bindProps[prop]) + + return bindProps +} + +const getLoopScope = ({ scope, index, item, loopArgs }) => { + return { + ...scope, + ...(parseLoopArgs({ + item, + index, + loopArgs + }) || {}) + } +} + +const renderGroup = (children, scope, parent) => { + return children.map?.((schema) => { + const { componentName, children, loop, loopArgs, condition, id } = schema + const loopList = parseData(loop, scope) + + const renderElement = (item, index) => { + const mergeScope = getLoopScope({ + scope, + index, + item, + loopArgs + }) + + setNode(schema, parent) + + if (conditions[id] === false || !parseCondition(condition, mergeScope)) { + return null + } + + return h( + getComponent(componentName), + getBindProps(schema, mergeScope), + Array.isArray(children) ? renderSlot(children, mergeScope, schema) : parseData(children, mergeScope) + ) + } + + return loopList?.length ? loopList.map(renderElement) : renderElement() + }) +} + +const ContainerComponent = ['CanvasCol', 'CanvasRow', 'CanvasRowColContainer'] + +const getChildren = (schema, mergeScope) => { + const { componentName, children } = schema + let renderChildren = children + + if (ContainerComponent.includes(componentName) && !renderChildren?.length) { + renderChildren = [ + { + componentName: 'CanvasPlaceholder' + } + ] + } + + const component = getComponent(componentName) + const isNative = typeof component === 'string' + const isCustomElm = customElements[componentName] + const isGroup = checkGroup(componentName) + + if (Array.isArray(renderChildren)) { + if (isNative || isCustomElm) { + return renderDefault(renderChildren, mergeScope, schema) + } else { + return isGroup + ? renderGroup(renderChildren, mergeScope, schema) + : renderSlot(renderChildren, mergeScope, schema, isCustomElm) + } + } else { + return parseData(renderChildren, mergeScope) + } +} + +export const renderer = { + name: 'renderer', + props: { + schema: Object, + scope: Object, + parent: Object + }, + setup(props) { + provide('schema', props.schema) + }, + render() { + const { scope, schema, parent } = this + const { componentName, loop, loopArgs, condition } = schema + + // 处理数据源和表格fetchData的映射关系 + generateCollection(schema) + + if (!componentName) { + return parseData(schema, scope) + } + + const component = getComponent(componentName) + + const loopList = parseData(loop, scope) + + const renderElement = (item, index) => { + let mergeScope = item + ? getLoopScope({ + item, + index, + loopArgs, + scope + }) + : scope + + // 如果是区块,并且使用了区块的作用域插槽,则需要将作用域插槽的数据传递下去 + if (parent?.componentType === 'Block' && componentName === 'Template' && schema.props?.slot?.params?.length) { + const slotName = schema.props.slot?.name || schema.props.slot + const blockName = parent.componentName + const slotData = blockSlotDataMap[blockName]?.[slotName] || {} + mergeScope = mergeScope ? { ...mergeScope, ...slotData } : slotData + } + + // 给每个节点设置schema.id,并缓存起来 + setNode(schema, parent) + + if (conditions[schema.id] === false || !parseCondition(condition, mergeScope)) { + return null + } + + return h(component, getBindProps(schema, mergeScope), getChildren(schema, mergeScope)) + } + + return loopList?.length ? loopList.map(renderElement) : renderElement() + } +} + +export default renderer diff --git a/dl-flow-frontend/packages/canvas/src/components/render/runner.js b/dl-flow-frontend/packages/canvas/src/components/render/runner.js new file mode 100644 index 0000000..bb64a22 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/components/render/runner.js @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import * as Vue from 'vue' +import * as VueI18n from 'vue-i18n' +import { addScript, addStyle, dynamicImportComponents, updateDependencies } from '../common' +import TinyI18nHost, { I18nInjectionKey } from '@opentiny/tiny-engine-common/js/i18n' +import * as TinyWebcomponentCore from '@opentiny/tiny-engine-webcomponent-core' +import TinyVue from '@opentiny/vue' +import * as TinyVueIcon from '@opentiny/vue-icon' +import Main, { api } from './RenderMain' +import { getComponent, blockSlotDataMap } from './render' +import lowcode from '../../lowcode' +import { camelize, capitalize } from '@vue/shared' + +const dispatch = (name, data) => { + window.parent.document.dispatchEvent(new CustomEvent(name, data)) +} + +dispatch('beforeCanvasReady') + +TinyI18nHost.lowcode = lowcode + +// 目前先兼容老区块发布的代码,后期区块发布整改后再删除 +window.React = {} +window.React.createElement = Vue.h + +// 不能采用new Proxy代理Vue的方案,在编译后的vue会报错警告,采用一下方案扩展用于注入一些区块加载逻辑 +window.Vue = { + ...Vue, + resolveComponent(...args) { + // 此处先执行vue内部的解析组件的方法,如果可以拿到组件对象则直接返回,反之则去注册区块 + const component = Vue.resolveComponent(args[0]) + if (component && typeof component === 'string') { + return getComponent(capitalize(camelize(args[0]))) + } else { + return component + } + }, + // renderSlot方法第三个参数是作用域插槽传递的数据,格式{ data: vue.unref(state).componentData } + renderSlot(...args) { + // 获取当前vue的实例 + const instance = Vue.getCurrentInstance() + + // 获取当前区块名称 + const blockName = instance.attrs.dataTag + + const [, slotName, slotData] = args + + // 如果是作用域插槽,则获取作用域插槽传递过来的参数 + if (slotData) { + if (blockSlotDataMap[blockName]) { + blockSlotDataMap[blockName][slotName] = slotData + } else { + blockSlotDataMap[blockName] = { [slotName]: slotData } + } + } + + /** + * vue源码中的renderSlot会忽略default插槽的名称,所以这里必须手动添加args第三个参数的name值 + * vue源码如右所示:if (name !== 'default') props.name = name; return createVNode('slot', props, fallback && fallback()); + **/ + if (slotName === 'default') { + args[2] = args[2] || {} + args[2].name = slotName + } + + return Vue.renderSlot(...args) + } +} + +window.VueI18n = VueI18n +window.TinyVue = TinyVue +window.TinyVueIcon = TinyVueIcon +window.TinyWebcomponentCore = TinyWebcomponentCore +window.TinyI18nHost = TinyI18nHost +window.TinyLowcodeComponent = {} +window.TinyComponentLibs = {} + +Object.entries(TinyVue).forEach(([_key, component]) => { + const { name } = component + if (name) { + window.TinyLowcodeComponent[name] = component + } +}) + +let App = null + +const renderer = { + getApp() { + return App + }, + getI18n() { + return TinyI18nHost + }, + ...api +} + +const create = () => { + App && App.unmount() + App = null + + document.body.remove() + document.body = document.createElement('body') + const app = document.createElement('div') + app.setAttribute('id', 'app') + document.body.appendChild(app) + + dispatch('canvasReady', { detail: renderer }) + + App = Vue.createApp(Main).use(TinyI18nHost).provide(I18nInjectionKey, TinyI18nHost) + App.config.globalProperties.lowcodeConfig = window.parent.TinyGlobalConfig + App.mount(document.querySelector('#app')) + + new ResizeObserver(() => { + dispatch('canvasResize') + }).observe(document.body) + + App.config.errorHandler = () => {} +} + +export const createRender = (config) => { + const { dslMode, canvasOptions } = config + const { styles = [], scripts = [] } = canvasOptions[dslMode] + const { styles: thirdStyles = [], scripts: thirdScripts = [] } = window.thirdPartyDeps || {} + + Promise.all([ + ...thirdScripts.map(dynamicImportComponents), + ...scripts.map((src) => addScript(src)).concat([...thirdStyles, ...styles].map((src) => addStyle(src))) + ]).finally(create) +} + +document.addEventListener('updateDependencies', updateDependencies) diff --git a/dl-flow-frontend/packages/canvas/src/i18n.js b/dl-flow-frontend/packages/canvas/src/i18n.js new file mode 100644 index 0000000..d50d960 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/i18n.js @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import i18n from '@opentiny/tiny-engine-i18n-host' +import lowcode from './lowcode' +import locale from './locale' + +i18n.lowcode = lowcode +i18n.global.mergeLocaleMessage('zh_CN', locale.zh) +i18n.global.mergeLocaleMessage('en_US', locale.en) + +export default i18n diff --git a/dl-flow-frontend/packages/canvas/src/i18n/en.json b/dl-flow-frontend/packages/canvas/src/i18n/en.json new file mode 100644 index 0000000..7d106f5 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/i18n/en.json @@ -0,0 +1,5 @@ +{ + "tip": { + "ok": "are you ok" + } +} diff --git a/dl-flow-frontend/packages/canvas/src/i18n/zh.json b/dl-flow-frontend/packages/canvas/src/i18n/zh.json new file mode 100644 index 0000000..e15179f --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/i18n/zh.json @@ -0,0 +1,5 @@ +{ + "tip": { + "ok": "准备好了吗?" + } +} diff --git a/dl-flow-frontend/packages/canvas/src/index.js b/dl-flow-frontend/packages/canvas/src/index.js new file mode 100644 index 0000000..666514a --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/index.js @@ -0,0 +1,98 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import AlgoNode from './components/container/AlgoNode.vue' +import CanvasContainer from './components/container/CanvasContainer.vue' +import Builtin from './components/builtin/builtin.json' +import RenderMain, { api as renderApi } from './components/render/RenderMain' +import { createRender } from './components/render/runner' +import { + dragStart, + updateRect, + getContext, + getNodePath, + dragMove, + setLocales, + setState, + deleteState, + getRenderer, + clearSelect, + selectNode, + hoverNode, + insertNode, + removeNode, + addComponent, + setPageCss, + addScript, + addStyle, + getNode, + getCurrent, + setSchema, + setUtils, + updateUtils, + deleteUtils, + getSchema, + setI18n, + getCanvasType, + setCanvasType, + setProps, + setGlobalState, + getGlobalState, + getDocument, + canvasDispatch +} from './components/container/container' +import GroupNode from './components/container/GroupNode.vue'; + +export { + CanvasContainer, + RenderMain, + renderApi, + Builtin, + dragStart, + dragMove, + updateRect, + getContext, + getNodePath, + getNode, + getCurrent, + setSchema, + setUtils, + updateUtils, + deleteUtils, + getSchema, + setLocales, + setState, + deleteState, + setI18n, + getRenderer, + clearSelect, + selectNode, + insertNode, + removeNode, + hoverNode, + addComponent, + setPageCss, + addScript, + addStyle, + getCanvasType, + setCanvasType, + setProps, + setGlobalState, + getGlobalState, + getDocument, + canvasDispatch, + createRender, + AlgoNode, + GroupNode +} + +export default CanvasContainer diff --git a/dl-flow-frontend/packages/canvas/src/locale.js b/dl-flow-frontend/packages/canvas/src/locale.js new file mode 100644 index 0000000..00aea38 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/locale.js @@ -0,0 +1,19 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import zh from './i18n/zh.json' +import en from './i18n/en.json' + +export default { + en, + zh +} diff --git a/dl-flow-frontend/packages/canvas/src/lowcode.js b/dl-flow-frontend/packages/canvas/src/lowcode.js new file mode 100644 index 0000000..0c453d8 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/lowcode.js @@ -0,0 +1,104 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { getCurrentInstance, nextTick, provide, inject } from 'vue' +import { I18nInjectionKey } from 'vue-i18n' +import { api } from './components/render/RenderMain' +import { collectionMethodsMap, generateFn, globalNotify } from './components/render/render' + +export const lowcodeWrap = (props, context) => { + const global = {} + const instance = getCurrentInstance() + const router = '' + const route = '' + const { t, locale } = inject(I18nInjectionKey).global + const emit = context.emit + const ref = (ref) => instance.refs[ref] + + const setState = (newState, callback) => { + Object.assign(global.state, newState) + nextTick(() => callback?.apply(global)) + } + + const getLocale = () => locale.value + const setLocale = (val) => { + locale.value = val + } + + const location = () => window.location + const history = () => window.history + + Object.defineProperties(global, { + props: { get: () => props }, + emit: { get: () => emit }, + setState: { get: () => setState }, + router: { get: () => router }, + route: { get: () => route }, + i18n: { get: () => t }, + getLocale: { get: () => getLocale }, + setLocale: { get: () => setLocale }, + location: { get: location }, + history: { get: history }, + utils: { + get: api.getUtils + }, + bridge: { get: () => ({}) }, + dataSourceMap: { get: api.getDataSourceMap }, + $: { get: () => ref } + }) + + const wrap = (fn) => { + if (typeof fn === 'function') { + const fnName = fn.name + if (fn.toString().includes('return this')) { + return () => global + } else if (fnName && collectionMethodsMap[fnName.slice(0, -1)]) { + // 这里区块打包的时候会在方法名称后面多加一个字符串,所以此处需要截取下函数名称 + fn.realName = fnName.slice(0, -1) + return generateFn(fn) + } else if (fn.name === 'setter' || fn.name === 'getter') { + // 这里需要保证在消费区块时,区块中的访问器函数可以正常执行 + return (...args) => { + try { + fn.apply(global, args) + } catch (error) { + globalNotify({ + type: 'warning', + title: `访问器函数:${fn.name}执行报错`, + message: error?.message || `访问器函数:${fn.name}执行报错,请检查语法` + }) + } + } + } else { + return () => Promise.resolve({ result: [], page: { total: 100 } }) + } + } + + Object.entries(fn).forEach(([name, value]) => { + Object.defineProperty(global, name, { + get: () => value + }) + }) + + fn.t = t + + return fn + } + + return wrap +} + +export default () => { + const i18n = inject(I18nInjectionKey) + provide(I18nInjectionKey, i18n) + return { t: i18n.global.t, lowcodeWrap } +} diff --git a/dl-flow-frontend/packages/canvas/src/main.js b/dl-flow-frontend/packages/canvas/src/main.js new file mode 100644 index 0000000..64201a2 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/src/main.js @@ -0,0 +1,17 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { createApp } from 'vue' + +import App from './Design.vue' + +createApp(App).mount('#app') diff --git a/dl-flow-frontend/packages/canvas/test/form.json b/dl-flow-frontend/packages/canvas/test/form.json new file mode 100644 index 0000000..ff5f714 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/test/form.json @@ -0,0 +1,690 @@ +{ + "componentName": "Block", + "fileName": "CrmQuoteInfo", + "css": ".crm-quote-info .form-title {\r\n color: #252b3a;\r\n font-size: 14px;\r\n font-weight: bold;\r\n margin-bottom: 20px;\r\n padding-left: 12px;\r\n}\r\n.crm-quote-info .form-fixed-layout {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n grid-column-gap: 12px;\r\n}\r\n.crm-quote-info {\r\n background: #fff;\r\n padding: 12px;\r\n min-height: 500px;\r\n}\r\n.crm-quote-info .form-auto-layout {\r\n display: flex;\r\n flex-wrap: wrap;\r\n}\r\n.search-form {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n width: 70%;\r\n}\r\n.icon-wrap {\r\n border: 1px solid #adb0b8;\r\n margin-left: 10px;\r\n border-radius: 3px;\r\n vertical-align: middle;\r\n cursor: pointer;\r\n height: 30px;\r\n display: flex;\r\n align-items: center;\r\n width: 24px;\r\n padding: 0 12px;\r\n justify-content: center;\r\n}\r\n.out-search-box {\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n.tag-nomal {\r\n display: flex;\r\n align-items: center;\r\n}\r\n.tag-nomal span {\r\n display: block;\r\n background-color: #adb0b8;\r\n border: 1px solid #adb0b8;\r\n border-radius: 4px;\r\n padding: 2px;\r\n color: #fff;\r\n height: 16px;\r\n line-height: 16px;\r\n}\r\n.tag-success span {\r\n background-color: #50d4a8;\r\n border: 1px solid #50d4a8;\r\n}", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "isFixed", + "type": "Boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否固定列布局" + } + }, + "description": { + "zh_CN": "配置固定列布局" + }, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "cols": 12, + "rules": [], + "required": true, + "handle": {} + }, + { + "property": "isAuto", + "type": "Boolean", + "defaultValue": false, + "label": { + "text": { + "zh_CN": "是否弹性布局" + } + }, + "description": { + "zh_CN": "配置弹性布局" + }, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "cols": 12, + "rules": [], + "required": true, + "handle": {} + }, + { + "property": "cpqId", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "报价ID" + } + }, + "description": { + "zh_CN": "报价ID" + }, + "widget": { + "component": "MetaInput", + "props": {} + }, + "cols": 12, + "rules": [], + "required": true, + "handle": {} + } + ] + } + ] + }, + "children": [ + { + "componentName": "div", + "id": "ffab54ff", + "props": { + "className": "crm-quote-info" + }, + "children": [ + { + "componentName": "TinyForm", + "id": "85d5eae4", + "props": { + "ref": "quotaForm", + "disabled": { + "type": "JSExpression", + "value": "this.state.formDisabled" + }, + "model": { + "type": "JSExpression", + "value": "this.state.quotationInfo" + }, + "label-position": "left", + "label-width": "99px", + "label-align": true, + "rules": { + "type": "JSExpression", + "value": "this.state.rules" + } + }, + "children": [ + { + "componentName": "div", + "id": "51852926", + "props": { + "className": "form-title" + }, + "children": [ + { + "componentName": "span", + "id": "99ea0dcf", + "children": { + "type": "i18n", + "key": "quotes.basic_info.basic_info" + } + } + ] + }, + { + "componentName": "div", + "id": "d9e174ae", + "props": { + "className": { + "type": "JSExpression", + "value": "['basic-info', {'form-fixed-layout': this.props.isFixed}, {'form-auto-layout': this.props.isAuto}]" + } + }, + "children": [ + { + "componentName": "TinyFormItem", + "id": "eab52926", + "props": { + "label": { + "type": "i18n", + "key": "quotes.quote_list.project_name" + }, + "prop": "cpqName" + }, + "children": [ + { + "componentName": "TinyTooltip", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.showTooltip", + "model": { + "prop": "" + } + }, + "placement": "right", + "content": { + "type": "i18n", + "key": "tips.valid_err_msg_project_name" + }, + "manual": true + }, + "children": [ + { + "componentName": "TinyInput", + "id": "eab11113", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.quotationInfo.cpqName", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "JSExpression", + "value": "`xxx客户-${new Date().toLocaleDateString()}`" + }, + "onFocus": { + "type": "JSExpression", + "value": "this.state.showTooltip = true" + }, + "onBlur": { + "type": "JSExpression", + "value": "this.state.showTooltip = false" + } + } + } + ], + "id": "9dec979c" + } + ] + }, + { + "componentName": "TinyFormItem", + "id": "eab174ae", + "props": { + "label": { + "type": "i18n", + "key": "quotes.basic_info.sales_method" + }, + "prop": "salesMode" + }, + "children": [ + { + "componentName": "TinySelect", + "id": "eab11114", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.quotationInfo.salesMode", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "i18n", + "key": "quotes.productlist.pleaseenterkeywords" + } + }, + "children": [ + { + "componentName": "TinyOption", + "props": { + "key": { + "type": "JSExpression", + "value": "item.key" + }, + "label": { + "type": "JSExpression", + "value": "item.label" + }, + "value": { + "type": "JSExpression", + "value": "item.value" + } + }, + "id": "02944972" + } + ] + } + ] + }, + { + "componentName": "TinyFormItem", + "id": "eab11111", + "props": { + "label": { + "type": "i18n", + "key": "quotes.basic_info.agreement_type_create" + }, + "prop": "bizType" + }, + "children": [ + { + "componentName": "TinySelect", + "id": "eab11116", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.quotationInfo.bizType", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "i18n", + "key": "crm.common.pleaseselect" + } + }, + "children": [ + { + "componentName": "TinyOption", + "id": "eab11117", + "props": { + "key": { + "type": "JSExpression", + "value": "item.value" + }, + "label": { + "type": "JSExpression", + "value": "item.text" + }, + "value": { + "type": "JSExpression", + "value": "item.value" + } + } + } + ] + } + ] + }, + { + "componentName": "TinyFormItem", + "id": "eab11112", + "props": { + "label": { + "type": "i18n", + "key": "quotes.basic_info.opportunity_name_create" + } + }, + "children": [ + { + "componentName": "TinyPopeditor", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.quotationInfo.opptyName", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "i18n", + "key": "quotes.basic_info.oppty_error" + }, + "title": { + "type": "i18n", + "key": "business.basic_info.choose_opportunity" + }, + "width": "700", + "grid-op": { + "type": "JSExpression", + "value": "this.state.gridOp" + }, + "text-field": "opportunity_name", + "value-field": "opportunity_id", + "show-pager": true, + "remote-search": { + "type": "JSExpression", + "value": "this.remoteSearch" + }, + "pager-op": { + "type": "JSExpression", + "value": "this.state.gridOp.pagerOp" + }, + "conditions": { + "type": "JSExpression", + "value": "this.state.conditions" + }, + "onChange": { + "type": "JSExpression", + "value": "this.opportunityChange" + } + }, + "children": [ + { + "componentName": "Template", + "props": { + "slot": { + "name": "search", + "params": "slotScope" + } + }, + "children": [ + { + "componentName": "div", + "props": { + "className": "out-search-box" + }, + "children": [ + { + "componentName": "div", + "props": { + "className": "search-form" + }, + "children": [ + { + "componentName": "TinySelect", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.conditionForm.oppSourceSelected", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "i18n", + "key": "crm.common.pleaseselect" + }, + "onChange": { + "type": "JSExpression", + "value": "slotScope.searchOp.doSearch(this.state.conditionForm)" + } + }, + "children": [ + { + "componentName": "TinyOption", + "props": { + "key": { + "type": "JSExpression", + "value": "item.value" + }, + "label": { + "type": "JSExpression", + "value": "item.label" + }, + "value": { + "type": "JSExpression", + "value": "item.value" + } + } + } + ] + }, + { + "componentName": "TinySelect", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.conditionForm.searchTypeSelected", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "i18n", + "key": "crm.common.pleaseselect" + } + }, + "children": [ + { + "componentName": "TinyOption", + "props": { + "key": { + "type": "JSExpression", + "value": "item.value" + }, + "label": { + "type": "JSExpression", + "value": "item.label" + }, + "value": { + "type": "JSExpression", + "value": "item.value" + } + } + } + ] + }, + { + "componentName": "TinySearch", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.conditionForm.searchOpportunityValue", + "model": { + "prop": "" + } + }, + "placeholder": { + "type": "i18n", + "key": "crm.common.pleaseselect" + }, + "size": "mini", + "onSearch": { + "type": "JSExpression", + "value": "slotScope.searchOp.doSearch(this.state.conditionForm)" + } + } + }, + { + "componentName": "div", + "props": { + "className": "icon-wrap", + "onClick": { + "type": "JSExpression", + "value": "slotScope.searchOp.doSearch(this.state.conditionForm)" + } + }, + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconRefres" + } + } + ] + } + ] + } + ] + } + ] + } + ], + "id": "17ced631" + } + ] + } + ] + }, + { + "componentName": "div", + "id": "eab11119", + "props": { + "className": "form-title" + }, + "children": { + "type": "i18n", + "key": "quotes.basic_info.customer_info" + } + }, + { + "componentName": "div", + "id": "eab11121", + "props": { + "className": { + "type": "JSExpression", + "value": "['customer-info', {'form-fixed-layout': this.props.isFixed}, {'form-auto-layout': this.props.isAuto}]" + } + }, + "children": [ + { + "componentName": "TinyFormItem", + "id": "eab11122", + "props": { + "label": { + "type": "i18n", + "key": "quotes.quotelistmodal.customername" + } + }, + "children": [ + { + "componentName": "TinyInput", + "id": "eab11124", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.quotationInfo.customerName", + "model": { + "prop": "" + } + }, + "disabled": { + "type": "JSExpression", + "value": "this.state.customDisabled" + } + }, + "children": [ + { + "componentName": "Template", + "props": { + "slot": { + "name": "suffix" + } + }, + "children": [ + { + "componentName": "div", + "condition": { + "type": "JSExpression", + "value": "this.state.customerNameTrack?.customer_track_name" + }, + "props": { + "className": "tag-nomal" + }, + "children": [ + { + "componentName": "span", + "children": { + "type": "JSExpression", + "value": "this.state.customerNameTrack?.customer_track_name" + } + } + ], + "id": "ffadf00e" + } + ] + } + ] + } + ] + }, + { + "componentName": "TinyFormItem", + "id": "eab11123", + "props": { + "label": { + "type": "i18n", + "key": "quotes.quotelistmodal.amountnumber" + } + }, + "children": [ + { + "componentName": "TinyInput", + "id": "eab11125", + "props": { + "value": { + "type": "JSExpression", + "value": "this.state.quotationInfo.customAccount", + "model": { + "prop": "" + } + }, + "onBlur": { + "type": "JSExpression", + "value": "this.customAccountChange" + } + }, + "children": [ + { + "componentName": "Template", + "props": { + "slot": { + "name": "suffix" + } + }, + "children": [ + { + "componentName": "div", + "condition": { + "type": "JSExpression", + "value": "this.state.customerAcctNoTrack?.customer_track_name" + }, + "props": { + "className": "tag-nomal tag-success" + }, + "children": [ + { + "componentName": "span", + "children": { + "type": "JSExpression", + "value": "this.state.customerAcctNoTrack?.customer_track_name" + }, + "id": "264153c5" + } + ], + "id": "84b2f9c0" + } + ] + } + ] + }, + { + "componentName": "TinyAlert", + "condition": { + "type": "JSExpression", + "value": "this.state.validateInfo.acctNoInvalidError" + }, + "props": { + "type": "warning", + "description": { + "type": "JSExpression", + "value": "this.state.validateInfo.acctNoInvalidError" + } + }, + "id": "c7263fd2" + }, + { + "componentName": "TinyAlert", + "condition": { + "type": "JSExpression", + "value": "this.state.validateInfo.acctountNoResigteredTip" + }, + "props": { + "type": "warning", + "description": { + "type": "JSExpression", + "value": "state.validateInfo.acctountNoResigteredTip" + } + }, + "id": "fe165547" + } + ] + } + ] + } + ] + } + ] + } + ], + "type": "block", + "component": "CrmQuoteInfo", + "label": "CrmQuoteInfo", + "methods": {} +} diff --git a/dl-flow-frontend/packages/canvas/test/group.json b/dl-flow-frontend/packages/canvas/test/group.json new file mode 100644 index 0000000..914cba4 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/test/group.json @@ -0,0 +1,99 @@ +{ + "componentName": "div", + "children": [ + { + "componentName": "TinyForm", + "props": { "labelWidth": 80, "labelPosition": "disabled" }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { "label": "人员" }, + "children": [ + { + "componentName": "TinyInput", + "props": { "placeholder": "请输入", "modelValue": "" }, + "id": "c3ec1fff" + } + ], + "id": "62717bc1" + }, + { + "componentName": "TinyFormItem", + "props": { "label": "密码" }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入", + "modelValue": "", + "type": "password" + }, + "id": "e1331c84" + } + ], + "id": "808159c9" + }, + { + "componentName": "TinyFormItem", + "props": { "label": "" }, + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "提交", + "type": "primary", + "style": { "marginRight": "10px" } + }, + "id": "01e8a1f3" + }, + { + "componentName": "TinyButton", + "props": { "text": "重置", "type": "primary" }, + "id": "7aecc5f4" + } + ], + "id": "41ecdb3d" + } + ], + "id": "b2341d0e" + }, + { + "componentName": "TinyTabs", + "props": { + "modelValue": "first" + }, + "children": [ + { + "componentName": "TinyTabItem", + "props": { + "title": "标签页1", + "name": "first" + }, + "children": [ + { + "componentName": "div", + "id": "2e2bfde3" + } + ], + "id": "813aae66" + }, + { + "componentName": "TinyTabItem", + "props": { + "title": "标签页2", + "name": "second" + }, + "children": [ + { + "componentName": "div", + "id": "295578a9" + } + ], + "id": "21873fc9" + } + ], + "id": "1f6e781f" + } + ], + "id": "root" +} diff --git a/dl-flow-frontend/packages/canvas/test/jsslot.json b/dl-flow-frontend/packages/canvas/test/jsslot.json new file mode 100644 index 0000000..8a6cf5b --- /dev/null +++ b/dl-flow-frontend/packages/canvas/test/jsslot.json @@ -0,0 +1,427 @@ +{ + "componentName": "Block", + "fileName": "CrmConsumeVoucherGrid", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "isEdit", + "type": "Boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否编辑" + } + }, + "description": { + "zh_CN": "是否编辑配置项" + }, + "widget": { + "component": "MetaCodeEditor" + }, + "cols": 12, + "rules": [], + "required": true, + "handle": {} + }, + { + "property": "tableData", + "type": "Array", + "defaultValue": [ + { + "way": "test", + "_RID": "row_1" + } + ], + "label": { + "text": { + "zh_CN": "表格数据" + } + }, + "description": { + "zh_CN": "表格数据配置项" + }, + "widget": { + "component": "MetaCodeEditor" + }, + "cols": 12, + "rules": [], + "required": true, + "handle": {} + }, + { + "property": "options", + "type": "Array", + "defaultValue": [ + { + "value": "test" + } + ], + "label": { + "text": { + "zh_CN": "下拉框数据" + } + }, + "description": { + "zh_CN": "下拉框数据配置项" + }, + "widget": { + "component": "MetaCodeEditor" + }, + "cols": 12, + "rules": [], + "required": true, + "handle": {} + } + ] + } + ], + "lifeCycles": { + "setup": { + "type": "JSFunction", + "value": "function( props, context, vue, state ) {\r\n watch(()=>props.tableData, (value) => {state.tableData = value })\r\n}" + } + } + }, + "methods": { + "deleteData": { + "type": "JSFunction", + "value": "function deleteData(row) {\n this.utils.Modal.confirm({\n title: '提示',\n message: '您确定要删除吗?'\n }).then(res => {\n if (res === 'confirm') {\n this.$('gridRef').remove(row);\n }\n });\n}" + }, + "activeMethod": { + "type": "JSFunction", + "value": "function activeMethod() {\n return this.props.isEdit;\n}" + }, + "stepsChange": { + "type": "JSFunction", + "value": "function stepsChange(data) {\n console.log(data);\n this.emit('change', data);\n}" + }, + "strategySubTypeChange": { + "type": "JSFunction", + "value": "function strategySubTypeChange(row) {\n console.log(row);\n}" + } + }, + "children": [ + { + "componentName": "TinyGrid", + "props": { + "ref": "gridRef", + "className": "crm-consume-voucher-grid", + "edit-config": { + "type": "JSExpression", + "value": "this.{ trigger: 'click', mode: 'cell', showStatus: false, activeMethod }" + }, + "edit-rules": { + "type": "JSExpression", + "value": "this.state.validRules" + }, + "data": { + "type": "JSExpression", + "value": "this.state.tableData" + }, + "columns": { + "type": "JSExpression", + "value": "this.state.columns" + }, + "auto-resize": true + }, + "id": "ab110672" + } + ], + "blockName": "CrmConsumeVoucherGrid", + "state": { + "validRules": { + "interval": { + "required": true + }, + "way": { + "required": true + }, + "percent": { + "required": true + }, + "deadline": { + "required": true + } + }, + "tableData": { + "type": "JSExpression", + "value": "this.props.tableData" + }, + "columns": [ + { + "type": "index", + "title": { + "type": "i18n", + "key": "quotes.voucher.tier" + }, + "width": 80 + }, + { + "title": { + "type": "i18n", + "key": "quotes.voucher.consumption_interval" + }, + "field": "interval", + "slots": { + "default": { + "type": "JSSlot", + "params": ["row", "data", "seq", "rowIndex"], + "value": [ + { + "componentName": "ConsumptionRangeGrid", + "fileName": "ConsumptionRangeGrid", + "props": { + "isEdit": { + "type": "JSExpression", + "value": "this.props.isEdit" + }, + "tableData": { + "type": "JSExpression", + "value": "data" + }, + "seq": { + "type": "JSExpression", + "value": "seq" + }, + "rowIndex": { + "type": "JSExpression", + "value": "rowIndex" + }, + "rowData": { + "type": "JSExpression", + "value": "row" + }, + "onChange": { + "type": "JSExpression", + "value": "this.stepsChange" + } + }, + "id": "da20dae5" + } + ] + } + } + }, + { + "field": "strategySubType", + "title": { + "type": "i18n", + "key": "quotes.voucher.vouchertype" + }, + "showIcon": false, + "editor": { + "component": { + "type": "JSResource", + "value": "this.utils.Select" + }, + "type": { + "type": "JSExpression", + "value": "this.props.isEdit ? 'visible' : ''" + }, + "events": { + "change": { + "type": "JSExpression", + "value": "this.strategySubTypeChange" + } + }, + "attrs": { + "type": "JSExpression", + "value": "{ options: props.options, textField: 'name', valueField: 'valueId' }" + } + }, + "formatConfig": { + "data": { + "type": "JSExpression", + "value": "this.props.options" + }, + "label": "name", + "value": "valueId" + }, + "formatText": "enum" + }, + { + "title": { + "type": "i18n", + "key": "quotes.voucher.giveamount" + }, + "slots": { + "default": { + "type": "JSSlot", + "params": ["row"], + "value": [ + { + "componentName": "div", + "children": [ + { + "componentName": "TinyInput", + "props": { + "style": { + "type": "JSExpression", + "value": "props.isEdit ? 'display:inline-block' : 'display:none'" + }, + "value": { + "type": "JSExpression", + "value": "row.voucherSpec.amount", + "model": { + "prop": "" + } + }, + "disabled": { + "type": "JSExpression", + "value": "row.strategySubType === 1" + } + }, + "id": "d1c37157" + }, + { + "componentName": "span", + "props": { + "style": { + "type": "JSExpression", + "value": "props.isEdit ? 'display:none' : 'display:inline-block'" + } + }, + "children": { + "type": "JSExpression", + "value": "row.voucherSpec.amount" + }, + "id": "f4686ebb" + } + ], + "id": "7b588b12" + } + ] + } + }, + "field": "voucherSpec.amount", + "width": 120 + }, + { + "field": "percvoucherSpec.ratioent", + "title": { + "type": "i18n", + "key": "quotes.voucher.ratio" + }, + "showIcon": false, + "slots": { + "default": { + "type": "JSSlot", + "params": ["row"], + "value": [ + { + "componentName": "div", + "children": [ + { + "componentName": "TinyInput", + "props": { + "style": { + "type": "JSExpression", + "value": "props.isEdit ? 'display:inline-block' : 'display:none'" + }, + "value": { + "type": "JSExpression", + "value": "row.voucherSpec.ratio", + "model": { + "prop": "" + } + }, + "disabled": { + "type": "JSExpression", + "value": "row.strategySubType === 2" + }, + "size": "medium" + }, + "id": "d1c37157" + }, + { + "componentName": "span", + "props": { + "style": { + "type": "JSExpression", + "value": "props.isEdit ? 'display:none' : 'display:inline-block'" + } + }, + "children": { + "type": "JSExpression", + "value": "row.voucherSpec.ratio" + }, + "id": "f4686ebb" + } + ], + "id": "7b588b12" + } + ] + } + } + }, + { + "title": { + "type": "i18n", + "key": "quotes.voucher.validity_period_month" + }, + "field": "voucherSpec.validationPeriod", + "showIcon": false, + "editor": { + "component": "input", + "attrs": { + "disabled": true + }, + "type": { + "type": "JSExpression", + "value": "this.props.isEdit ? 'visible' : ''" + } + } + }, + { + "title": { + "type": "i18n", + "key": "quotes.quoteconfig.operate" + }, + "width": 100, + "slots": { + "default": { + "type": "JSSlot", + "params": ["row"], + "value": [ + { + "componentName": "span", + "props": { + "style": "color: #5285db,cursor: pointer", + "onClick": { + "type": "JSFunction", + "value": " ()=>{this.deleteData(row)}" + } + }, + "children": { + "type": "i18n", + "key": "quotes.voucher.voucher_modal_tip4" + }, + "id": "6d81ff9d" + } + ] + } + } + } + ] + }, + "lifeCycles": { + "setup": { + "type": "JSFunction", + "value": "function setup({ props, state, watchEffect }) {\r\n \r\n watchEffect(\r\n () => {\r\n this.state.tableData = props.tableData\r\n this.state.columns[2].editor.attrs.options = props.options;\r\n }\r\n )\r\n}" + } + } +} diff --git a/dl-flow-frontend/packages/canvas/vite.config.js b/dl-flow-frontend/packages/canvas/vite.config.js new file mode 100644 index 0000000..1f4a573 --- /dev/null +++ b/dl-flow-frontend/packages/canvas/vite.config.js @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import { terser } from 'rollup-plugin-terser' + +// https://vitejs.dev/config/ +export default defineConfig({ + resolve: { + alias: { + '@': path.resolve(__dirname, 'src') + } + }, + define: { + 'process.env': {} + }, + plugins: [ + vue({ + template: { + compilerOptions: { + isCustomElement: (tag) => tag.startsWith('tiny-i18n-host') + } + } + }), + vueJsx(), + { ...terser({ module: true }), enforce: 'post' }, + { + apply: 'build', + enforce: 'post', + generateBundle(_, bundle) { + const cssFileName = 'style.css' + const jsFileName = 'index.js' + const { [cssFileName]: cssBundle } = bundle + let IIFEcss = '' + + if (cssBundle) { + IIFEcss = `(function() {try {var elementStyle = document.createElement('style');elementStyle.innerText = ${JSON.stringify( + cssBundle.source + )};document.head.appendChild(elementStyle);} catch(error) {console.error(error, 'unable to concat style inside the bundled file')}})()` + delete bundle[cssFileName] + } + + bundle[jsFileName].code += IIFEcss + } + } + ], + publicDir: false, + build: { + cssCodeSplit: false, + lib: { + entry: path.resolve(__dirname, './src/index.js'), + name: 'canvas', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + external: ['vue', '@vueuse/core', 'vue-i18n', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + }, + minify: true + } +}) diff --git a/dl-flow-frontend/packages/common/component/BindI18n.vue b/dl-flow-frontend/packages/common/component/BindI18n.vue new file mode 100644 index 0000000..9a93a24 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BindI18n.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/BlockDeployDialog.vue b/dl-flow-frontend/packages/common/component/BlockDeployDialog.vue new file mode 100644 index 0000000..f5aa6c9 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BlockDeployDialog.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/BlockDescription.vue b/dl-flow-frontend/packages/common/component/BlockDescription.vue new file mode 100644 index 0000000..5bf9653 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BlockDescription.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/BlockHistoryList.vue b/dl-flow-frontend/packages/common/component/BlockHistoryList.vue new file mode 100644 index 0000000..d34e119 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BlockHistoryList.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/BlockHistoryTemplate.vue b/dl-flow-frontend/packages/common/component/BlockHistoryTemplate.vue new file mode 100644 index 0000000..7e7cbbb --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BlockHistoryTemplate.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/BlockLinkEvent.vue b/dl-flow-frontend/packages/common/component/BlockLinkEvent.vue new file mode 100644 index 0000000..cfc1624 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BlockLinkEvent.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/BlockLinkField.vue b/dl-flow-frontend/packages/common/component/BlockLinkField.vue new file mode 100644 index 0000000..95d2a2b --- /dev/null +++ b/dl-flow-frontend/packages/common/component/BlockLinkField.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/ButtonGroup.vue b/dl-flow-frontend/packages/common/component/ButtonGroup.vue new file mode 100644 index 0000000..81d65c9 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/ButtonGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/CloseIcon.vue b/dl-flow-frontend/packages/common/component/CloseIcon.vue new file mode 100644 index 0000000..c105b75 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/CloseIcon.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/ConfigCollapse.vue b/dl-flow-frontend/packages/common/component/ConfigCollapse.vue new file mode 100644 index 0000000..1ba8b20 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/ConfigCollapse.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/ConfigGroup.vue b/dl-flow-frontend/packages/common/component/ConfigGroup.vue new file mode 100644 index 0000000..329959d --- /dev/null +++ b/dl-flow-frontend/packages/common/component/ConfigGroup.vue @@ -0,0 +1,59 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/ConfigItem.vue b/dl-flow-frontend/packages/common/component/ConfigItem.vue new file mode 100644 index 0000000..f2d6de5 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/ConfigItem.vue @@ -0,0 +1,696 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/common/component/ConfigRender.vue b/dl-flow-frontend/packages/common/component/ConfigRender.vue new file mode 100644 index 0000000..f7bd2b6 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/ConfigRender.vue @@ -0,0 +1,101 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/Empty.vue b/dl-flow-frontend/packages/common/component/Empty.vue new file mode 100644 index 0000000..862a527 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/Empty.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/EmptyTip.vue b/dl-flow-frontend/packages/common/component/EmptyTip.vue new file mode 100644 index 0000000..8e72800 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/EmptyTip.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/LifeCycles.vue b/dl-flow-frontend/packages/common/component/LifeCycles.vue new file mode 100644 index 0000000..7965f95 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/LifeCycles.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/LinkButton.vue b/dl-flow-frontend/packages/common/component/LinkButton.vue new file mode 100644 index 0000000..11a80d6 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/LinkButton.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MaskModal.vue b/dl-flow-frontend/packages/common/component/MaskModal.vue new file mode 100644 index 0000000..6005276 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MaskModal.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaArrayItem.vue b/dl-flow-frontend/packages/common/component/MetaArrayItem.vue new file mode 100644 index 0000000..b6ea09b --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaArrayItem.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaBindI18n.vue b/dl-flow-frontend/packages/common/component/MetaBindI18n.vue new file mode 100644 index 0000000..dfe0377 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaBindI18n.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaBindVariable.vue b/dl-flow-frontend/packages/common/component/MetaBindVariable.vue new file mode 100644 index 0000000..e8b53ac --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaBindVariable.vue @@ -0,0 +1,706 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaButtonGroup.vue b/dl-flow-frontend/packages/common/component/MetaButtonGroup.vue new file mode 100644 index 0000000..7a70ea5 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaButtonGroup.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaCascader.vue b/dl-flow-frontend/packages/common/component/MetaCascader.vue new file mode 100644 index 0000000..0c931a8 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaCascader.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaCheckBox.vue b/dl-flow-frontend/packages/common/component/MetaCheckBox.vue new file mode 100644 index 0000000..5dfcce8 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaCheckBox.vue @@ -0,0 +1,28 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaCheckboxGroup.vue b/dl-flow-frontend/packages/common/component/MetaCheckboxGroup.vue new file mode 100644 index 0000000..692eab2 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaCheckboxGroup.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaChildItem.vue b/dl-flow-frontend/packages/common/component/MetaChildItem.vue new file mode 100644 index 0000000..3c8a6a8 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaChildItem.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaCodeEditor.vue b/dl-flow-frontend/packages/common/component/MetaCodeEditor.vue new file mode 100644 index 0000000..028ff00 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaCodeEditor.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaCodeEditorList.vue b/dl-flow-frontend/packages/common/component/MetaCodeEditorList.vue new file mode 100644 index 0000000..578a9c3 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaCodeEditorList.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaCollection.vue b/dl-flow-frontend/packages/common/component/MetaCollection.vue new file mode 100644 index 0000000..601709f --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaCollection.vue @@ -0,0 +1,94 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaColor.vue b/dl-flow-frontend/packages/common/component/MetaColor.vue new file mode 100644 index 0000000..d1662a6 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaColor.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaContainer.vue b/dl-flow-frontend/packages/common/component/MetaContainer.vue new file mode 100644 index 0000000..be0e300 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaContainer.vue @@ -0,0 +1,102 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaDatePicker.vue b/dl-flow-frontend/packages/common/component/MetaDatePicker.vue new file mode 100644 index 0000000..e886607 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaDatePicker.vue @@ -0,0 +1,45 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaDescription.vue b/dl-flow-frontend/packages/common/component/MetaDescription.vue new file mode 100644 index 0000000..d6609e2 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaDescription.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaForm.vue b/dl-flow-frontend/packages/common/component/MetaForm.vue new file mode 100644 index 0000000..a2999ec --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaForm.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaGroupItem.vue b/dl-flow-frontend/packages/common/component/MetaGroupItem.vue new file mode 100644 index 0000000..6833289 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaGroupItem.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaHtmlAttributes.vue b/dl-flow-frontend/packages/common/component/MetaHtmlAttributes.vue new file mode 100644 index 0000000..f98c7f3 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaHtmlAttributes.vue @@ -0,0 +1,239 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaHtmlText.vue b/dl-flow-frontend/packages/common/component/MetaHtmlText.vue new file mode 100644 index 0000000..bb8a28d --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaHtmlText.vue @@ -0,0 +1,110 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaInput.vue b/dl-flow-frontend/packages/common/component/MetaInput.vue new file mode 100644 index 0000000..f44e0bc --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaInput.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaIpSection.vue b/dl-flow-frontend/packages/common/component/MetaIpSection.vue new file mode 100644 index 0000000..ebd7382 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaIpSection.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaJsSlot.vue b/dl-flow-frontend/packages/common/component/MetaJsSlot.vue new file mode 100644 index 0000000..579fe2a --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaJsSlot.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaLayoutGrid.vue b/dl-flow-frontend/packages/common/component/MetaLayoutGrid.vue new file mode 100644 index 0000000..c8734f8 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaLayoutGrid.vue @@ -0,0 +1,336 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaList.vue b/dl-flow-frontend/packages/common/component/MetaList.vue new file mode 100644 index 0000000..f844b45 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaList.vue @@ -0,0 +1,36 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaListActions.vue b/dl-flow-frontend/packages/common/component/MetaListActions.vue new file mode 100644 index 0000000..2f77a06 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaListActions.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaListItem.vue b/dl-flow-frontend/packages/common/component/MetaListItem.vue new file mode 100644 index 0000000..014dd3a --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaListItem.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaListItems.vue b/dl-flow-frontend/packages/common/component/MetaListItems.vue new file mode 100644 index 0000000..92da0e0 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaListItems.vue @@ -0,0 +1,191 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaListTitle.vue b/dl-flow-frontend/packages/common/component/MetaListTitle.vue new file mode 100644 index 0000000..c69e60c --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaListTitle.vue @@ -0,0 +1,14 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaModal.vue b/dl-flow-frontend/packages/common/component/MetaModal.vue new file mode 100644 index 0000000..8bd2115 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaModal.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaModalItem.vue b/dl-flow-frontend/packages/common/component/MetaModalItem.vue new file mode 100644 index 0000000..e7343bb --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaModalItem.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaNumber.md b/dl-flow-frontend/packages/common/component/MetaNumber.md new file mode 100644 index 0000000..4826bcd --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaNumber.md @@ -0,0 +1,41 @@ +# MetaNumber + +## 属性 + +addonAfter: 显示的单位 +showUnit: value 中是否显示单位 +units: 切换单位时单位列表 +selectedUnit: 选中的单位 +unitSelectWidth: select 框的宽度,默认 25px + +## 场景 + +### 组件单位显示场景 + +1. 值为数字类型,不需要单位,但在末尾需要显示默认的单位: + +```js +"addonAfter": "Mbit/s" +``` + +2. 组件值包含单位,为字符串类型: 如 '5Mbit/s' + +```js +"addonAfter": "Mbit/s" +"showUnit": true +``` + +3. 组件值包含单位,为字符串类型: 如 '5Mbit/s',也需要支持通过点击下拉列表切换单位: + +```js +// 不用配置addonAfter,如果配置了就是场景2 +"showUnit": true +"units": [ + { + "value": "Mbit/s", + "label": "Mbit/s" + } +], +"selectedUnit": "Mbit/s", +"unitSelectWidth": "60px" +``` diff --git a/dl-flow-frontend/packages/common/component/MetaNumber.vue b/dl-flow-frontend/packages/common/component/MetaNumber.vue new file mode 100644 index 0000000..cce0a68 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaNumber.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaPopover.vue b/dl-flow-frontend/packages/common/component/MetaPopover.vue new file mode 100644 index 0000000..d396c2f --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaPopover.vue @@ -0,0 +1,43 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaRadio.vue b/dl-flow-frontend/packages/common/component/MetaRadio.vue new file mode 100644 index 0000000..0f2279b --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaRadio.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaRadioGroup.vue b/dl-flow-frontend/packages/common/component/MetaRadioGroup.vue new file mode 100644 index 0000000..4f00b73 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaRadioGroup.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaRelatedColumns.vue b/dl-flow-frontend/packages/common/component/MetaRelatedColumns.vue new file mode 100644 index 0000000..38154ef --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaRelatedColumns.vue @@ -0,0 +1,79 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaRelatedEditor.vue b/dl-flow-frontend/packages/common/component/MetaRelatedEditor.vue new file mode 100644 index 0000000..81d2941 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaRelatedEditor.vue @@ -0,0 +1,139 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaSelect.vue b/dl-flow-frontend/packages/common/component/MetaSelect.vue new file mode 100644 index 0000000..2b7e1fd --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaSelect.vue @@ -0,0 +1,122 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaSelectIcon.vue b/dl-flow-frontend/packages/common/component/MetaSelectIcon.vue new file mode 100644 index 0000000..d428041 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaSelectIcon.vue @@ -0,0 +1,176 @@ + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaSlider.vue b/dl-flow-frontend/packages/common/component/MetaSlider.vue new file mode 100644 index 0000000..6fd6c6d --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaSlider.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaSlot.vue b/dl-flow-frontend/packages/common/component/MetaSlot.vue new file mode 100644 index 0000000..e135796 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaSlot.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MetaSwitch.vue b/dl-flow-frontend/packages/common/component/MetaSwitch.vue new file mode 100644 index 0000000..afb8b15 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaSwitch.vue @@ -0,0 +1,38 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MetaTableColumns.vue b/dl-flow-frontend/packages/common/component/MetaTableColumns.vue new file mode 100644 index 0000000..502335e --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MetaTableColumns.vue @@ -0,0 +1,33 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/MonacoEditor.vue b/dl-flow-frontend/packages/common/component/MonacoEditor.vue new file mode 100644 index 0000000..3ddc47b --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MonacoEditor.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/MultiTypeSelector.vue b/dl-flow-frontend/packages/common/component/MultiTypeSelector.vue new file mode 100644 index 0000000..8d7ebd1 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/MultiTypeSelector.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/Pane.vue b/dl-flow-frontend/packages/common/component/Pane.vue new file mode 100644 index 0000000..5bd3793 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/Pane.vue @@ -0,0 +1,61 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/PluginBlockList.vue b/dl-flow-frontend/packages/common/component/PluginBlockList.vue new file mode 100644 index 0000000..e4e6b25 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/PluginBlockList.vue @@ -0,0 +1,735 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/common/component/PluginPanel.vue b/dl-flow-frontend/packages/common/component/PluginPanel.vue new file mode 100644 index 0000000..7aa6b73 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/PluginPanel.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/PluginSetting.vue b/dl-flow-frontend/packages/common/component/PluginSetting.vue new file mode 100644 index 0000000..cd622ed --- /dev/null +++ b/dl-flow-frontend/packages/common/component/PluginSetting.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/ProgressBar.vue b/dl-flow-frontend/packages/common/component/ProgressBar.vue new file mode 100644 index 0000000..5197c36 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/ProgressBar.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/PublicIcon.vue b/dl-flow-frontend/packages/common/component/PublicIcon.vue new file mode 100644 index 0000000..4367175 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/PublicIcon.vue @@ -0,0 +1,30 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/PythonMonaco.vue b/dl-flow-frontend/packages/common/component/PythonMonaco.vue new file mode 100644 index 0000000..193d14e --- /dev/null +++ b/dl-flow-frontend/packages/common/component/PythonMonaco.vue @@ -0,0 +1,5 @@ + diff --git a/dl-flow-frontend/packages/common/component/SaveNewBlock.vue b/dl-flow-frontend/packages/common/component/SaveNewBlock.vue new file mode 100644 index 0000000..5006054 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/SaveNewBlock.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/SplitPanes.vue b/dl-flow-frontend/packages/common/component/SplitPanes.vue new file mode 100644 index 0000000..09e368c --- /dev/null +++ b/dl-flow-frontend/packages/common/component/SplitPanes.vue @@ -0,0 +1,686 @@ + + + diff --git a/dl-flow-frontend/packages/common/component/SvgButton.vue b/dl-flow-frontend/packages/common/component/SvgButton.vue new file mode 100644 index 0000000..e46650d --- /dev/null +++ b/dl-flow-frontend/packages/common/component/SvgButton.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/Tip.vue b/dl-flow-frontend/packages/common/component/Tip.vue new file mode 100644 index 0000000..4e683c1 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/Tip.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/VideoGuide.vue b/dl-flow-frontend/packages/common/component/VideoGuide.vue new file mode 100644 index 0000000..825d9d1 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/VideoGuide.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/dl-flow-frontend/packages/common/component/VueMonaco.vue b/dl-flow-frontend/packages/common/component/VueMonaco.vue new file mode 100644 index 0000000..9a47e09 --- /dev/null +++ b/dl-flow-frontend/packages/common/component/VueMonaco.vue @@ -0,0 +1,118 @@ + + + diff --git a/dl-flow-frontend/packages/common/i18n/en-us.json b/dl-flow-frontend/packages/common/i18n/en-us.json new file mode 100644 index 0000000..62a2d85 --- /dev/null +++ b/dl-flow-frontend/packages/common/i18n/en-us.json @@ -0,0 +1,45 @@ +{ + "common": { + "required": "Mandatory", + "addParameter": "Add", + "deleteParameter": "Delete Parameter", + "selectParameter": "Select Input Parameter", + "parameterName": "Name", + "nameFormat": "Start with a letter and enter only letters, digits, underscores (_), and hyphens (-). Max. characters: 32.", + "description": "Description", + "parameterGroup": "Parameter Group", + "parameterType": "Data Type", + "initialValue": "Initial Value", + "allowEmpty": "Null Allowance", + "condition": "Constraint", + "constraintError": "If either Constraint or Error Message is specified, the other is mandatory.", + "errorTip": "Error Message", + "inputValue": "Enter a value.", + "inputConstraint": "Enter a constraint.", + "inputMessage": "Enter an error message.", + "inputParamName": "Enter a name.", + "inputDescription": "Enter a description.", + "proposal": "Recommended CIDR blocks:", + "selectAParameter": "--Select--", + "typeErrorTip": "The data type of {property} is {type}. Select the same data type.", + "selectParam": "Parameter", + "confirm": "Confirm", + "ok": "OK", + "cancel": "Cancel", + "string": "String", + "number": "Number", + "boolean": "Boolean", + "select": "Select", + "format": "Format", + "save": "Save", + "close": "Close", + "commonParam": "Plain Parameter", + "encryptionParam": "Encrypted Parameter", + "createCommon": "Create Plain Parameter", + "passwordTip1": "Sensitive. Plaintext is risky. You are advised to click ", + "passwordTip2": " to add an encrypted parameter to configure the value.", + "createEncryption": "Create Encrypted Parameter", + "expandExample": "Show Example", + "collapseExample": "Hide Example" + } +} diff --git a/dl-flow-frontend/packages/common/i18n/zh-cn.json b/dl-flow-frontend/packages/common/i18n/zh-cn.json new file mode 100644 index 0000000..a1d40db --- /dev/null +++ b/dl-flow-frontend/packages/common/i18n/zh-cn.json @@ -0,0 +1,45 @@ +{ + "common": { + "required": "必填", + "addParameter": "添加参数", + "deleteParameter": "删除参数", + "selectParameter": "选择输入参数", + "parameterName": "参数名称", + "nameFormat": "大小写字母开头,大小写字母、数字、连线符、下划线组成,长度为1-32", + "description": "描述", + "parameterGroup": "参数分类", + "parameterType": "参数类型", + "initialValue": "初始值", + "allowEmpty": "允许空值", + "condition": "约束条件", + "constraintError": "约束条件与失败提示必须同时存在", + "errorTip": "失败提示", + "inputValue": "请输入值", + "inputConstraint": "请输入值", + "inputMessage": "请输入值", + "inputParamName": "请输入参数名称", + "inputDescription": "请输入描述", + "selectAParameter": "请选择参数", + "proposal": "建议使用网段:", + "typeErrorTip": "{property}的参数类型为{type},请选择相同的参数类型!", + "selectParam": "选择参数", + "confirm": "确认", + "ok": "确定", + "cancel": "取消", + "string": "字符串", + "number": "整数", + "boolean": "布尔值", + "select": "选择", + "format": "格式化", + "save": "保存", + "close": "关闭", + "commonParam": "普通参数", + "encryptionParam": "加密参数", + "createCommon": "创建普通参数", + "passwordTip1": "密码属敏感数据,输入明文有一定安全风险,建议点击", + "passwordTip2": "通过加密参数来配置密码数据。", + "createEncryption": "创建加密参数", + "expandExample": "展开示例", + "collapseExample": "收起示例" + } +} diff --git a/dl-flow-frontend/packages/common/index.js b/dl-flow-frontend/packages/common/index.js new file mode 100644 index 0000000..fafe60a --- /dev/null +++ b/dl-flow-frontend/packages/common/index.js @@ -0,0 +1,202 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import PluginSetting from './component/PluginSetting.vue' +import PluginPanel from './component/PluginPanel.vue' +import SvgButton from './component/SvgButton.vue' +import LinkButton from './component/LinkButton.vue' + +import ConfigCollapse from './component/ConfigCollapse.vue' +import ConfigGroup from './component/ConfigGroup.vue' +import ConfigItem from './component/ConfigItem.vue' +import ConfigRender from './component/ConfigRender.vue' + +import MetaArrayItem from './component/MetaArrayItem.vue' +import MetaBindI18n from './component/MetaBindI18n.vue' +import MetaBindVariable from './component/MetaBindVariable.vue' +import MetaCascader from './component/MetaCascader.vue' +import MetaCheckBox from './component/MetaCheckBox.vue' +import MetaCodeEditor from './component/MetaCodeEditor.vue' +import MetaCodeEditorList from './component/MetaCodeEditorList.vue' +import MetaCollection from './component/MetaCollection.vue' +import MetaColor from './component/MetaColor.vue' +import MetaDatePicker from './component/MetaDatePicker.vue' +import MetaDescription from './component/MetaDescription.vue' +import MetaForm from './component/MetaForm.vue' +import MetaGroupItem from './component/MetaGroupItem.vue' +import MetaInput from './component/MetaInput.vue' +import MetaLayoutGrid from './component/MetaLayoutGrid.vue' +import MetaList from './component/MetaList.vue' +import MetaListTitle from './component/MetaListTitle.vue' +import MetaListActions from './component/MetaListActions.vue' +import MetaListItems from './component/MetaListItems.vue' +import MetaListItem from './component/MetaListItem.vue' +import MetaModal, { useModal } from './component/MetaModal.vue' +import MetaNumber from './component/MetaNumber.vue' +import MetaPopover from './component/MetaPopover.vue' +import MetaRadio from './component/MetaRadio.vue' +import MetaSelect from './component/MetaSelect.vue' +import MetaSelectIcon from './component/MetaSelectIcon.vue' +import MetaSlider from './component/MetaSlider.vue' +import MetaSwitch from './component/MetaSwitch.vue' +import MetaContainer from './component/MetaContainer.vue' +import MetaJsSlot from './component/MetaJsSlot.vue' +import MetaSlot from './component/MetaSlot.vue' +import MetaHtmlText from './component/MetaHtmlText.vue' +import MetaHtmlAttributes from './component/MetaHtmlAttributes.vue' +import MetaRadioGroup from './component/MetaRadioGroup.vue' +import MetaCheckboxGroup from './component/MetaCheckboxGroup.vue' +import MetaIpSection from './component/MetaIpSection.vue' +import VideoGuide from './component/VideoGuide.vue' +import MonacoEditor from './component/MonacoEditor.vue' +import BlockHistoryList from './component/BlockHistoryList.vue' +import BlockHistoryTemplate from './component/BlockHistoryTemplate.vue' +import BlockLinkField from './component/BlockLinkField.vue' +import BlockLinkEvent from './component/BlockLinkEvent.vue' +import BlockDescription from './component/BlockDescription.vue' +import PluginBlockList from './component/PluginBlockList.vue' +import ButtonGroup from './component/ButtonGroup.vue' +import CloseIcon from './component/CloseIcon.vue' +import LifeCycles from './component/LifeCycles.vue' +import EmptyTip from './component/EmptyTip.vue' +import MaskModal from './component/MaskModal.vue' +import VueMonaco from './component/VueMonaco.vue' +import PublicIcon from './component/PublicIcon.vue' +import SaveNewBlock from './component/SaveNewBlock.vue' +import BindI18n from './component/BindI18n.vue' +import MetaRelatedEditor from './component/MetaRelatedEditor.vue' +import MetaRelatedColumns from './component/MetaRelatedColumns.vue' +import BlockDeployDialog from './component/BlockDeployDialog.vue' +import ProgressBar from './component/ProgressBar.vue' +import MetaButtonGroup from './component/MetaButtonGroup.vue' +import MetaTableColumns from './component/MetaTableColumns.vue' +import Empty from './component/Empty.vue' +import Tip from './component/Tip.vue' +import PythonMonaco from './component/PythonMonaco.vue' + +import i18n, { i18nKeyMaps } from './js/i18n.js' + +import enUs from './i18n/en-us.json' +import zhCn from './i18n/zh-cn.json' + +const { mergeLocaleMessage } = i18n.global + +mergeLocaleMessage(i18nKeyMaps.enUS, enUs) +mergeLocaleMessage(i18nKeyMaps.zhCN, zhCn) + +export const MetaComponents = { + MetaArrayItem, + MetaBindI18n, + MetaBindVariable, + MetaButtonGroup, + MetaCheckBox, + MetaCascader, + MetaCodeEditor, + MetaCodeEditorList, + MetaColor, + MetaDatePicker, + MetaDescription, + MetaGroupItem, + MetaInput, + MetaLayoutGrid, + MetaList, + MetaModal, + MetaNumber, + MetaNumeric: MetaNumber, + MetaPopover, + MetaRadio, + MetaSelect, + MetaSelectIcon, + MetaSlider, + MetaSwitch, + MetaListTitle, + MetaListActions, + MetaListItems, + MetaListItem, + MetaForm, + MetaCollection, + MetaContainer, + MetaJsSlot, + MetaSlot, + MetaHtmlText, + MetaHtmlAttributes, + MetaRadioGroup, + MetaCheckboxGroup, + MetaIpSection, + MetaRelatedEditor, + MetaRelatedColumns, + MetaTableColumns +} + +export { + MetaBindI18n, + MetaBindVariable, + MetaCheckBox, + MetaCodeEditor, + MetaCodeEditorList, + MetaColor, + MetaDatePicker, + MetaDescription, + MetaInput, + MetaList, + MetaModal, + MetaNumber, + MetaPopover, + MetaRadio, + MetaSelect, + MetaSelectIcon, + MetaSlider, + MetaSwitch, + MetaListTitle, + MetaListActions, + MetaListItems, + MetaListItem, + MetaJsSlot, + MetaSlot, + MetaHtmlText, + MetaForm, + ConfigCollapse, + ConfigGroup, + ConfigItem, + ConfigRender, + useModal, + PluginSetting, + PluginPanel, + VideoGuide, + SvgButton, + LinkButton, + BlockHistoryList, + BlockHistoryTemplate, + BlockLinkField, + BlockLinkEvent, + BlockDescription, + PluginBlockList, + MetaCollection, + ButtonGroup, + CloseIcon, + LifeCycles, + EmptyTip, + Empty, + MetaContainer, + MonacoEditor, + MaskModal, + MetaHtmlAttributes, + VueMonaco, + PublicIcon, + SaveNewBlock, + BindI18n, + BlockDeployDialog, + ProgressBar, + MetaTableColumns, + PythonMonaco, + Tip +} diff --git a/dl-flow-frontend/packages/common/js/app.js b/dl-flow-frontend/packages/common/js/app.js new file mode 100644 index 0000000..9d2383f --- /dev/null +++ b/dl-flow-frontend/packages/common/js/app.js @@ -0,0 +1,22 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export const EXTEND_CONFIG = { + TYPE: { + CONSOLE: 'console', + MOBILE: 'mobile', + BUG_SCREEN: 'bigScreen', + PRICE_CALCULATOR: 'priceCalculator', + TAIHU: 'taihu', + COMMON: 'common' + } +} diff --git a/dl-flow-frontend/packages/common/js/ast.js b/dl-flow-frontend/packages/common/js/ast.js new file mode 100644 index 0000000..18026c0 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/ast.js @@ -0,0 +1,153 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { parse, parseExpression } from '@babel/parser' +import generate from '@babel/generator' +import traverse from '@babel/traverse' +import prettier from 'prettier' +import parserHtml from 'prettier/parser-html' +import parseCss from 'prettier/parser-postcss' +import parserBabel from 'prettier/parser-babel' + +const METHOD_REGEXP = /function.*?\(/ + +export const insertName = (name, content) => content.replace(METHOD_REGEXP, `function ${name}(`) + +export const removeName = (content) => content.replace(METHOD_REGEXP, 'function (') + +export const string2Ast = (string = '') => parse(string, { sourceType: 'module', plugins: ['typescript', 'jsx'] }) + +export const ast2String = (ast) => generate(ast, { retainLines: true }).code + +const formatScript = (string) => { + let newStr = string + const options = { + parser: 'babel', + plugins: [parserBabel], + printWidth: 120, + singleQuote: true, + semi: false, + trailingComma: 'none' + } + try { + // 低码中的编辑器大多只会输入js值,并不是一个完整的javascript表达式,无法格式化,因此需要特殊处理预格式化该种情形 + newStr = prettier.format(`!${string}`, options).substring(1).replace(/\n$/, '') + } catch (error) { + newStr = prettier.format(newStr, options) + } + + return newStr +} + +const formatJson = (string) => + prettier.format(string, { + parser: 'json', + plugins: [parserBabel], + trailingComma: 'es5', + tabWidth: 2, + semi: false, + singleQuote: true + }) + +const formatHtml = (string) => + prettier.format(string, { + parser: 'html', + plugins: [parserBabel, parserHtml] + }) + +const formatCss = (string) => + prettier.format(string, { + parser: 'css', + plugins: [parseCss] + }) + +const formatterMap = { + json: formatJson, + typescript: formatScript, + javascript: formatScript, + html: formatHtml, + css: formatCss +} + +export const formatString = (str, language) => { + const formatter = formatterMap[language] || formatJson + let result = str + try { + result = formatter(str) + } catch (error) { + const printer = console + printer.log(error) + } + + return result +} + +export { parse, parseExpression, traverse, generate } + +export const includedExpression = (code, expression) => { + let flag = false + try { + traverse(parse(code), { + ExpressionStatement(path) { + if (path.toString().includes(expression)) { + flag = true + + return + } + } + }) + } catch (err) { + const printer = console + printer.log(err) + } + + return flag +} + +export const includedExpressionInSchema = (schemaObj, expression) => { + let hadFlag = false + + const checkReferencedFromSchema = (_schemaObj) => { + Object.values(_schemaObj).forEach((schemaObjIner) => { + if ( + ['[object Array]', '[object Object]'].includes(Object.prototype.toString.call(schemaObjIner)) && + Object.keys(schemaObjIner).length + ) { + if (schemaObjIner.type && ['jsstring', 'JSExpression', 'JSFunction'].includes(schemaObjIner.type)) { + if (includedExpression(schemaObjIner.value, expression)) { + hadFlag = true + + return + } + } else { + checkReferencedFromSchema(schemaObjIner) + } + } + }) + } + + checkReferencedFromSchema(schemaObj) + + return hadFlag +} + +export const findExpressionInAppSchema = (pageSchemas, expression) => { + const includedPage = [] + + pageSchemas.forEach((pageSchema) => { + if (includedExpressionInSchema(pageSchema, expression)) { + includedPage.push(pageSchema.fileName) + } + }) + + return includedPage +} diff --git a/dl-flow-frontend/packages/common/js/completion.js b/dl-flow-frontend/packages/common/js/completion.js new file mode 100644 index 0000000..3705232 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/completion.js @@ -0,0 +1,205 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { useCanvas, useResource } from '@opentiny/tiny-engine-controller' + +const keyWords = [ + 'state', + 'stores', + 'props', + 'emit', + 'setState', + 'route', + 'i18n', + 'getLocale', + 'setLocale', + 'history', + 'utils', + 'bridge', + 'dataSourceMap' +] + +const snippets = [ + { + lable: 'new function', + type: 'Function', + insertText: `function \${1:funName} (\${2}) { + \${3} +}`, + detail: 'create new function' + } +] + +const TYPES = { + KeyWord: 'KeyWord', + Function: 'Function', + Method: 'Method', + Value: 'Value', + Variable: 'Variable' +} + +const getApiSuggestions = (monaco, range, wordContent) => + keyWords + .map((item) => ({ + label: `this.${item}`, + kind: monaco.languages.CompletionItemKind.Keyword, + insertText: `this.${item}`, + detail: `Lowcode API`, + range + })) + .filter(({ insertText }) => insertText.indexOf(wordContent) === 0) + +const getSnippetsSuggestions = (monaco, range, wordContent) => + snippets + .map((item) => ({ + label: item.lable, + insertText: item.insertText, + detail: item.detail, + kind: monaco.languages.CompletionItemKind[item.type], + insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, + range + })) + .filter(({ insertText }) => insertText.indexOf(wordContent) === 0) + +const getUserWords = () => { + const { bridge = [], dataSource = [], utils = [], globalState = [] } = useResource().resState + + return { + state: { + type: TYPES.Variable, + getInsertText: (value) => `this.state.${value}`, + data: Object.keys(useCanvas().getPageSchema().state || {}) + }, + stores: { + type: TYPES.Variable, + getInsertText: (value) => `this.stores.${value}`, + data: globalState + .filter((item) => item.id) + .map((item) => [ + item.id, + ...[...Object.keys(item.state), ...Object.keys(item.getters)].map((name) => `${item.id}.${name}`) + ]) + .flat() + }, + storeFn: { + type: TYPES.Method, + getInsertText: (value) => `this.stores.${value}()`, + data: globalState + .filter((item) => item.id) + .map((item) => Object.keys(item.actions).map((name) => `${item.id}.${name}`)) + .flat() + }, + utils: { + type: TYPES.Variable, + getInsertText: (value) => `this.utils.${value}`, + data: utils.map((item) => item.name) + }, + dataSource: { + type: TYPES.Method, + getInsertText: (value) => `this.dataSourceMap.${value}.load()`, + data: dataSource.map((item) => item.name) + }, + bridge: { + type: TYPES.Variable, + getInsertText: (value) => `this.bridge.${value}`, + data: bridge.map((item) => item.name) + } + } +} + +const getUserSuggestions = (monaco, range, wordContent) => { + const userWords = getUserWords() + + return Object.entries(userWords) + .map(([_itemKey, itemContent]) => + itemContent.data.map((item) => ({ + kind: monaco.languages.CompletionItemKind[itemContent.type], + label: itemContent.getInsertText(item), + insertText: itemContent.getInsertText(item), + detail: `Lowcode API`, + range + })) + ) + .flat() + .filter(({ insertText }) => insertText.indexOf(wordContent) === 0) +} + +const getCurrentChar = (model, position) => { + const currentChar = model.getValueInRange({ + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: position.column - 1, + endColumn: position.column + }) + + return { word: currentChar, startColumn: position.column - 1, endColumn: position.column } +} + +const getWords = (model, position) => { + const words = [] + + const currentWord = model.getWordUntilPosition(position).word + ? model.getWordAtPosition(position) + : getCurrentChar(model, position) + words.push(currentWord) + + const lastPosition = { ...position, column: currentWord.startColumn } + while (lastPosition.column > 1) { + const lastWord = model.getWordUntilPosition(lastPosition).word + ? model.getWordUntilPosition(lastPosition) + : getCurrentChar(model, lastPosition) + if (!/[\w.]/.test(lastWord.word)) break + words.push(lastWord) + lastPosition.column = lastWord.startColumn + } + + return words.reverse() +} + +const getRange = (position, words) => ({ + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: words[0].startColumn, + endColumn: words[words.length - 1].endColumn +}) + +export const initCompletion = (monacoInstance, editorModel, conditionFn) => { + const completionItemProvider = { + provideCompletionItems(model, position, _context, _token) { + if (editorModel && model.id !== editorModel.id) { + return { + suggestions: [] + } + } + const words = getWords(model, position) + const wordContent = words.map((item) => item.word).join('') + const range = getRange(position, words) + + // 内置 API 提示 e.g. this.state/props/utils/... + const apiSuggestions = getApiSuggestions(monacoInstance, range, wordContent) + // 代码片段提示 e.g. create new function + const snippetSuggestions = getSnippetsSuggestions(monacoInstance, range, wordContent) + // 用户变量数据提示 e.g. this.dataSourceMap.xxx.load() + const userSuggestions = getUserSuggestions(monacoInstance, range, wordContent) + return { + suggestions: [...apiSuggestions, ...snippetSuggestions, ...userSuggestions].filter((item) => + conditionFn ? conditionFn(item) : true + ) + } + }, + triggerCharacters: ['.'] + } + + return ['javascript', 'typescript'].map((lang) => + monacoInstance.languages.registerCompletionItemProvider(lang, completionItemProvider) + ) +} diff --git a/dl-flow-frontend/packages/common/js/constants.js b/dl-flow-frontend/packages/common/js/constants.js new file mode 100644 index 0000000..5b9a76c --- /dev/null +++ b/dl-flow-frontend/packages/common/js/constants.js @@ -0,0 +1,78 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export const COMPONENT_NAME = { + Page: 'Page', + Block: 'Block', + Folder: 'Folder' +} + +export const ELEMENT_TAG = { + Body: 'body', + Div: 'div' +} + +export const SCHEMA_DATA_TYPE = { + JSFunction: 'JSFunction', + JSExpression: 'JSExpression', + I18n: 'i18n' +} + +export const PAGE_STATUS = { + Release: 'release', + Occupy: 'occupy', + Lock: 'lock', + Guest: 'guest', + Empty: 'empty', + SuperAdmin: 'p_webcenter', + Developer: 'developer' +} + +export const BLOCK_OPENNESS = { + Private: 0, + Open: 1, + Special: 2 +} + +export const BROADCAST_CHANNEL = { + CanvasLang: 'tiny-lowcode-canvas-lang', + Notify: 'global-notify', + AppType: 'app-type' +} + +export const TYPES = { + ErrorType: 'error', + ObjectType: 'object', + RegExpType: 'regExp', + DateType: 'date', + ArrayType: 'array', + FunctionType: 'function', + StringType: 'string', + NumberType: 'number', + BooleanType: 'boolean' +} + +export const DEFAULT_LOOP_NAME = { + INDEX: 'index', + ITEM: 'item' +} + +export const HOST_TYPE = { + App: 'app', + Block: 'block' +} + +// תʻӳϵ +export const i18nKeyMaps = { + zhCN: 'zh_CN', + enUS: 'en_US' +} diff --git a/dl-flow-frontend/packages/common/js/css.js b/dl-flow-frontend/packages/common/js/css.js new file mode 100644 index 0000000..689e689 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/css.js @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import * as cssTree from 'css-tree' +import { hyphenate } from '@opentiny/tiny-engine-controller/utils' + +/** + * 传入 css 字符串,得到以选择器为 Key,css 规则为 value 的 object + * 传入示例:.test { background-color: deepskyblue; } .test.link { background-color: deeppink; } .test-text { color: #fff; } + * 返回示例 { ".test": "background-color:deepskyblue"; ".test-text": "color:#fff"; ".test.link": "background-color:deeppink" } + * @param {string} styleStr css 字符串 + * @returns object { [string]: string } + */ +export const getCssObjectFromStyleStr = (styleStr) => { + const ast = cssTree.parse(styleStr) + const cssObject = {} + + ast.children + .filter(({ type }) => type === 'Rule') + .forEach((item) => { + const matchCode = cssTree.generate(item).match(/^(.+){(.+)}$/) + + if (!matchCode) { + return + } + + const [_, selector, code] = matchCode + + cssObject[selector] = code + }) + + return cssObject +} + +export const styleStrAddRoot = (str = '') => { + return `:root { ${str}\n}` +} + +export const obj2StyleStr = (obj = {}, addRoot = true) => { + const list = Object.entries(obj).map(([key, value]) => (value ? `${hyphenate(key)}: ${value};` : '')) + + return addRoot ? styleStrAddRoot(list.join('\n ')) : ` { \n ${list.join('\n ')} \n}` +} diff --git a/dl-flow-frontend/packages/common/js/environments.js b/dl-flow-frontend/packages/common/js/environments.js new file mode 100644 index 0000000..b65f070 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/environments.js @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +export const MODE = import.meta.env.MODE +export const PROD = import.meta.env.PROD +export const BASE_URL = import.meta.env.BASE_URL +export const VITE_ORIGIN = import.meta.env.VITE_ORIGIN +export const VITE_API_MOCK = import.meta.env.VITE_API_MOCK +export const VITE_CDN_DOMAIN = import.meta.env.VITE_CDN_DOMAIN +export const ENDPOINT_URL = import.meta.env.VITE_ENDPOINT_URL + +export const isMock = VITE_API_MOCK === 'mock' + +export const isVsCodeEnv = window.vscodeBridge + +export const isDevelopEnv = MODE?.includes('dev') + +export const isAlphaEnv = MODE?.includes('alpha') + +export const isProdEnv = MODE?.includes('prod') diff --git a/dl-flow-frontend/packages/common/js/http.js b/dl-flow-frontend/packages/common/js/http.js new file mode 100644 index 0000000..66e0d4b --- /dev/null +++ b/dl-flow-frontend/packages/common/js/http.js @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { useHttp } from '@opentiny/tiny-engine-http' +import { usePage, useCanvas, useNotify } from '@opentiny/tiny-engine-controller' +import { isVsCodeEnv } from './environments' +import { generateRouter, generatePage } from './vscodeGenerateFile' + +const http = useHttp() + +/** + * 异常情况埋点上传 + * @param { json } params {"event_type": design_error,"url": "elit in reprehenderit enim incididunt" } + * @returns { Promise } + */ +export const requestEvent = (params) => + http.post('/platform-center/api/platform/monitoring/event', params).catch(() => {}) + +/** + * 页面更新 + * @param { string } pageId 页面ID + * @param { json } params 页面信息 + * @returns { Promise } + * + */ +export const handlePageUpdate = (pageId, params, routerChange) => { + return http + .post(`/app-center/api/pages/update/${pageId}`, params) + .then((res) => { + const { pageSettingState } = usePage() + const { setSaved } = useCanvas() + if (isVsCodeEnv) { + generatePage({ + id: pageId, + name: params.name, + page_content: params.page_content + }) + + if (routerChange) { + generateRouter({ + pageId, + componentsTree: params + }) + } + } + + if (routerChange) { + pageSettingState.updateTreeData() + } + pageSettingState.isNew = false + useNotify({ message: '保存成功!', type: 'success' }) + + // 更新 页面状态 标志 + setSaved(true) + return res + }) + .catch((err) => { + useNotify({ title: '保存失败', message: `${err?.message || ''}`, type: 'error' }) + }) +} diff --git a/dl-flow-frontend/packages/common/js/i18n.js b/dl-flow-frontend/packages/common/js/i18n.js new file mode 100644 index 0000000..cd71630 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/i18n.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { createI18n, I18nInjectionKey } from 'vue-i18n' +import i18n, { defineCustomI18n } from '@opentiny/tiny-engine-i18n-host' +import tinyLocale from '@opentiny/vue-locale' +import { i18nKeyMaps } from './constants' + +// 此处处理TinyVue组件库的国际化zhCN --> zh_CN +const customCreateI18n = ({ locale, messages }) => { + const newMessages = {} + Object.keys(messages).forEach((key) => { + const lang = i18nKeyMaps[key] + newMessages[lang] = messages[key] + }) + + return createI18n({ + locale, + messages: newMessages, + legacy: false + }) +} + +const customI18n = tinyLocale.initI18n({ + i18n: { locale: i18nKeyMaps.zhCN }, + createI18n: customCreateI18n, + messages: {} +}) + +// 合并组件库的i18n配置 +defineCustomI18n(customI18n) + +export { I18nInjectionKey, i18nKeyMaps } + +// i18n对象可以多处使用。模板中直接使用$t,setup环境或普通环境中可以引入后使用i18n.global.t +export default i18n diff --git a/dl-flow-frontend/packages/common/js/index.js b/dl-flow-frontend/packages/common/js/index.js new file mode 100644 index 0000000..67cc0ad --- /dev/null +++ b/dl-flow-frontend/packages/common/js/index.js @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { PAGE_STATUS } from './constants' +import { useEditorInfo, useResource } from '@opentiny/tiny-engine-controller' + +export const getCanvasStatus = (data) => { + // 写死ID 待删除 + let isDemo = useResource().resState.isDemo + const { resetPasswordToken } = useEditorInfo().userInfo + + if (isDemo && [PAGE_STATUS.Developer, PAGE_STATUS.SuperAdmin].includes(resetPasswordToken)) { + isDemo = false + } + + let state = '' + + if (isDemo) { + state = PAGE_STATUS.Guest + } else if (!data) { + state = PAGE_STATUS.Release + } else { + state = useEditorInfo().userInfo.id === data.id ? PAGE_STATUS.Occupy : PAGE_STATUS.Lock + } + + return { + state, + data + } +} diff --git a/dl-flow-frontend/packages/common/js/linter.js b/dl-flow-frontend/packages/common/js/linter.js new file mode 100644 index 0000000..14e9e7e --- /dev/null +++ b/dl-flow-frontend/packages/common/js/linter.js @@ -0,0 +1,58 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { PROD, BASE_URL } from './environments' + +export const initLinter = (editor, monacoInstance, state) => { + let workerUrl = `${BASE_URL}monaco-linter/eslint.worker.js` + + // 线上环境,存在 worker 资源跨域的情况 + if (PROD) { + const workerBlob = new Blob([`importScripts('${workerUrl}');`], { type: 'application/javascript' }) + workerUrl = window.URL.createObjectURL(workerBlob) + } + + const worker = new Worker(workerUrl) + + // 监听 ESLint web worker 的返回 + worker.onmessage = function (event) { + const { markers, version } = event.data + const model = editor.getModel() + + state.hasError = markers.filter(({ severity }) => severity === 'Error').length > 0 + + // 判断当前 model 的 versionId 与请求时是否一致 + if (model && model.getVersionId() === version) { + monacoInstance.editor.setModelMarkers(model, 'ESLint', markers) + } + } + + return worker +} + +let timer = null + +export const lint = (model, worker) => { + if (timer) { + clearTimeout(timer) + } + + // 防抖处理 + timer = setTimeout(() => { + timer = null + worker.postMessage({ + code: model.getValue(), + // 发起 ESLint 静态检查时,携带 versionId + version: model.getVersionId() + }) + }, 500) +} diff --git a/dl-flow-frontend/packages/common/js/monitor.js b/dl-flow-frontend/packages/common/js/monitor.js new file mode 100644 index 0000000..6dc80e9 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/monitor.js @@ -0,0 +1,112 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { requestEvent } from './http.js' + +/** + * 全局js异常埋点上报 + * @param errorMessage 异常信息 + * @param scriptURI 异常文件路径 + * @param lineNo 异常行号 + * @param columnNo 异常列号 + * @param error 异常堆栈信息 + */ +const getUrlUnit = () => { + const urlUnit = window.location?.search?.substring(1)?.split('&') + const unit = {} + if (urlUnit.length) { + urlUnit.forEach((item) => { + let unitItem = item.split('=') + unit[unitItem[0]] = unitItem[1] + }) + } + + return JSON.stringify(unit) +} + +const globalMonitoring = () => { + window.onerror = function (errorMessage, scriptURI, lineNo, columnNo, error) { + requestEvent({ + event_type: 'design_JSError', + url: window.location.href, + unit: getUrlUnit(), + content: JSON.stringify({ errorMessage: errorMessage, scriptURI: scriptURI, columnNo: columnNo, error: error }) + }) + } +} + +/** + * promise异常埋点上报 + * @param message 异常promise原因 + * @param matchResult 异常promise堆栈 + */ + +const promiseMonitoring = () => { + window.addEventListener( + 'unhandledrejection', + (event) => { + event.preventDefault() + let message + let matchResult = '' + let reason = event.reason + if (typeof reason === 'string') { + message = reason + } else if (typeof reason === 'object') { + message = reason.message + if (reason.stack) { + matchResult = reason.stack.match(/at\s+(.+):(\d+):(\d+)/) + } + } + + requestEvent({ + event_type: 'design_promiseError', + url: window.location.href, + unit: getUrlUnit(), + content: JSON.stringify({ + message: message, + matchResult: matchResult + }) + }) + }, + true + ) +} + +/** + * iframe加载完后异常报错埋点上报 + * @param errorMessage 异常信息 + * @param scriptURI 异常文件路径 + * @param lineNo 异常行号 + * @param columnNo 异常列号 + * @param error 异常堆栈信息 + */ + +export const iframeMonitoring = () => { + window.frames[0].onerror = function (errorMessage, scriptURI, lineNo, columnNo, error) { + requestEvent({ + event_type: 'design_iframeError', + url: window.location.href, + unit: getUrlUnit(), + content: JSON.stringify({ + errorMessage: errorMessage, + scriptURI: scriptURI, + columnNo: columnNo, + error: error + }) + }) + } +} + +export const initMonitor = () => { + globalMonitoring() + promiseMonitoring() +} diff --git a/dl-flow-frontend/packages/common/js/preview.js b/dl-flow-frontend/packages/common/js/preview.js new file mode 100644 index 0000000..08d5227 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/preview.js @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { constants } from '@opentiny/tiny-engine-utils' +import { isDevelopEnv } from './environments' +import { useResource } from '@opentiny/tiny-engine-controller' +// prefer old unicode hacks for backward compatibility + +const { COMPONENT_NAME } = constants + +export const utoa = (string) => btoa(unescape(encodeURIComponent(string))) + +export const atou = (base64) => decodeURIComponent(escape(atob(base64))) + +const open = (params = {}) => { + const paramsMap = new URLSearchParams(location.search) + params.app = paramsMap.get('id') + params.tenant = paramsMap.get('tenant') + const { scripts, styles } = useResource().resState.thirdPartyDeps + params.scripts = scripts + .filter((item) => item.script) + .reduce((pre, cur) => ({ ...pre, [cur.package]: cur.script }), {}) + params.styles = [...styles] + + const href = window.location.href.split('?')[0] || './' + const tenant = new URLSearchParams(location.search).get('tenant') || '' + let openUrl = '' + const hashString = utoa(JSON.stringify(params)) + + openUrl = isDevelopEnv + ? `./preview.html?tenant=${tenant}#${hashString}` + : `${href}/preview?tenant=${tenant}#${hashString}` + + const aTag = document.createElement('a') + aTag.href = openUrl + aTag.target = '_blank' + aTag.click() +} + +export const previewPage = (params = {}) => { + params.type = COMPONENT_NAME.Page + open(params) +} + +export const previewBlock = (params = {}) => { + params.type = COMPONENT_NAME.Block + open(params) +} diff --git a/dl-flow-frontend/packages/common/js/utils.js b/dl-flow-frontend/packages/common/js/utils.js new file mode 100644 index 0000000..1fbdbde --- /dev/null +++ b/dl-flow-frontend/packages/common/js/utils.js @@ -0,0 +1,33 @@ +/** + * + * @description 合并默认值, 并返回一个新的对象. 但是不保证是深克隆 + * @template T + * @param {T} obj + * @param {T} defaultValue + */ +export const _default = (obj, defaultValue) => ({ ...defaultValue, ...obj }) + +/** + * @description 深克隆一个对象 + * @param {T} obj + * @returns {T} + */ +export const deepClone = (obj) => structuredClone(obj) + +/** + * + * @param {T extends Function} fn + * @param {number} delay + * @returns {(...args:Parameters)=>ReturnType} + */ +export const Debounce = (fn, delay) => { + let timer = null + return () => { + if (timer) { + clearTimeout(timer) + } + timer = setTimeout(() => { + fn() + }, delay) + } +} diff --git a/dl-flow-frontend/packages/common/js/verification.js b/dl-flow-frontend/packages/common/js/verification.js new file mode 100644 index 0000000..3276983 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/verification.js @@ -0,0 +1,43 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export const REGEXP_EVENT_NAME = /^[a-z]+([A-Z][a-z]*)*$/ + +export const verifyEventName = (name) => REGEXP_EVENT_NAME.test(name) + +export const REGEXP_BLOCK_NAME = /^([A-Z][A-Za-z0-9]{2,})*?([A-Z][A-Za-z0-9]{2,})*?$/ + +export const verifyBlockName = (string) => REGEXP_BLOCK_NAME.test(string) + +export const REGEXP_BLOCK_ID = /^[A-Za-z]+$/ + +export const verifyBlockId = (string) => REGEXP_BLOCK_ID.test(string) + +export const REGEXP_BLOCK_PATH = /^[\w-][/\w-]*?[\w-]*?$/ + +export const verifyBlockPath = (string) => !string || REGEXP_BLOCK_PATH.test(string) + +export const REGEXP_GROUP_NAME = /^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/ + +export const REGEXP_REGULAR_STRING = /^[\w-]*$/ // 只能包含英文字母、数字、下横线_、中横线- +export const REGEXP_REGULAR_STRING2 = /^[A-Za-z][\w-]*$/ // 只能包含英文字母、数字、下横线_、中横线-,且以英文字符开头 +export const REGEXP_REGULAR_STRING3 = /^[A-Za-z][\w-/]*$/ // 只能包含英文字母、数字、下横线_、中横线-、正斜杠/,且以英文字符开头 + +export const REGEXP_PAGE_NAME = /^([A-Z][a-z]*?)+$/ + +export const REGEXP_FOLDER_NAME = REGEXP_REGULAR_STRING2 + +export const REGEXP_ROUTE = REGEXP_REGULAR_STRING3 + +export const REGEXP_JS_VAR = /^[a-zA-Z_]\w*$/ + +export const verifyJsVarName = (name) => REGEXP_JS_VAR.test(name) diff --git a/dl-flow-frontend/packages/common/js/vscodeGenerateFile.js b/dl-flow-frontend/packages/common/js/vscodeGenerateFile.js new file mode 100644 index 0000000..35ea136 --- /dev/null +++ b/dl-flow-frontend/packages/common/js/vscodeGenerateFile.js @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { useHttp } from '@opentiny/tiny-engine-http' + +const http = useHttp() + +/** + * vscode生成路由文件 + * + * + * @param { json } params + { + pageId:"123", // 当前页面ID + componentsTree:{} // 整个应用的路由对象 + } + * @returns { string } + */ + +const generateRouter = (params) => http.post('/generate/api/generateRouter', params) + +/** + * vscode生成本地国际化词条 + * + * @param { json } params + { + + key:'lowcode.preview' // 词条的唯一key值 + contents: { + en_US: "preview", // 英文 + zh_CN: "预览" // 中文 + } + } + * @returns { string } + */ + +const generateI18n = (params) => http.post('/generate/api/generateI18n', params) + +/** + * vscode生成区块 + * + * @param { json } params + { + + schema: '', // 区块的schema + blockPath: ''// 区块的分类ID,或者说传保存路径 +} + * @returns { string } + */ + +const generateBlock = (params) => http.post('/generate/api/generateBlock', params) + +/** + * vscode生成页面 + * + * @param { json } params + { + id: 2645, // 页面ID + name: 'xh-test', // 页面名称 + page_content:{} //页面的schema + } + * @returns { string } + */ +const generatePage = (params) => http.post('/generate/api/generatePage', params) + +/** + * vscode生成数据源 + * + * @param { json } params + { + list:[], // 新的数据源合集 + dataHanlder:{ + //全局的处理函数,可以从apps/schema/:id 接口返回中的dataSource中获取 + type: "JSFunction", + value: "" + } +} + * @returns { string } + */ +const generateDataSource = (params) => http.post('/generate/api/generateDataSource', params) + +/** + * vscode生成桥接源 + * + * @param { json } params + { + //桥接源合集,可以从apps/schema/:id 接口返回中的bridge中获取 + bridge:[] + } + * @returns { string } + */ +const generateBridge = (params) => http.post('/generate/api/generateBridge', params) + +/** + * vscode生成工具类 + * + * @param { json } params + { + //桥接源合集,可以从apps/schema/:id 接口返回中的utils中获取 + utils:[] + } + * @returns { string } + */ +const generateUtil = (params) => http.post('/generate/api/generateUtil', params) + +export { generateRouter, generateI18n, generateBlock, generatePage, generateDataSource, generateBridge, generateUtil } diff --git a/dl-flow-frontend/packages/common/package.json b/dl-flow-frontend/packages/common/package.json new file mode 100644 index 0000000..1d9818b --- /dev/null +++ b/dl-flow-frontend/packages/common/package.json @@ -0,0 +1,57 @@ +{ + "name": "@opentiny/tiny-engine-common", + "version": "1.0.1", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "exports": { + ".": "./dist/index.js", + "./js/*": "./js/*.js" + }, + "files": [ + "dist", + "js" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/common" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@babel/generator": "7.18.13", + "@babel/parser": "7.18.13", + "@babel/traverse": "7.18.13", + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "@opentiny/vue-locale": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0", + "@vue/shared": "^3.3.4", + "css-tree": "^2.3.1", + "monaco-editor": "0.33.0", + "prettier": "2.7.1", + "vue": "3.2.45", + "vue-draggable-next": "2.1.0", + "vue-i18n": "9.2.2" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/common/vite.config.js b/dl-flow-frontend/packages/common/vite.config.js new file mode 100644 index 0000000..fe0dcd9 --- /dev/null +++ b/dl-flow-frontend/packages/common/vite.config.js @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + define: { + 'process.env': {} + }, + build: { + cssCodeSplit: false, + lib: { + entry: { + index: path.resolve(__dirname, './index.js') + }, + name: 'common', + fileName: (format, entryName) => `${entryName}.js`, + formats: ['es'] + }, + rollupOptions: { + output: { + banner: (chunk) => { + if (chunk.name === 'index') { + return 'import "./style.css"' + } + + return '' + } + }, + external: ['vue', 'monaco-editor', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/, /^prettier.*/] + } + } +}) \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/adapter.js b/dl-flow-frontend/packages/controller/adapter.js new file mode 100644 index 0000000..403b66e --- /dev/null +++ b/dl-flow-frontend/packages/controller/adapter.js @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { toRaw } from 'vue' +import { getGlobalConfig } from './src/globalConfig' + +/** + * 将画布pageSchema对象转换成编辑器中的string + * + * @param {*} obj + * @returns + */ +export const obj2String = (obj) => { + let out = null + + try { + out = JSON.stringify(toRaw(obj), null, 2) + } catch (error) { + // do nothing + } + + return out +} + +/** + * 将编辑器中的string转换成画布识别的pageSchema对象 + * @param {*} string + * @returns + */ + +export const string2Obj = (string) => { + let obj = null + + try { + obj = JSON.parse(string) + } catch (error) { + // do nothing + } + + return obj +} + +/** + * 判断 Monaco 编辑器背景色的主题 + * @returns + */ + +export const theme = () => { + const theme = getGlobalConfig()?.theme?.includes('dark') ? 'vs-dark' : 'vs' + + return theme +} diff --git a/dl-flow-frontend/packages/controller/package.json b/dl-flow-frontend/packages/controller/package.json new file mode 100644 index 0000000..a9bc4df --- /dev/null +++ b/dl-flow-frontend/packages/controller/package.json @@ -0,0 +1,50 @@ +{ + "name": "@opentiny/tiny-engine-controller", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "exports": { + ".": "./dist/index.js", + "./utils": "./dist/utils.js", + "./adapter": "./dist/adapter.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/controller" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-builtin-component": "workspace:*", + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0", + "@vue/shared": "^3.3.4", + "@vueuse/core": "^10.9.0", + "monaco-editor": "0.33.0", + "socket.io-client": "^4.7.4", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/controller/src/example.js b/dl-flow-frontend/packages/controller/src/example.js new file mode 100644 index 0000000..42a7b7b --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/example.js @@ -0,0 +1,98 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +// 编辑器输入示例 +const exampleMap = { + datasource: ` + { + "list": [ + { + "name": "columns", + "protocal": "VALUE", + "initialData": { + "variable": [ + { + "title": "序号", + "sorter": true + } + ], + "type": "variable", + "value": "" + } + } + ] + } + `, + globalstyle: ` + body { + background: #ccc + } + .crm-button { + line-height: 26px; + padding: 0 20px; + } + `, + imports: ` + /** + * name: 中文桥接源名称 + * path: 导入的路径(包名或者本地路径) + * item: 导入的项目,可以有以下几种形式: + * 1、import { httpService } from + * 2、import httpService from + * 3、import httpService as http from) + * instance: 实例名,需要注入service时需要添加该字段 + */ + [ + { + "name": "中文桥接源名称", + "type": "package", + "path": "@cloud/crm-http-service", + "item": "HttpServie", + "instance": "http" + } + ] + `, + inputs: ` + /** + * name: 输入属性名称 + * type: 输入类型,用于typescript类型声明, 不指定则为any, + * default: 默认值 + */ + [ + { + "name": "detailUrl", + "type": "string", + "default": "rest/cbc/cbccontractmgmtservice/v1/biz/list" + }, + { + "name": "options", + "type": "Array", + "default": [] + } + ] + `, + outputs: ` + /** + * name: 事件名称 + * type: 事件输出数据类型, 用于typescript类型声明, 不指定则为any + */ + [ + { + "name": "goToDetailPage", + "type": "object" + } + ] ` +} +export default (name) => { + const resetName = `${name || ''}`.toLocaleLowerCase() + return exampleMap[resetName] +} diff --git a/dl-flow-frontend/packages/controller/src/globalConfig.js b/dl-flow-frontend/packages/controller/src/globalConfig.js new file mode 100644 index 0000000..6aa7d5f --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/globalConfig.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +let globalConfig = null +/** + * + * @returns {import('../../design-core/config/lowcode.config').Config} + */ +export const getGlobalConfig = () => globalConfig + +export const setGlobalConfig = (config) => { + globalConfig = config +} diff --git a/dl-flow-frontend/packages/controller/src/index.js b/dl-flow-frontend/packages/controller/src/index.js new file mode 100644 index 0000000..5b7f95f --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/index.js @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import useLayout from './useLayout' +import useCanvas from './useCanvas' +import useApp from './useApp' +import useResource from './useResource' +import useHistory from './useHistory' +import useProperties from './useProperties' +import useSaveLocal from './useSaveLocal' +import useEditorInfo from './useEditorInfo' +import example from './example' +import useModal from './useModal' +import useBlock from './useBlock' +import useTranslate from './useTranslate' +import usePage from './usePage' +import useDataSource from './useDataSource' +import useBreadcrumb from './useBreadcrumb' +import useProperty from './useProperty' +import { getGlobalConfig, setGlobalConfig } from './globalConfig' +import useNotify from './useNotify' +import useData from './useData' +import useMessage from './useMessage' +import useHelp from './useHelp' +import useX6 from './useX6' +import useEditor from './useMonaco' +import { useVisitor, Visitor } from './useVisitor' +import useLayer from './useLayer' +import useSchema from './useSchema'; +import useWs from './useWS'; +import useProjects from './useProjects' +import useSearchParam from './useSearchParam'; +import useState from './useState'; +import {useDebounceFn} from '@vueuse/core'; + +export const getExample = example + +export { + useLayout, + useCanvas, + useApp, + useResource, + useHistory, + useProperties, + useSaveLocal, + useModal, + useEditorInfo, + useBlock, + useTranslate, + usePage, + useDataSource, + useBreadcrumb, + useProperty, + getGlobalConfig, + setGlobalConfig, + useNotify, + useData, + useMessage, + useHelp, + useX6, + useEditor, + useVisitor, + Visitor, + useLayer, + useSchema, + useWs, + useProjects, + useSearchParam, + useState, + useDebounceFn as useDebounce +} diff --git a/dl-flow-frontend/packages/controller/src/useApp.js b/dl-flow-frontend/packages/controller/src/useApp.js new file mode 100644 index 0000000..9a3b840 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useApp.js @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive, watch } from 'vue' +import { useHttp } from '@opentiny/tiny-engine-http' + +const http = useHttp() + +const defaultState = { + // 应用列表 + list: [], + // 当前选中的应用 + selectedApp: { + id: '', + name: '', + app_desc: '', + app_website: '', + obs_url: null, + published_at: '', + created_at: '', + updated_at: '', + platform: '', + state: null, + published: false, + tenant: null, + editor_url: '' + }, + // 当前选中的appId + selectedId: '' +} + +const appInfoState = reactive({ ...defaultState }) + +// 获取当前应用的信息 +const fetchAppInfo = (appId) => http.get(`/app-center/api/apps/detail/${appId}`) + +watch( + () => appInfoState.selectedId, + (id) => { + fetchAppInfo(id).then((app) => { + appInfoState.selectedApp = app + // 监听应用 ID 变化,根据应用名称设置网页 title + document.title = `${app.name} —— TinyEditor 前端可视化设计器` + }) + } +) + +// 获取应用列表 +const fetchAppList = (platformId) => http.get(`/app-center/api/apps/list/${platformId}`) + +const updateApp = async (id) => { + const appInfo = await fetchAppInfo(id) + appInfoState.selectedApp = appInfo + appInfoState.selectedId = appInfo.id +} + +export default () => { + return { + appInfoState, + fetchAppInfo, + fetchAppList, + updateApp + } +} diff --git a/dl-flow-frontend/packages/controller/src/useBlock.js b/dl-flow-frontend/packages/controller/src/useBlock.js new file mode 100644 index 0000000..339b8b4 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useBlock.js @@ -0,0 +1,767 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { ref, reactive, readonly } from 'vue' +import { hyphenate } from '@vue/shared' +import { extend, copyArray } from '@opentiny/vue-renderless/common/object' +import { format } from '@opentiny/vue-renderless/common/date' +import { remove } from '@opentiny/vue-renderless/common/array' +import { getCanvasStatus } from '@opentiny/tiny-engine-common/js/index' +import { ast2String, parseExpression } from '@opentiny/tiny-engine-common/js/ast' +import { getCssObjectFromStyleStr } from '@opentiny/tiny-engine-common/js/css' +import { constants } from '@opentiny/tiny-engine-utils' +import useCanvas from './useCanvas' +import useTranslate from './useTranslate' +import useEditorInfo from './useEditorInfo' +import useBreadcrumb from './useBreadcrumb' +import useLayout from './useLayout' +import { getGlobalConfig } from './globalConfig' +import { getSchema, getCurrent } from '@opentiny/tiny-engine-canvas' + +const { SORT_TYPE, SCHEMA_DATA_TYPE, BLOCK_OPENNESS } = constants + +const NODE_TYPE_PAGE = 'Page' +const nameCn = 'name_cn' +const DEFAULT_PROPERTIES = readonly([ + { + label: { + zh_CN: '基础信息' + }, + description: { + zh_CN: '基础信息' + }, + collapse: { + number: 6, + text: { + zh_CN: '显示更多' + } + }, + content: [] + } +]) + +const DEFAULT_BLOCK = readonly({ + componentName: 'Block', + fileName: '', + css: '', + props: {}, + children: [], + schema: { + properties: DEFAULT_PROPERTIES, + events: {} + }, + state: {}, + methods: {}, + dataSource: {} +}) + +const blockState = reactive({ + list: [], + current: null // 当前画布中正在渲染的区块数据 +}) + +// 区块分组信息 +const groupState = reactive({ + list: [], + selected: {} +}) + +// 区块分类 +const categoryState = reactive({ + list: [] +}) + +const getBlockList = () => blockState.list + +const setBlockList = (list) => { + blockState.list = list +} + +const addBlock = (block) => { + const blockList = getBlockList() + blockList.unshift(block) +} + +const delBlock = (block) => { + remove(getBlockList(), block) +} + +// 获取当前画布中的区块信息 +const getCurrentBlock = () => blockState.current + +const setCurrentBlock = (block) => { + blockState.current = block +} + +const getGroupList = () => groupState.list + +const setGroupList = (list) => { + groupState.list = list +} + +const getCategoryList = () => categoryState.list + +const setCategoryList = (list) => { + categoryState.list = list +} + +const getSelectedGroup = () => groupState.selected + +const setSelectedGroup = (selected) => { + groupState.selected = selected +} + +const copyCss = (css, classNameList) => { + classNameList = Array.from(new Set(classNameList)).map((item) => '.' + item) + let cssObject = getCssObjectFromStyleStr(css) + let styleStr = '' + + Object.entries(cssObject).forEach(([key, value]) => { + // 只要选择器包含目标类名,就复制 + if (classNameList.some((classNameItem) => key.includes(classNameItem))) { + styleStr += `${key} {\n${value}\n}\n` + } + }) + + return styleStr +} + +const copySchema = (schema, contentList, methods) => { + const content = schema?.properties?.[0]?.content || [] + let emitList = [] + let emitListCopies = {} + Object.keys(methods).forEach((key) => { + let item = JSON.stringify(methods[key].value).match(/emit..*?\)/g) + + if (item?.length) { + emitList = [...emitList, ...item] + } + }) + + emitList.forEach((e) => { + let key = e.match(/'.*?'/g)[0].replace(/'/g, '') + + key = `on${key[0].toLocaleUpperCase() + key.slice(1, key.length)}` + if (schema?.events[key]) { + emitListCopies[key] = schema?.events[key] + } + }) + const schemaCopies = { + properties: [ + { + ...extend(true, {}, DEFAULT_PROPERTIES[0]), + content: content.filter((item) => contentList.includes(item.property)) + } + ], + events: emitListCopies || {} + } + + return schemaCopies +} + +const copyMethods = (schema) => { + const methodsListCopies = {} + + // 因为methods方法里面大部分是用户的业务代码(无法复用),所以只需要拷贝一个空方法即可 + Object.entries(schema).forEach(([key, value]) => { + const ast = parseExpression(value.value) + + // 清空函数体 + if (ast.body?.body) { + ast.body.body = [] + } + methodsListCopies[key] = { + type: 'JSFunction', + value: ast2String(ast) + } + }) + + return methodsListCopies +} + +const copyState = (stateObj = {}, methodsObj = {}) => { + let stateCopies = {} + const stateKey = Object.keys(stateObj).map((e) => `state.${e} `) + + stateKey.forEach((e) => { + Object.keys(methodsObj).forEach((key) => { + if (methodsObj[key].value.indexOf(e) !== -1) { + const key = e.replace('state.', '').replace(' ', '') + stateCopies[key] = stateObj[key] + } + }) + }) + + return stateCopies +} + +const parsePropToData = (data, { prop, langs, state, methods }) => { + if (prop.type === SCHEMA_DATA_TYPE.I18n) { + data.langs[prop.key] = langs[prop.key] + } else if (prop.type === SCHEMA_DATA_TYPE.JSExpression) { + if (/\.state\./.test(prop.value)) { + const key = prop.value.replace('this.state.', '') + data.state[key] = state[key] + } else if (/\.props\./.test(prop.value)) { + const key = prop.value.replace('this.props.', '') + data.contentList.push(key) + } else { + const key = prop.value.replace('this.', '').replace(/\(.*?\)/, '') + data.methods[key] = methods[key] + } + } +} + +const filterDataFn = + (parseChildProps) => + ({ children = [], langs = {}, methods = {}, state = {} }) => { + const data = { + langs: {}, + methods: {}, + state: {}, + classNameList: [], + contentList: [] + } + + if (Array.isArray(children)) { + children.forEach((child) => { + parseChildProps(data, { child, langs, state, methods }) + }) + } + + return data + } + +const parseChildProps = (data, { child, langs, state, methods }) => { + if (child.props) { + Object.entries(child.props).forEach(([propKey, prop]) => { + if (typeof prop === 'object') { + parsePropToData(data, { prop, langs, state, methods }) + } else { + if (propKey === 'className' && prop) { + data.classNameList.push(...prop.split(' ').filter((item) => item)) + } + } + }) + } + + if (Array.isArray(child.children)) { + const filterData = filterDataFn(parseChildProps) + const childData = filterData({ children: child.children, langs, methods, state }) + Object.assign(data.langs, childData.langs) + Object.assign(data.methods, childData.methods) + Object.assign(data.state, childData.state) + data.classNameList = [...data.classNameList, ...childData.classNameList] + data.contentList = [...data.contentList, ...childData.contentList] + } +} + +const getBlockPageSchema = (block) => { + const content = block?.content || {} + content.componentName = content.componentName || content.blockName + + return content +} + +const initBlock = async (block = {}, _langs = {}, isEdit) => { + const { resetBlockCanvasState, setSaved } = useCanvas() + const { setBreadcrumbBlock } = useBreadcrumb() + + // 把区块的schema传递给画布 + await resetBlockCanvasState({ pageSchema: getBlockPageSchema(block) }) + // 这一步操作很重要,让区块管理面板和画布共同维护同一份区块schema + block.content = getSchema() + + setCurrentBlock(block) + setBreadcrumbBlock([block[nameCn] || block.label], block.histories) + + // 如果是点击区块管理列表进来的则不需要执行以下操作 + if (!isEdit) { + // 非编辑状态即为新增,新增默认锁定画布 + block.occupier = useEditorInfo().userInfo + useLayout().layoutState.pageStatus = getCanvasStatus(block.occupier) + addBlock(block) + setSaved(false) + } +} + +const createBlock = ({ name_cn, label, path, categories }) => { + const { pageState } = useCanvas() + const schema = extend(true, {}, pageState.currentSchema) + // 选中 body 节点创建区块时需传递子节点数据 + const children = schema.componentName === NODE_TYPE_PAGE ? schema.children : [schema] + + // 过滤只有新区块内使用到的数据 + const { getLangs } = useTranslate() + const filterData = filterDataFn(parseChildProps) + const { langs, methods, state, classNameList, contentList } = extend( + true, + {}, + filterData({ + children, + langs: getLangs(), + methods: pageState.pageSchema.methods, + state: pageState.pageSchema.state + }) + ) + + const css = copyCss(pageState.pageSchema.css, classNameList) + const methodsCopies = copyMethods(methods) + Object.assign(methods, methodsCopies) + + const schemaCopies = copySchema(pageState.pageSchema.schema, contentList, methods) + const stateCopies = copyState(pageState.pageSchema.state, methods) + Object.assign(state, stateCopies) + + const block = { + path, + [nameCn]: name_cn, + label, + histories: [], + categories, + public: BLOCK_OPENNESS.Open, + framework: getGlobalConfig()?.dslMode, + content: { + ...extend(true, {}, DEFAULT_BLOCK), + fileName: label, + css, + methods, + state, + children, + schema: schemaCopies + } + } + + initBlock(block, langs) +} + +const createEmptyBlock = ({ name_cn, label, path, categories }) => { + const block = { + path, + [nameCn]: name_cn, + label, + categories, + public: BLOCK_OPENNESS.Open, + framework: getGlobalConfig()?.dslMode, + content: { + ...extend(true, {}, DEFAULT_BLOCK), + fileName: label + } + } + + initBlock(block) +} + +const setComponentLinkedValue = ({ propertyName, value }) => { + const { schema } = getCurrent() + + if (!propertyName || !schema) { + return + } + + schema.props = schema.props || {} + schema.props[propertyName] = value +} + +const getBlockI18n = (block) => block?.content?.i18n || {} + +const getBlockProperties = (block) => block?.content?.schema?.properties?.[0]?.content || [] + +const addBlockProperty = (property, block) => { + if (!block) { + return + } + + if (!block.content) { + block.content = {} + } + + if (!block.content.schema) { + block.content.schema = {} + } + + if (!block.content.schema.properties) { + block.content.schema.properties = copyArray(DEFAULT_PROPERTIES) + } + + block.content.schema.properties[0].content.push(property) + + if (property.linked) { + setComponentLinkedValue({ + propertyName: property.linked.property, + value: { + type: SCHEMA_DATA_TYPE.JSExpression, + value: `this.props.${property.property}` + } + }) + } +} + +const editBlockProperty = (property, data) => { + if (property.linked) { + const value = { + type: SCHEMA_DATA_TYPE.JSExpression, + value: `this.props.${property.property}` + } + setComponentLinkedValue({ + propertyName: data?.property, + value + }) + data.widget.props.modelValue = value + } +} + +const removePropertyLink = ({ componentProperty }) => { + const linked = componentProperty.linked + componentProperty.linked = null + const properties = getBlockProperties(getCurrentBlock()) + + properties.forEach((property) => { + if (property.linked && property.property === linked.blockProperty) { + if (componentProperty.widget?.props?.modelValue) { + componentProperty.widget.props.modelValue = property.defaultValue + } + + setComponentLinkedValue({ + propertyName: property.linked.property, + value: property.defaultValue + }) + + property.linked = null + } + }) +} + +const getBlockEvents = (block = {}) => block?.content?.schema?.events || {} + +const addBlockEvent = ({ name, event }, block) => { + if (!block) { + return + } + + if (!block.content) { + block.content = {} + } + + if (!block.content.schema) { + block.content.schema = {} + } + + if (!block.content.schema.events) { + block.content.schema.events = {} + } + + block.content.schema.events[name] = event +} + +const removeEventLink = (linkedEventName) => { + const events = getBlockEvents(getCurrentBlock()) + + Object.entries(events).forEach(([name, event]) => { + if (linkedEventName === name) { + event.linked = null + } + }) +} + +const appendEventEmit = ({ eventName, functionName } = {}) => { + if (!eventName || !functionName) { + return + } + + const { PLUGIN_NAME, getPluginApi } = useLayout() + const getMethods = getPluginApi(PLUGIN_NAME.PageController)?.getMethods + + if (getMethods && typeof getMethods === 'function') { + const method = getMethods()?.[functionName] + + if (method?.type === SCHEMA_DATA_TYPE.JSFunction) { + const ast = parseExpression(method.value) + const params = ast.params.map((param) => param.name) + const emitContent = `this.emit('${hyphenate(eventName.replace(/^on/i, ''))}', ${params.join(',')})` + + // 如果方法里面已经有了相同的emit语句就不添加了 + if (!method?.value?.includes(emitContent)) { + ast.body.body.push(parseExpression(emitContent)) + } + method.value = ast2String(ast) + } + } +} + +// 区块消费侧 + +const DEFAULT_GROUPS = [ + { + groupId: 'all', + groupName: '所有分组' + }, + { + groupId: 'default', + groupName: '设计器默认区块分组' + } +] + +// 区块默认分组id +const DEFAULT_GROUP_ID = DEFAULT_GROUPS[1].groupId + +// 区块默认分组名称 +const DEFAULT_GROUP_NAME = DEFAULT_GROUPS[1].groupName + +// 当前选中的分组 +const selectedGroup = ref({ ...DEFAULT_GROUPS[0] }) + +// 当前选中的区块,用于查看区块详情、区块历史记录 +const selectedBlock = ref('') + +// 已选择的区块数组,用于在当前分组里添加区块 +const selectedBlockArray = ref([]) + +// 是否刷新区块列表,在当前分组里添加/删除区块后通知刷新区块列表 +const isRefresh = ref(false) + +// 切换分组时调用 +const groupChange = (group) => { + if (!group) return + + // 需要改变selectedGroup的引用地址才能触发tiny-select组件的watch事件 + selectedGroup.value = { + groupId: group.groupId || group.id, + groupName: group.groupName || group.name + } +} + +// 添加设计器默认区块分组 +const addDefaultGroup = (groups) => { + const result = DEFAULT_GROUPS.map((group) => ({ + label: group.groupName, + value: group + })) + + groups.forEach((item) => { + result.push({ + label: item.name, + value: { + groupId: item.id, + groupName: item.name + } + }) + }) + + setGroupList(groups) + + return result +} + +// 是否是设计器默认区块分组 +const isDefaultGroupId = (groupId) => groupId === DEFAULT_GROUP_ID + +const isAllGroupId = (groupId) => groupId === DEFAULT_GROUPS[0].groupId + +// 获取今天的开始时间 +const getCurrentDate = () => new Date().setHours(0, 0, 0, 0) + +// 获取本周的开始时间 +const getCurrentWeek = (date) => { + const { nowDayOfWeek, nowDay, nowMonth, nowYear } = date + const weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1) + + return weekStartDate.setHours(0, 0, 0, 0) +} + +// 获取本月的开始时间 +const getCurrentMonth = (date) => { + const { nowMonth, nowYear } = date + const monthStartDate = new Date(nowYear, nowMonth, 1) + + return monthStartDate.setHours(0, 0, 0, 0) +} + +// 获取上月的开始时间 +const getLastMonth = (date) => { + const { nowYear, lastMonth } = date + const lastMonthStartDate = new Date(nowYear, lastMonth, 1) + + return lastMonthStartDate.setHours(0, 0, 0, 0) +} + +// 判断时间戳属于今天/本周/本月/上月/更久以前 +const getDateFromNow = (timeStamp) => { + // 当前日期 + const now = new Date() + const nowDay = now.getDate() + const nowMonth = now.getMonth() + const nowYear = now.getFullYear() + + // 今天是本周的第几天 + const nowDayOfWeek = now.getDay() || 7 + + // 上月日期 + const lastMonthDate = new Date() + lastMonthDate.setDate(1) + lastMonthDate.setMonth(lastMonthDate.getMonth() - 1) + const lastMonth = lastMonthDate.getMonth() + + const date = { nowDayOfWeek, nowDay, nowMonth, nowYear, lastMonth } + + // 存在currentDateStart与currentWeekStart相同的情况,故不可以用currentDateStart作key + const dateMap = new Map([ + ['今天', getCurrentDate], + ['本周', () => getCurrentWeek(date)], + ['本月', () => getCurrentMonth(date)], + ['上月', () => getLastMonth(date)], + ['更久以前', () => ''] + ]) + + for (let [key, value] of dateMap) { + if (timeStamp >= value()) { + return key + } + } + + return undefined +} + +// 将历史记录分组 +const splitBackupGroups = (data) => { + const backupList = {} + + if (!data || !data.length) return backupList + + data.sort((backup1, backup2) => new Date(backup2.updated_at) - new Date(backup1.updated_at)) + data.forEach((item) => { + const updateTime = item.updated_at && new Date(item.updated_at) + const title = getDateFromNow(updateTime?.getTime()) || '' + backupList[title] = backupList[title] || [] + backupList[title].push({ + backupTitle: item.message, + backupTime: format(updateTime), + id: item.id + }) + }) + + return backupList +} + +const sortTypeHandlerMap = { + [SORT_TYPE.timeAsc]: (blockList) => { + blockList.sort((block1, block2) => new Date(block1.updated_at) - new Date(block2.updated_at)) + }, + [SORT_TYPE.timeDesc]: (blockList) => { + blockList.sort((block1, block2) => new Date(block2.updated_at) - new Date(block1.updated_at)) + }, + [SORT_TYPE.alphabetDesc]: (blockList) => { + // name_cn 包含中文,需要用 localeCompare + blockList.sort((block1, block2) => (block2.name_cn || block2.label).localeCompare(block1.name_cn || block1.label)) + }, + [SORT_TYPE.alphabetAsc]: (blockList) => { + // name_cn 包含中文,需要用 localeCompare + blockList.sort((block1, block2) => (block1.name_cn || block1.label).localeCompare(block2.name_cn || block2.label)) + } +} + +// 排序 +const sort = (blockList, type) => { + if (blockList.length === 0) return blockList + + if (sortTypeHandlerMap[type]) { + sortTypeHandlerMap[type](blockList) + } else { + // 默认按照时间倒序进行排序 + sortTypeHandlerMap[SORT_TYPE.timeDesc](blockList) + } + + return blockList +} + +// 在可选区块列表里选择区块 +const check = (blockList, block) => { + const index = blockList.indexOf(block) + + blockList.splice(index, 1) + selectedBlockArray.value.push(block) + + return blockList +} + +// 取消选择区块 +const cancelCheck = (blockList, block) => { + const index = selectedBlockArray.value.indexOf(block) + + selectedBlockArray.value.splice(index, 1) + blockList.push(block) + + return blockList +} + +const getBlockAssetsByVersion = (block, version) => { + let assets = block.assets + + if (version) { + const replaceUri = (uri) => uri.replace(/@\d{1,3}(\.\d{1,3}){0,2}\//, `@${version}/`) + + assets = { + ...block.assets, + scripts: block.assets.scripts.map(replaceUri), + styles: block.assets.styles.map(replaceUri) + } + } + + return assets +} + +export default function () { + return { + NODE_TYPE_PAGE, + DEFAULT_GROUP_ID, + DEFAULT_GROUP_NAME, + selectedGroup, + selectedBlock, + selectedBlockArray, + isRefresh, + addBlock, + delBlock, + createBlock, + getBlockAssetsByVersion, + createEmptyBlock, + groupChange, + addDefaultGroup, + isDefaultGroupId, + isAllGroupId, + splitBackupGroups, + sort, + check, + cancelCheck, + getBlockList, + setBlockList, + getBlockI18n, + getGroupList, + setGroupList, + getCategoryList, + setCategoryList, + addBlockEvent, + getBlockEvents, + appendEventEmit, + getCurrentBlock, + initBlock, + setCurrentBlock, + removeEventLink, + getSelectedGroup, + setSelectedGroup, + addBlockProperty, + editBlockProperty, + removePropertyLink, + getBlockProperties, + getBlockPageSchema, + getDateFromNow + } +} diff --git a/dl-flow-frontend/packages/controller/src/useBreadcrumb.js b/dl-flow-frontend/packages/controller/src/useBreadcrumb.js new file mode 100644 index 0000000..3ac0af7 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useBreadcrumb.js @@ -0,0 +1,39 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { ref } from 'vue' + +let breadcrumbData = ref([]) +const CONSTANTS = { + PAGETEXT: '页面', + BLOCKTEXT: '区块' +} + +const setBreadcrumbPage = (value) => { + breadcrumbData.value = [CONSTANTS.PAGETEXT, ...value] + sessionStorage.setItem('pageInfo', value) +} + +const setBreadcrumbBlock = (value, histories = []) => { + breadcrumbData.value = [CONSTANTS.BLOCKTEXT, ...value, histories] +} + +const getBreadcrumbData = () => breadcrumbData + +export default () => { + return { + CONSTANTS, + setBreadcrumbPage, + setBreadcrumbBlock, + getBreadcrumbData + } +} diff --git a/dl-flow-frontend/packages/controller/src/useCanvas.js b/dl-flow-frontend/packages/controller/src/useCanvas.js new file mode 100644 index 0000000..0372fcb --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useCanvas.js @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +/* eslint-disable no-new-func */ +import { reactive } from 'vue' +import { setSchema, renderApi } from '@opentiny/tiny-engine-canvas' +import { constants } from '@opentiny/tiny-engine-utils' +import useHistory from './useHistory' + +const { COMPONENT_NAME } = constants + +const defaultPageState = { + currentVm: null, + currentSchema: null, + currentType: null, + pageSchema: null, + properties: null, + dataSource: null, + dataSourceMap: null, + isSaved: true, + isLock: false, + isBlock: false, + nodesStatus: {}, + loading: false +} + +const defaultSchema = { + componentName: 'Page', + fileName: '', + css: '', + props: {}, + lifeCycles: {}, + children: [], + dataSource: { + list: [] + }, + methods: {}, + bridge: { + imports: [] + }, + state: {}, + inputs: [], + outputs: [] +} + +const pageState = reactive({ ...defaultPageState, loading: true }) +// 重置画布数据 +const resetCanvasState = async (state = {}) => { + Object.assign(pageState, defaultPageState, state) + + await setSchema(pageState.pageSchema) +} + +// 页面重置画布数据 +const resetPageCanvasState = (state = {}) => { + state.isBlock = false + resetCanvasState(state) + useHistory().addHistory(state.pageSchema) +} + +// 区块重置画布数据 +const resetBlockCanvasState = async (state = {}) => { + state.isBlock = true + await resetCanvasState(state) +} + +const getDefaultSchema = (componentName = 'Page', fileName = '') => ({ + ...defaultSchema, + componentName, + fileName +}) + +const setSaved = (flag = false) => { + pageState.isSaved = flag +} + +// 清空画布 +const clearCanvas = () => { + pageState.properties = null + + const { fileName, componentName } = pageState.pageSchema || {} + + resetCanvasState({ + pageSchema: { ...getDefaultSchema(componentName, fileName) } + }) + + setSaved(false) +} + +const isBlock = () => pageState.isBlock + +// 初始化页面数据 +const initData = (schema = { ...defaultSchema }, currentPage) => { + if (schema.componentName === COMPONENT_NAME.Block) { + resetBlockCanvasState({ + pageSchema: schema, + loading: false + }) + } else { + resetPageCanvasState({ + pageSchema: schema, + currentPage, + loading: false + }) + } + + useHistory().addHistory(schema) +} + +const isSaved = () => pageState.isSaved + +const isLoading = () => pageState.loading + +const getPageSchema = () => { + return pageState.pageSchema || {} +} + +const setCurrentSchema = (schema) => { + pageState.currentSchema = schema +} + +const getCurrentSchema = () => pageState.currentSchema + +const clearCurrentState = () => { + pageState.currentVm = null + pageState.hoverVm = null + pageState.properties = {} + pageState.pageSchema = null +} +const getCurrentPage = () => pageState.currentPage + +export default function () { + return { + pageState, + isBlock, + isSaved, + isLoading, + initData, + setSaved, + clearCanvas, + getPageSchema, + resetPageCanvasState, + resetBlockCanvasState, + clearCurrentState, + getDataSourceMap: renderApi.getDataSourceMap, + setDataSourceMap: renderApi.setDataSourceMap, + getCurrentSchema, + setCurrentSchema, + getCurrentPage + } +} diff --git a/dl-flow-frontend/packages/controller/src/useData.js b/dl-flow-frontend/packages/controller/src/useData.js new file mode 100644 index 0000000..417e50b --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useData.js @@ -0,0 +1,20 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const getCommentByKey = (key) => ({ + start: `start-${key} 设计器生成的代码,为了避免出现问题,请勿修改`, + end: `end-${key}` +}) + +export default () => ({ + getCommentByKey +}) diff --git a/dl-flow-frontend/packages/controller/src/useDataSource.js b/dl-flow-frontend/packages/controller/src/useDataSource.js new file mode 100644 index 0000000..e1e93af --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useDataSource.js @@ -0,0 +1,120 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive } from 'vue' +import { utils } from '@opentiny/tiny-engine-utils' +import { isEqual } from '@opentiny/vue-renderless/common/object' +import { isEmptyObject } from '@opentiny/vue-renderless/common/type' +import useModal from './useModal' + +const dataSourceState = reactive({ + dataSource: {}, + record: {}, + recordCopies: {}, + dataSourceColumn: {}, + dataSourceColumnCopies: {}, + remoteData: {}, + remoteDataCopies: {}, + currentRecordId: '', + isRecordValidate: true, + disCard: false, + remoteConfig: {} +}) + +const compareData = () => { + let isRecordSame = true + let isDataSourceSame = false + + if (!isEmptyObject(dataSourceState.record) && !isEmptyObject(dataSourceState.recordCopies)) { + isRecordSame = isEqual(dataSourceState.record, dataSourceState.recordCopies) + } + + isDataSourceSame = isEqual(dataSourceState.dataSourceColumn, dataSourceState.dataSourceColumnCopies) + + const isRemoteDataSame = isEqual(dataSourceState.remoteData, dataSourceState.remoteDataCopies) + + return { isRecordSame, isDataSourceSame, isRemoteDataSame } +} + +const handleConfirmSave = (dataSourceState, isRecordSame, resolve, isDataSourceSame, callback) => { + let { + name, + id, + data: { data, columns, type } + } = dataSourceState.dataSource + + if (!isRecordSame) { + // 必填字段没数据不记录该条数据 + if (!dataSourceState.isRecordValidate) { + dataSourceState.record = {} + dataSourceState.recordCopies = {} + dataSourceState.isRecordValidate = true + return resolve(true) + } + + // 数据源数据修改,新增,数据源数据做修改 + if (dataSourceState.currentRecordId) { + data = data || [] + const index = data.findIndex((item) => item.id === dataSourceState.currentRecordId) + + data[index] = Object.assign(data[index], dataSourceState.record) + } else { + const record = { ...dataSourceState.record, id: utils.guid() } + data = [...data, record] + } + } + + if (!isDataSourceSame) { + // 数据源名称,类型,字段改变,数据源修改 + columns = dataSourceState.dataSourceColumn?.columns + name = dataSourceState.dataSourceColumn?.name + } + + const requestData = { name, data: { columns, data, type } } + + callback(id, requestData).then((data) => { + if (data) { + dataSourceState.record = {} + dataSourceState.recordCopies = {} + dataSourceState.currentRecordId = '' + dataSourceState.dataSourceColumn = {} + dataSourceState.dataSourceColumnCopies = {} + dataSourceState.dataSource = {} + resolve(true) + } + }) + + return undefined +} + +const saveDataSource = (callback) => { + const { isRecordSame, isDataSourceSame } = compareData() + const { confirm } = useModal() + + if (!isEmptyObject(dataSourceState.dataSource) && (!isRecordSame || !isDataSourceSame)) { + return new Promise((resolve) => { + confirm({ + title: '提示', + message: dataSourceState.isRecordValidate + ? '当前数据未保存,关闭前是否需要保存改数据' + : '必填项为空,将不会被存储!', + exec: () => handleConfirmSave(dataSourceState, isDataSourceSame, resolve, isDataSourceSame, callback) + }) + }) + } + + return Promise.resolve(false) +} + +export default () => { + return { dataSourceState, compareData, saveDataSource } +} diff --git a/dl-flow-frontend/packages/controller/src/useEditorInfo.js b/dl-flow-frontend/packages/controller/src/useEditorInfo.js new file mode 100644 index 0000000..bd4b1e1 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useEditorInfo.js @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { useHttp } from '@opentiny/tiny-engine-http' +import useModal from './useModal' + +// web版获取配置信息: 从url中获取 +const _getWebData = () => { + const paramsMap = new URLSearchParams(location.search) + const id = paramsMap.get('id') + const blockId = paramsMap.get('blockid') + const pageId = paramsMap.get('pageid') + const type = paramsMap.get('type') + const version = paramsMap.get('version') + + return { + type: type || 'app', + id, + pageId, + blockId, + version + } +} + +let userInfo = {} +const getUserInfo = () => { + // 获取登录用户信息 + useHttp() + .get('/platform-center/api/user/me') + .then((data) => { + if (data) { + userInfo = data + } + }) + .catch((error) => { + useModal().message({ message: error.message, status: 'error' }) + }) +} + +const isAdmin = () => userInfo.resetPasswordToken === 'p_webcenter' +/** + * 1、是否是VSCode插件: 通过是否有全局变量window.vscodeBridge判断 + * + * 2、vscode中类型和id + * window.vscodeInjectData + * type: app 应用管理 block 区块管理 + * id: 应用id/blockid + * ...其他详细信息 + * + * 3、web版中,通过url参数判断 + * type: app 应用管理 block 区块管理 + * id: 应用id/blockid + * + */ +export default () => { + return { + useInfo: _getWebData, + getUserInfo, + userInfo, + isAdmin + } +} diff --git a/dl-flow-frontend/packages/controller/src/useHelp.js b/dl-flow-frontend/packages/controller/src/useHelp.js new file mode 100644 index 0000000..72238fc --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useHelp.js @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +const getBaseUrl = () => 'https://opentiny.design/tiny-engine#/help-center/course/engine/' + +const helpState = { + docsUrl: { + block: 3, + bridge: 13, + data: 7, + datasource: 11, + i18n: 12, + page: 2, + script: 8 + } +} + +const getDocsUrl = (plugin) => { + return `${getBaseUrl()}${helpState.docsUrl[plugin]}` +} + +export default () => ({ + getBaseUrl, + getDocsUrl +}) diff --git a/dl-flow-frontend/packages/controller/src/useHistory.js b/dl-flow-frontend/packages/controller/src/useHistory.js new file mode 100644 index 0000000..8d9a5dc --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useHistory.js @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive, isProxy, toRaw, watch } from 'vue' +import useCanvas from './useCanvas' +import { setSchema, getSchema } from '@opentiny/tiny-engine-canvas' + +const schema2String = (schema) => { + if (isProxy(schema)) { + schema = toRaw(schema) + } + + return JSON.stringify(schema) +} + +const string2Schema = (string) => { + let schema + + try { + schema = JSON.parse(string) + } catch (error) { + schema = {} + } + + return schema +} + +const list = [] +const maxLength = 5 +const historyState = reactive({ + index: 0, + back: false, + forward: false +}) + +const push = (schema) => { + let length = list.length + + // 处于撤销中,又修改了 schema ,需要将后面的历史记录清除 + if (historyState.index < length - 1) { + list.splice(historyState.index + 1) + length = list.length + } + + // 历史记录超过限制,删除前面的记录 + if (length >= maxLength) { + list.splice(0, length - maxLength + 1) + } + + list.push(schema2String(schema)) + historyState.index = list.length - 1 +} + +const go = (addend, valid) => { + historyState.index = historyState.index + addend + setSchema(string2Schema(list[historyState.index])) + + // 不是锁定状态,撤销操作后,传递第二个标识位,将 list 的长度减一,置灰 undoredo 操作按钮 + if (typeof valid === 'boolean') { + list.splice(1, 1) + } +} + +const back = () => { + if (historyState.back) { + go(-1) + useCanvas().setSaved(false) + } +} + +const forward = () => { + if (historyState.forward) { + go(1) + useCanvas().setSaved(historyState.index === list.length - 1) + } +} + +const addHistory = (schema) => { + if (!schema) { + useCanvas().setSaved(false) + push(getSchema()) + } else { + clear() + // 初始 schema 需要设置为第一条历史记录 + push(schema) + } +} + +const clear = () => { + list.splice(0) + Object.assign(historyState, { + index: 0, + back: false, + forward: false + }) +} + +// 监控下标,判断是否允许前进后退标志 +watch( + () => historyState.index, + (value) => { + historyState.back = value > 0 + historyState.forward = value < list.length - 1 + } +) + +export default () => { + return { + historyState, + back, + forward, + go, + addHistory + } +} diff --git a/dl-flow-frontend/packages/controller/src/useLayer.js b/dl-flow-frontend/packages/controller/src/useLayer.js new file mode 100644 index 0000000..0999da6 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useLayer.js @@ -0,0 +1,75 @@ +import {ref} from 'vue'; +import {useEndpoint} from '@opentiny/tiny-engine-http' + +let cache = null; +const layers = ref([]); +const http = useEndpoint(); + +const fetchLayer = (cacheExpire = 1000 * 60 * 15) => { + return async ()=>{ + if (cache){ + return cache + } + if (!cache){ + setTimeout(() => { + cache = null; + }, cacheExpire); + } + cache = http.get('/endpoint/layer'); + } +} +const flushCache = () => { + cache = null; + return true; +} +/** + * + * @param {import('./useResource').LayerItem} layer + */ +const createLayer = async (layer) => { + const loading = ref(true); + const error = ref(false); + const reason = ref(null); + const data = ref(); + http.post('/endpoint/layer', layer) + .then((payload) => { + data.value = payload; + layers.value.push(payload); + }) + .catch((errReason) => { + reason.value = errReason; + error.value = false; + }) + .finally(()=>loading.value=false) + return { + loading,error,reason,data + } +} + +const getLayer = () => { + const loading = ref(true); + const error = ref(false); + const reason = ref(false); + const fetcher = fetchLayer(); + if (!cache){ + fetcher(); + } + if (cache){ + if (cache instanceof Promise){ + cache.then((data) => { + layers.value = data; + }) + } + } + return {loading,error,reason}; +} + +export default () => { + return { + createLayer, + getLayer, + flushCache, + fetch, + layers + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useLayout.js b/dl-flow-frontend/packages/controller/src/useLayout.js new file mode 100644 index 0000000..301b3c5 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useLayout.js @@ -0,0 +1,136 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive, nextTick } from 'vue' +import { constants } from '@opentiny/tiny-engine-utils' + +const { PAGE_STATUS } = constants + +const PLUGIN_NAME = { + Materials: 'Materials', + AppManage: 'AppManage', + BlockManage: 'BlockManage', + PageController: 'PageController', + Lock: 'Lock', + Tutorial: 'Tutorial', + OutlineTree: 'OutlineTree', + save: 'save', + Schema: 'Schema' +} + +const pluginState = reactive({ + pluginEvent: 'all' +}) + +const layoutState = reactive({ + deviceType: 'desktop', + iframeWidth: '1200px', + dimension: { + deviceType: 'desktop', + width: '', + maxWidth: '', + minWidth: '', + scale: 1, + height: '100%' + }, + plugins: { + fixedPanels: [PLUGIN_NAME.Materials], + render: null, + api: {} // 插件需要注册交互API到这里 + }, + settings: { + render: 'props', + api: null, + activating: false, // 右侧面版激活提示状态 + showDesignSettings: true + }, + toolbars: { + visiblePopover: false + }, + pageStatus: '' +}) + +const registerPluginApi = (api) => { + Object.assign(layoutState.plugins.api, api) +} + +const getScale = () => layoutState.dimension.scale + +// 激活setting面板并高亮提示 +const activeSetting = (name) => { + const { settings } = layoutState + + settings.render = name + nextTick(() => { + settings.activating = true + setTimeout(() => { + // 高亮提示延时 + settings.activating = false + }, 1000) + }) +} + +// 获取当前插件注册的Api +const getPluginApi = (pluginName) => { + const { plugins } = layoutState + + return plugins.api[pluginName] || plugins.api +} + +// 激活plugin面板并返回当前插件注册的Api +const activePlugin = (name, noActiveRender) => { + const { plugins } = layoutState + + if (!noActiveRender) { + plugins.render = name + } + + return new Promise((resolve) => { + nextTick(() => resolve(getPluginApi(name))) + }) +} + +// 关闭插件面板 +const closePlugin = (forceClose) => { + const { plugins } = layoutState + if (!plugins.fixedPanels.includes(plugins.render) || forceClose) { + plugins.render = null + } +} + +const setDimension = (data) => { + Object.assign(layoutState.dimension, data) +} + +const getDimension = () => layoutState.dimension + +const getPluginState = () => layoutState.plugins + +const isEmptyPage = () => layoutState.pageStatus?.state === PAGE_STATUS.Empty + +export default () => { + return { + PLUGIN_NAME, + activeSetting, + activePlugin, + closePlugin, + layoutState, + getScale, + setDimension, + getDimension, + registerPluginApi, + getPluginApi, + getPluginState, + pluginState, + isEmptyPage + } +} diff --git a/dl-flow-frontend/packages/controller/src/useMessage.js b/dl-flow-frontend/packages/controller/src/useMessage.js new file mode 100644 index 0000000..5681c1b --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useMessage.js @@ -0,0 +1,138 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +let lastMessage = null +const subscribers = { '': {} } + +/** + * 订阅消息。 + * + * const { subscribe } = useMessage() + * subscribe({ topic: 'myTopic', callback: data => console.log(data) }) + * + * @member TinyEditor.message + * @param {Object} object { topic: 消息名称, subscriber(可选): 消息集合, callback: 接收到消息之后的回调用函数 } + * @return {Object} { topic: 消息名称, subscriber: 消息集合 } + */ +const subscribe = ({ topic, subscriber, callback } = {}) => { + const root = subscribers[''] + let listeners = root + + if (topic && typeof topic === 'string' && typeof callback === 'function') { + if (subscriber && typeof subscriber === 'string') { + listeners = subscribers[subscriber] || {} + subscribers[subscriber] = listeners + } + + const callbacks = listeners[topic] || [] + listeners[topic] = callbacks + callbacks.push(callback) + + const lastEvent = callbacks.lastEvent || (root[topic] && root[topic].lastEvent) + if (lastEvent) { + callback(lastEvent.data) + } + } + + return { topic, subscriber } +} + +/** + * 取消订阅。 + * + * //订阅消息 + * const { subscribe } = useMessage() + * let message = subscribe({ topic: 'myTopic', callback: data => console.log(data) }) + * + * //取消订阅 + * const { unsubscribe } = useMessage() + * unsubscribe({topic: 'myTopic'}) // 方式一 + * unsubscribe(message) // 方式二 + * + * @member TinyEditor.message + * @param {Object} object { topic: 消息名称, subscriber(可选): 消息集合 } + */ +const unsubscribe = ({ topic, subscriber } = {}) => { + if (topic && typeof topic === 'string') { + const removeListener = (subscriber) => { + const listeners = subscribers[subscriber] + if (listeners) { + delete listeners[topic] + if (subscriber && !Object.getOwnPropertyNames(listeners).length) { + delete subscribers[subscriber] + } + } + } + + if (subscriber && typeof subscriber === 'string') { + removeListener(subscriber) + } else { + Object.keys(subscribers).forEach((key) => { + removeListener(key) + }) + } + } +} + +/** + * 发布消息。 + * const { publish } = useMessage() + * publish({ topic: 'myTopic', data: 'string' }) + * publish({ topic: 'myTopic', data: {} }) + * + * @member TinyEditor.message + * @param {Object} object { topic: 消息名称, data(string | object): 消息内容 } + */ +const publish = ({ topic, data } = {}) => { + if (topic && typeof topic === 'string') { + Object.values(subscribers).forEach((value) => { + let callbacks = value[topic] || [] + + if (callbacks.length) { + callbacks.forEach((callback) => callback(data)) + } else { + value[topic] = callbacks + } + + callbacks.lastEvent = { data } + }) + } +} + +/** + * 广播消息。 + * const { broadcast } = useMessage() + * broadcast({ topic: 'myTopic', data: 'string' }) + * broadcast({ topic: 'myTopic', data: {} }) + * + * @member TinyEditor.message + * @param {Object} object { topic: 消息名称, data(string | object): 消息内容 } + */ +const broadcast = ({ topic, data }) => { + if (topic && typeof topic === 'string') { + lastMessage = { topic, data } + + publish(lastMessage) + } +} + +export default () => { + // 新use的message自动广播上次的异步消息 + lastMessage && publish(lastMessage) + + return { + subscribe, + unsubscribe, + publish, + broadcast + } +} diff --git a/dl-flow-frontend/packages/controller/src/useModal.jsx b/dl-flow-frontend/packages/controller/src/useModal.jsx new file mode 100644 index 0000000..3c0b0bf --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useModal.jsx @@ -0,0 +1,76 @@ +import { h, render } from 'vue' +import { Modal } from '@opentiny/vue' + +const confirm = ({ title, status, message, exec, cancel, showFooter = true }) => { + Modal.confirm({ + title, + status, + showFooter, + message: () => { + return ( + + ) + } + }).then((res) => { + if (res === 'confirm' && typeof exec === 'function') { + exec() + } else if (typeof cancel === 'function') { + cancel() + } + }) +} + +const message = ({ title, status, message, exec, width = '400' }) => { + Modal.alert({ + title, + status, + 'confirm-btn-props': { text: '确定' }, + width: width, + message() { + return ( + + ) + } + }).then(() => { + if (typeof exec === 'function') { + exec() + } + }) +} + +const topbox = (options) => { + const props = { ...options, modelValue: true } + let TopBox = h(Modal, props) + const modalEl = document.createElement('div') + + const close = () => { + TopBox.el.remove() + TopBox = null + } + + render(TopBox, modalEl) + + return { + TopBox, + close + } +} + +window.topbox = topbox +window.message = message + +export default () => { + return { + confirm, + message, + topbox + } +} diff --git a/dl-flow-frontend/packages/controller/src/useMonaco.js b/dl-flow-frontend/packages/controller/src/useMonaco.js new file mode 100644 index 0000000..183c970 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useMonaco.js @@ -0,0 +1,75 @@ +const vueMonaco = { + /** + * @type {import('monaco-editor').editor.IStandaloneCodeEditor|import('monaco-editor').editor.IDiffEditor} + */ + editor: null, + monaco: null +} + +const focus = () => vueMonaco.editor && vueMonaco.editor.focus() +const getMonaco = () => vueMonaco.monaco +const getEditor = () => vueMonaco.editor +/** + * + * @param {Record} props + */ +const getModifiedEditor = (props) => (props.diffEditor ? vueMonaco.editor.getModifiedEditor() : vueMonaco.editor) +/** + * + * @param {Record} props + * @returns + */ +const getOriginalEditor = (props) => (props.diffEditor ? vueMonaco.editor.getOriginalEditor() : vueMonaco.editor) +const getModelMarkers = () => vueMonaco.monaco.editor.getModelMarkers() + +/** + * + * @param {typeof import('monaco-editor')} monaco + * @param {*} emit + * @param {*} props + * @param {*} monacoRef + */ +const init = (monaco, emit, props, monacoRef) => { + emit('editorWillMount', vueMonaco.monaco) + const options = { value: props.value, theme: props.theme, language: props.language, ...props.options, readOnly: props.readOnly } + if (props.diffEditor) { + vueMonaco.editor = monaco.editor.createDiffEditor(monacoRef.value, options) + const originalModel = monaco.editor.createModel(props.original, props.language) + const modifiedModel = monaco.editor.createModel(props.value, props.language) + + vueMonaco.editor.setModel({ + original: originalModel, + modified: modifiedModel + }) + } else { + vueMonaco.editor = monaco.editor.create(monacoRef.value, { + ...options + }) + } + + const editor2 = getModifiedEditor(props) + + editor2.onDidChangeModelContent((event) => { + const value = editor2.getValue() + emit('update:value', value) + + if (props.value !== value) { + emit('change', value, event) + } + }) + + emit('editorDidMount', vueMonaco.editor) +} + +export default () => { + return { + focus, + getMonaco, + getEditor, + getModifiedEditor, + getOriginalEditor, + getModelMarkers, + init, + vueMonaco + } +} diff --git a/dl-flow-frontend/packages/controller/src/useNotify.jsx b/dl-flow-frontend/packages/controller/src/useNotify.jsx new file mode 100644 index 0000000..c9a27b3 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useNotify.jsx @@ -0,0 +1,25 @@ +import { Notify } from '@opentiny/vue' + +const durationMap = { + info: 5000, + success: 5000, + warning: 10000, + error: 10000 +} + +const useNotify = (config) => { + const { customClass, title, type = 'info', position = 'top-right', ...otherConfig } = config + + + Notify({ + duration: durationMap[type], + ...otherConfig, + position, + title, + type, + customClass: `${customClass}`, + verticalOffset: 46, + }) +} + +export default useNotify diff --git a/dl-flow-frontend/packages/controller/src/usePage.js b/dl-flow-frontend/packages/controller/src/usePage.js new file mode 100644 index 0000000..8af5fc0 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/usePage.js @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive } from 'vue' +import { extend, isEqual } from '@opentiny/vue-renderless/common/object' + +const DEFAULT_PAGE = { + app: '', + name: '', + route: '', + page_content: { + componentName: 'Page', + css: '', + props: {}, + lifeCycles: {}, + children: [], + dataSource: { + list: [] + }, + state: {}, + methods: {}, + utils: [], + bridge: [], + inputs: [], + outputs: [] + }, + isHome: false, + parentId: 'none', + isBody: false, + group: 'staticPages' +} + +const pageSettingState = reactive({ + currentPageDataCopy: {}, // 记录当前页最开始的状态,当用户点击取消按钮的时候恢复到初始状态 + currentPageData: {}, // 当前配置页面的数据 + pages: [], + oldParentId: null, + pageTreeKey: 0, + isNew: false, + ROOT_ID: '0', // 根节点ID + updateTreeData: null, + treeDataMapping: {} +}) + +const isTemporaryPage = reactive({ + saved: false +}) +const isCurrentDataSame = () => { + const data = pageSettingState.currentPageData || {} + const dataCopy = pageSettingState.currentPageDataCopy || {} + let isEqual = true + + Object.keys(dataCopy).some((item) => { + // 页面比较是否更改,为了减少判断次数,不需要判断以下字段 + if (['children', 'label', 'createdBy', 'assets', 'occupier'].includes(item)) { + return false + } else if (item === 'page_content') { + const obj = { + inputs: dataCopy[item].inputs, + outputs: dataCopy[item].outputs, + lifeCycles: dataCopy[item].lifeCycles + } + const objCopy = { + inputs: data[item].inputs, + outputs: data[item].outputs, + lifeCycles: data[item].lifeCycles + } + + if (JSON.stringify(obj) !== JSON.stringify(objCopy)) { + isEqual = false + } + } else { + if (dataCopy[item] !== data[item]) { + isEqual = false + } + } + + return !isEqual + }) + + return isEqual +} + +const changeTreeData = (newParentId, oldParentId) => { + if (newParentId && oldParentId && newParentId !== oldParentId) { + const folderData = pageSettingState.treeDataMapping[newParentId] + const parentData = pageSettingState.treeDataMapping[oldParentId] + const currentPageDataId = pageSettingState.currentPageData.id + const curDataIndex = parentData.children?.findIndex?.(({ id }) => id === currentPageDataId) + + if (curDataIndex > -1) { + parentData.children.splice(curDataIndex, 1) + if (!folderData.children) { + folderData.children = [] + } + folderData.children.unshift(pageSettingState.currentPageData) + pageSettingState.pageTreeKey++ + } + } +} + +const getPageContent = () => { + return pageSettingState.currentPageData.page_content || {} +} + +const initCurrentPageData = (pageDetail) => { + pageSettingState.currentPageData = pageDetail + pageSettingState.currentPageDataCopy = extend(true, {}, pageDetail) + pageSettingState.oldParentId = pageDetail.parentId +} + +const resetPageData = () => { + pageSettingState.currentPageData = {} + pageSettingState.currentPageDataCopy = {} + pageSettingState.oldParentId = null +} + +// 判断当前页面内容是否有修改 +const isChangePageData = () => !isEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy) + +const STATIC_PAGE_GROUP_ID = 0 +const COMMON_PAGE_GROUP_ID = 1 + +export default () => { + return { + DEFAULT_PAGE, + pageSettingState, + isTemporaryPage, + isCurrentDataSame, + changeTreeData, + getPageContent, + resetPageData, + initCurrentPageData, + isChangePageData, + STATIC_PAGE_GROUP_ID, + COMMON_PAGE_GROUP_ID + } +} diff --git a/dl-flow-frontend/packages/controller/src/useProjects.js b/dl-flow-frontend/packages/controller/src/useProjects.js new file mode 100644 index 0000000..81b1774 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useProjects.js @@ -0,0 +1,115 @@ +/** + * @typedef {Object} ProjectItem + * @prop {string} name Project Name + * @prop {{nick: string}} author Project author + * @prop {number} createAt Project created timestamp + * @prop {number} projectId Id of project + * @prop {Object} data + * @prop {Object} graphData + */ +/** + * @typedef {Object} Project + * @prop {number} projectId + * @prop {string} name + * @prop {string} author + * @prop {number} createAt + * @prop {boolean} removed + * @prop {Object} schema + */ + +import { useEndpoint } from '@opentiny/tiny-engine-http'; +import { reactive, ref } from 'vue'; +const ep = useEndpoint(); + +const newProject = (name) => { + return ep.post('/endpoint/project/', {name}) +} + +const deleteProject = (id) => { + return ep.delete(`/endpoint/project`, {query: {id}}); +} + +const rename = (id, name) => { + return ep.patch(`/endpoint/project/${id}`, {name}) +} + +const save = (id, schema, graphData) => { + return ep.patch(`/endpoint/project/${id}`, { + data: schema, + graphData + }) +} + +/** + * + * @param {number} page + */ +const getProjects = (page=0) => { + let _page = page; + /** + * @type {{project: ProjectItem[], totalPages: number}} + */ + const res = reactive({ + project: [], + totalPages: 0 + }); + const canLoad = ref(true); + const nextPage = () => { + if (_page === res.totalPages){ + return; + } + ep.get('/endpoint/project', {params: { + page: _page + 1 + }}) + .then((data)=>{ + canLoad.value = data.projects.length!==0 + res.totalPages = data.totalPages; + res.project.push(...data.projects); + _page += 1; + }); + } + ep.get('/endpoint/project', {params: {_page}}) + .then((data)=>{ + canLoad.value = data.projects.length!==0 + res.totalPages = data.totalPages; + res.project = data.projects; + }); + return {res, nextPage, canLoad} +} + +/** + * + * @param {number} id + */ +const getProjectInfo = (id) => { + /** + * @type {import('vue').Ref} + */ + const data = ref(null); + const error = ref(false); + const loading = ref(true); + ep.get(`/endpoint/project/${id}`) + .then((res)=>{ + data.value = res; + }) + .catch(()=>{ + error.value = true; + }) + .finally(()=>{ + loading.value = false; + }) + return {data, loading, error}; +} + +const useProjects = () => { + return { + getProjects, + deleteProject, + rename, + save, + newProject, + getProjectInfo + } +} + +export default useProjects \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useProperties.js b/dl-flow-frontend/packages/controller/src/useProperties.js new file mode 100644 index 0000000..81e132a --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useProperties.js @@ -0,0 +1,219 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { toRaw, nextTick, shallowReactive, ref } from 'vue' +import { getNode, setState, updateRect } from '@opentiny/tiny-engine-canvas' +import useCanvas from './useCanvas' +import useResource from './useResource' +import useTranslate from './useTranslate' + +const propsUpdateKey = ref(0) + +const otherBaseKey = { + className: { + property: 'className', + type: 'string', + defaultValue: '', + label: { + text: { + zh_CN: '样式类' + } + }, + cols: 12, + rules: [], + widget: { + component: 'MetaInput', + props: {} + } + }, + id: { + property: 'id', + type: 'string', + defaultValue: '', + label: { + text: { + zh_CN: '元素id值' + } + }, + cols: 12, + rules: [], + widget: { + component: 'MetaInput', + props: {} + } + }, + ref: { + property: 'ref', + type: 'string', + defaultValue: '', + label: { + text: { + zh_CN: 'ref引用类' + } + }, + cols: 12, + rules: [], + widget: { + component: 'MetaInput', + props: {} + } + } +} + +const patchOtherName = (content = []) => { + const otherName = ['ref', 'className', 'id'] + otherName.forEach((e) => { + if (!content.find(({ property }) => property === e)) { + content.unshift(JSON.parse(JSON.stringify(otherBaseKey[e]))) + } + }) +} + +const getSlotSwitch = (properties, slots = {}) => { + if (Object.keys(slots).length) { + properties.push({ + label: { + zh_CN: '插槽信息' + }, + description: { + zh_CN: '插槽信息' + }, + content: [ + { + property: 'slots', + labelPosition: 'none', + bindState: false, + widget: { + component: 'MetaSlot', + props: { + slots + } + }, + description: { + zh_CN: '插槽开关' + } + } + ] + }) + } +} + +/** + * 合并元数据与pageSchema中的实际属性 + * @param {*} pageProps 实际节点属性 + * @param {*} groups 组件元数据 + * @returns + */ +const mergeProps = (pageProps = {}, groups = []) => { + const group = groups.map(({ content = [], ...group }) => { + return { + ...group, + content: (content || []).map(({ widget, ...prop }) => { + const { props, ...meta } = widget + const modelValue = pageProps[prop.property] === undefined ? prop.defaultValue : pageProps[prop.property] + + return { + ...prop, + widget: { ...meta, props: { ...props, modelValue } } + } + }) + } + }) + + return group +} + +const translateProp = (value) => { + if (value?.type === 'i18n') { + return useTranslate().translate(value) + } + + return value +} + +/** + * 生成属性面版渲染数据 + * @param {*} instance 画布上当前选中节点信息 + */ + +const properties = shallowReactive({ + schema: null, + parent: null +}) + +const getProps = (schema, parent) => { + // 现在选中的节点和当前节点一样,不需要重新计算 + if (schema && properties.schema !== schema) { + const { props, componentName } = schema + const { schema: metaSchema, content, properties } = useResource().getMaterial(componentName) + const schemaProps = properties || metaSchema?.properties || content?.schema?.properties || [] + const propGroups = [...schemaProps] + + patchOtherName(propGroups[0]?.content) + getSlotSwitch(propGroups, metaSchema?.slots) + useCanvas().pageState.properties = mergeProps(toRaw(props), propGroups) + } else if (!schema) { + useCanvas().pageState.properties = {} + } + + properties.schema = schema + properties.parent = parent +} + +const setProp = (name, value) => { + if (!properties.schema) { + return + } + + properties.schema.props = properties.schema.props || {} + + if (value === '' || value === undefined || value === null) { + delete properties.schema.props[name] + } else { + properties.schema.props[name] = value + } + + // 没有父级,或者不在节点上面,要更新内容。就用setState + getNode(properties.schema.id, true).parent || setState(useCanvas().getPageSchema().state) + propsUpdateKey.value++ + nextTick(updateRect) +} + +const getProp = (key) => { + return (properties.schema.props || {})[key] +} + +const delProp = (name) => { + const props = properties.schema.props || {} + delete props[name] + propsUpdateKey.value++ +} + +const setProps = (schema) => { + Object.entries(schema.props || {}).map(([key, value]) => setProp(key, value)) +} + +export default function () { + return { + getProps, + getProp, + setProps, + mergeProps, + delProp, + setProp, + translateProp, + getSchema(parent) { + return parent ? properties : properties.schema + }, + propsUpdateKey + } +} diff --git a/dl-flow-frontend/packages/controller/src/useProperty.js b/dl-flow-frontend/packages/controller/src/useProperty.js new file mode 100644 index 0000000..f6e8a93 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useProperty.js @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { computed } from 'vue' +import { extend } from '@opentiny/vue-renderless/common/object' +import { constants } from '@opentiny/tiny-engine-utils' +import useBlock from './useBlock' + +const { SCHEMA_DATA_TYPE } = constants + +// 遍历区块属性,查找已关联的组件属性 +const findLinked = ({ componentProperties, componentId, blockProperties }) => { + for (let i = 0; i < blockProperties.length; i++) { + const property = blockProperties[i] + + if (property.linked && componentId === property.linked.id) { + addPropertyLinks({ + componentProperties, + linked: { ...property.linked, blockProperty: property.property }, + defaultValue: property.defaultValue, + propertyName: property.linked.property + }) + } + } +} + +// 给组件属性添加关联信息 +const addPropertyLinks = ({ linked, propertyName, componentProperties }) => { + for (let i = 0; i < componentProperties.length; i++) { + const propertyList = componentProperties[i].content + + for (let j = 0; j < propertyList.length; j++) { + const property = propertyList[j] + + if (property.property === propertyName) { + propertyList[j] = extend(true, {}, property, { + linked, + widget: { + props: { + modelValue: { + type: SCHEMA_DATA_TYPE.JSExpression, + value: `this.props.${linked.blockProperty}` + } + } + } + }) + } + } + } +} + +// 重置组件属性的关联信息 +const resetLink = (properties) => { + if (properties && Array.isArray(properties)) { + properties.forEach((group) => { + if (group?.content && Array.isArray(group.content)) { + group.content.forEach((property) => { + property.linked = null + }) + } + }) + } +} + +export default ({ pageState }) => { + const { getCurrentBlock, getBlockProperties } = useBlock() + + const properties = computed(() => { + // 区块消费时区块属性有关联信息需要重置 + resetLink(pageState.properties) + // 区块编辑态下设置组件关联信息 + if (pageState.isBlock && pageState.currentSchema?.id) { + findLinked({ + componentProperties: pageState.properties, + componentId: pageState.currentSchema.id, + blockProperties: getBlockProperties(getCurrentBlock()) + }) + } + + return pageState.properties + }) + + return { + properties + } +} diff --git a/dl-flow-frontend/packages/controller/src/useResource.js b/dl-flow-frontend/packages/controller/src/useResource.js new file mode 100644 index 0000000..9345297 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useResource.js @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +// I know it looks like ugly. But we need type check /(ToT)/~~ + +/** + * + * + * @typedef {object} Label + * @prop {string} zh_CN + * @prop {string} en_US + * + * + * @typedef {Object} LayerItem + * @prop {string|number} id + * @prop {Label} label + * @prop {string} code + * @prop {string} clazz + * @prop {import('@opentiny/tiny-engine-controller/useX6').Property[]} properties + * + * @typedef {LayerItem[]} Layer + * + * @typedef {Object} Type + * + * @prop {string} id + * @prop {Label} label + * @prop {string} type + * @prop {boolean} optional + * @prop {string} [default] + * @typedef {{[x:string]:Type[]}} Types + * + * @typedef {Object} ResState + * @prop {import('@opentiny/tiny-engine-controller/useX6').MaterialInfo[]} materials + * @prop {Types} types + * @prop {Layer} layer + * + */ +import { getGlobalConfig } from './globalConfig' +import { reactive, ref, computed } from 'vue' +import { useHttp, useEndpoint } from '@opentiny/tiny-engine-http' +import { isProdEnv, isMock } from '@opentiny/tiny-engine-common/js/environments' +const http = isProdEnv ? useHttp() : useEndpoint(); + +const resState = reactive({ + /**@type {import('@opentiny/tiny-engine-controller/useX6').MaterialInfo[]} */ + nn: [], + /** @type {Types} */ + types: {}, + /** @type {Layer} */ + layer: [] +}) + +/** + * + * @param {[ResState]} data + */ +const registerNN = (data) => { + return new Promise((resolve) => { + data?.layer?.forEach((layer) => { + resState.layer.push(layer) + }) + data?.materials?.forEach((n)=>{ + resState.nn.push(n); + }) + + resState.types = data.types + resolve(data) + }) +} + +/** + * @description 获取所有的基础网络 + */ +const fetchNN = async () => { + const { dslMode, canvasOptions, materialHost } = getGlobalConfig() + const bundleUrls = canvasOptions[dslMode].material + const loading = ref(true) + const error = ref(false) + const reason = ref() + const nn = computed(() => resState.nn) + let p; + if (isMock){ + p = Promise.allSettled(bundleUrls.map((url) => http.get(url))) + } else { + p = Promise.allSettled([http.get(materialHost)]) + } + p.then((res) => { + return res.map((v) => (v.status === 'fulfilled' ? v.value : {})) + }) + .then((res)=>{ + registerNN(res[0]); + }) + .catch((err) => { + error.value = true + reason.value = err + }) + .finally(() => { + loading.value = false + }) + return { + nn, + loading, + error, + reason + } +} + +export default function () { + return { + resState, + fetchNN + } +} diff --git a/dl-flow-frontend/packages/controller/src/useSaveLocal.js b/dl-flow-frontend/packages/controller/src/useSaveLocal.js new file mode 100644 index 0000000..fdd88c8 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useSaveLocal.js @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { Modal } from '@opentiny/vue' +import { VITE_ORIGIN } from '@opentiny/tiny-engine-common/js/environments' +import useCanvas from './useCanvas' +import { getGlobalConfig } from './globalConfig' + +// 获取当前页面的全量信息 + +const bridge = window.vscodeBridge + +const confirmSaveLocal = async () => { + const { pageState, setSaved } = useCanvas() + const currentPageId = pageState.currentPageId || pageState.currentPage.id + const currentPageName = pageState.currentPageName || pageState.currentPage.name + + const savePage = await bridge.callHandler('save-page', { + api: `${VITE_ORIGIN}/app-service/api/pages/code/${currentPageId}`, + pageName: currentPageName, + pageId: currentPageId, + platformId: getGlobalConfig()?.platformId + }) + + if (savePage.error) { + Modal.message({ message: savePage.error.message, status: 'error', duration: '5000', top: 60 }) + return + } + + const errorMsg = savePage.data.reason + ? `保存文件到本地失败!失败原因:${savePage.data.reason}` + : '保存文件到本地失败!' + + const message = savePage.data.isSuccess ? '保存文件到本地成功' : errorMsg + + savePage.data.isSuccess && setSaved(true) + + Modal.message({ message, status: 'error', duration: '5000', top: 60 }) +} + +const savePageLocal = async () => { + // 查询本地页面文件是否存在 + const { currentPageId, currentPageName, currentPage } = useCanvas().pageState + const fileExistRes = await bridge.callHandler('page-is-exist', { + pageName: currentPageName || currentPage.name, + pageId: currentPageId || currentPage.id, + platformId: getGlobalConfig()?.platformId + }) + + // 查询本地文件失败:存在同名文件 / 接口报错 + if (fileExistRes.error) { + Modal.message({ message: fileExistRes.error.message, status: 'error', duration: '5000', top: 60 }) + return + } + + // 如果本地不存在同名文件,执行保存文件到本地操作 + if (!fileExistRes.data.isExist) { + confirmSaveLocal() + return + } + + // 如果本地存在同名文件,需要询问用户是否覆盖 + Modal.confirm({ + title: '查询本地文件', + message: '本地已经存在同名文件,是否覆盖?' + }).then((res) => { + res === 'confirm' && confirmSaveLocal() + }) +} + +export default () => { + return { + confirmSaveLocal, + savePageLocal + } +} diff --git a/dl-flow-frontend/packages/controller/src/useSchema.js b/dl-flow-frontend/packages/controller/src/useSchema.js new file mode 100644 index 0000000..dc046b0 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useSchema.js @@ -0,0 +1,132 @@ +import {reactive} from 'vue'; +import { Channel } from '../utils'; +/** + * @typedef {Object} Meta + * @prop {string|string[]} [start] 整个流程图起始节点ID + * @prop {string|string[]} [end] 整个流程图结束节点的ID + */ +/** + * @typedef {Object} Relation + * @prop {string} source + * @prop {string} target + */ +/** + * @typedef {Object} Schema + * @prop {Meta} meta + * @prop {{cells: import('@antv/x6').Cell[], edges: import('@antv/x6').Edge[]}} payload + */ + + +/** + * @type {import('vue').UnwrapNestedRefs} + */ +const schema = reactive({ + meta:{ + start: '', + end: '', + }, + payload: { + cells: [], + edges: [] + } +}) + +const eventEmitter = new Channel(); + +/** + * + * @param {()=>void} cb + */ +const onSchemaChange = (cb) => { + eventEmitter.on('schema-change', cb); +} + +const notifyChange = () => { + eventEmitter.emit('schema-change', schema); +} + +/** + * + * @param {import('@antv/x6').Cell | string} node + */ +const setStartNode = (node)=>{ + if (!node){ + return; + } + schema.meta.start = node?.id ?? node; + notifyChange() +} +/** + * + * @param {import('@antv/x6').Cell | string} node + */ +const setEndNode = (node) => { + if (!node){ + return; + } + schema.meta.end = node?.id ?? node; + notifyChange() +} + +const unsetEndNode = () => { + schema.meta.end = ''; + notifyChange(); +} +const unsetStartNode = () => { + schema.meta.start = ''; + notifyChange(); +} +const hasStartNode = () => { + schema.meta.start !== ''; + notifyChange(); +} +const hasEndNode = () => { + schema.meta.end !== ''; + notifyChange(); +} + +/** + * + * @param {import('@antv/x6').Cell|string} cell + */ +const isStartNode = (cell) => (cell?.id ?? cell) === schema.meta.start; +/** + * + * @param {import('@antv/x6').Cell|string} cell + */ +const isEndNode = (cell) => (cell?.id ?? cell) === schema.meta.end; + +const clearStartNode = () => schema.meta.start = ''; +const clearEndNode = () => schema.meta.end = ''; + +const updateSchema = (obj) => { + schema.payload = obj; + notifyChange(); +} + +const updateSchemaFull = (obj) => { + schema.payload = obj.payload; + schema.meta = obj.meta; + notifyChange(); +} + + +export default ()=>{ + return { + schema, + setStartNode, + setEndNode, + unsetEndNode, + unsetStartNode, + hasStartNode, + hasEndNode, + isStartNode, + isEndNode, + clearStartNode, + clearEndNode, + updateSchema, + onSchemaChange, + notifyChange, + updateSchemaFull + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useSearchParam.js b/dl-flow-frontend/packages/controller/src/useSearchParam.js new file mode 100644 index 0000000..d4490ea --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useSearchParam.js @@ -0,0 +1,10 @@ +/** + * + * @param {string} path + * @returns {URLSearchParams} + */ +const useSearchParam = (path) => { + return new URLSearchParams(path) +} + +export default useSearchParam; \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useSession.js b/dl-flow-frontend/packages/controller/src/useSession.js new file mode 100644 index 0000000..03287a6 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useSession.js @@ -0,0 +1,11 @@ +export const useSession = () => { + const get = (key) => { + sessionStorage.getItem(key); + return true; + } + const set = (key, value) => { + sessionStorage.setItem(key, value); + return true; + } + return {get, set} +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useState.js b/dl-flow-frontend/packages/controller/src/useState.js new file mode 100644 index 0000000..63fb2ec --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useState.js @@ -0,0 +1,15 @@ +import {ref} from 'vue'; +import {createGlobalState} from '@vueuse/core'; +const useState = createGlobalState(()=>{ + const loading = ref(false); + const name = ref(''); + const renameLoading = ref(false); + return { + loading, + name, + renameLoading + } +}) + + +export default useState; \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useTranslate.js b/dl-flow-frontend/packages/controller/src/useTranslate.js new file mode 100644 index 0000000..7d7d2c1 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useTranslate.js @@ -0,0 +1,255 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive, ref } from 'vue' +import { useHttp } from '@opentiny/tiny-engine-http' +import { utils } from '@opentiny/tiny-engine-utils' +import { setLocales } from '@opentiny/tiny-engine-canvas' +import { isVsCodeEnv } from '@opentiny/tiny-engine-common/js/environments' +import { constants } from '@opentiny/tiny-engine-utils' +import { generateI18n } from '@opentiny/tiny-engine-common/js/vscodeGenerateFile' +import useResource from './useResource' +import { PROP_DATA_TYPE } from '../utils' + +const { HOST_TYPE } = constants +const state = reactive({ + langs: {} +}) + +const currentLanguage = ref('zh_CN') +const i18nResource = reactive({ messages: {}, locales: [] }) +const i18nApi = '/app-center/api/i18n/entries' +const globalParams = { + host: '', + host_type: '' +} + +const getLangs = () => state.langs + +const setLangs = (newLangs = {}) => { + state.langs = newLangs +} + +const removeI18n = (key = []) => { + if (!key.length) { + return + } + + const langs = getLangs() + key.forEach((element) => { + delete langs[element] + }) + + useHttp().post(`${i18nApi}/bulk/delete`, { + ...globalParams, + key_in: key + }) +} + +/** + * + * @param {Object} obj 国际化对象 + * @param {Boolean} send 为true时表示需要向后台发起请求进行新增或修改 + * @returns + */ + +const ensureI18n = (obj, send) => { + const { locales } = i18nResource + const contents = Object.fromEntries(locales.map(({ lang }) => [lang, obj[lang]])) + const langs = getLangs() + const key = obj.key || utils.guid() + + if (send) { + const exist = langs[key] + + globalParams.host && + useHttp().post(`${i18nApi}/${exist ? 'update' : 'create'}`, { + ...globalParams, + key, + contents + }) + + locales.forEach((lang) => { + if (i18nResource[lang]?.[key]) { + i18nResource[lang][key] = contents[lang] + } + }) + + // VsCode环境生成本地国际化 + if (isVsCodeEnv) { + generateI18n({ + key, + contents + }) + } + } + + try { + const messages = {} + Object.entries(contents).forEach(([locale, message]) => { + messages[locale] = { + [key]: message + } + }) + + setLocales(messages, true) + } catch (e) { + // 不需要处理,有报错的词条会在画布初始化的时候统一调setLocales这个方法 + } + + langs[key] = { key, ...contents, type: PROP_DATA_TYPE.I18N } + + return langs[contents.key] +} + +const getI18nData = () => { + return useHttp().get(i18nApi, { + params: { ...globalParams, _limit: -1 } + }) +} + +const getI18n = async ({ init, local }) => { + const { resState } = useResource() + + if (local) { + const locales = resState?.langs?.locales || [] + const messages = {} + const langs = getLangs() + + if (Array.isArray(locales)) { + locales.forEach(({ lang }) => { + messages[lang] = {} + + Object.entries(langs).forEach(([key, message]) => { + messages[lang][key] = message[lang] + }) + }) + } + + return { locales, messages } + } else { + const i18n = init ? resState.langs : await getI18nData + + return i18n + } +} + +const initI18n = async ({ host, hostType, init, local }) => { + globalParams.host = host + const hostTypeVar = 'host_type' + globalParams[hostTypeVar] = hostType || HOST_TYPE.App + + const { locales = [], messages = {} } = await getI18n({ host, hostType, init, local }) + + const langs = locales.map((item) => item.lang) + + const firstLangData = messages[langs[0] || 'zh_CN'] + + i18nResource.locales = locales + i18nResource.messages = messages + + Object.keys(firstLangData || {}).forEach((key) => { + const i18n = { key } + + langs.forEach((lang) => messages[lang] && Object.assign(i18n, { [lang]: messages[lang][key] })) + ensureI18n(i18n) + }) +} + +const initAppI18n = async (appId) => { + if (appId) { + await initI18n({ + host: appId, + hostType: HOST_TYPE.App + }) + setLocales(i18nResource.messages) + } +} + +const initBlockI18n = async (blockId) => { + if (blockId) { + await initI18n({ + host: blockId, + hostType: HOST_TYPE.Block + }) + setLocales(i18nResource.messages) + } +} + +const initBlockLocalI18n = async (langs = {}) => { + setLangs(langs) + await initI18n({ + host: '', + hostType: HOST_TYPE.Block, + local: true + }) + setLocales(i18nResource.messages) +} + +const format = (str = '', params = {}) => str.replace(/\$\{(.+?)\}/g, (substr, key) => params[key] || '') + +const translate = (obj) => { + const { type, key = utils.guid() } = obj || {} + + if (type === PROP_DATA_TYPE.I18N) { + const langs = getLangs() + const i18n = langs[key] + const langData = i18n || obj + + return format(langData[currentLanguage.value] || langData.key, obj.params) + } + + return obj +} + +const getData = () => i18nResource.messages + +const batchCreateI18n = ({ host, hostType }) => { + if (!host) { + return + } + + globalParams.host = host + globalParams.host_type = hostType + + const { locales } = i18nResource + const langs = getLangs() + + const entries = Object.entries(langs).map(([key, message]) => ({ + key, + contents: Object.fromEntries(locales.map(({ lang }) => [lang, message[lang]])) + })) + + useHttp().post(`${i18nApi}/batch/create`, { + ...globalParams, + entries + }) +} + +export default () => { + return { + i18nResource, + currentLanguage, + getLangs, + setLangs, + getData, + translate, + removeI18n, + ensureI18n, + initI18n, + batchCreateI18n, + initAppI18n, + initBlockI18n, + getI18nData, + initBlockLocalI18n + } +} diff --git a/dl-flow-frontend/packages/controller/src/useVisitor.js b/dl-flow-frontend/packages/controller/src/useVisitor.js new file mode 100644 index 0000000..dd06d68 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useVisitor.js @@ -0,0 +1,205 @@ +/** + * Used for visit ast + */ + +import { Python3Visitor } from 'dt-python-parser' +/** + * @type {Set} + */ +const classNames = new Set() + +/** + * @type {Map} + */ +const clazzFnMemberRecord = new Map() +const visitor = (children, _that) => { + for (const child of children) { + if (child.children && child.children.length) { + child.accept(_that) + } + } +} +export class Visitor extends Python3Visitor { + activeClass = '' + activeFn = '' + /** + * @type {[string,string][]} + */ + activeArgs = [] + visitClassdef(ctx) { + if (!ctx.children) { + return [] + } + const clazzIdentifierIdx = ctx.children + .map((child, idx) => { + if (child.children && child.children.length) { + return child.accept(this) + } + return child.getText() === 'class' ? idx : -1 + }) + .flat(Infinity) + .filter((idx) => idx > -1 && idx !== undefined) + if (!clazzIdentifierIdx.length) { + return [] + } + for (const idx of clazzIdentifierIdx) { + /** + * @type {string|undefined} + */ + const clazzName = ctx.children[idx + 1].getText() + if (!classNames.has(ctx.children[idx + 1]) && classNames !== undefined) { + classNames.add(clazzName) + } + } + } + visitFuncdef(ctx) { + const name = ctx.children[1]?.getText() + this.activeFn = name + visitor(ctx.children, this) + while (ctx.parentCtx) { + ctx = ctx.parentCtx + if (ctx.ruleIndex === 77) { + break + } + } + const className = ctx.children[1]?.getText?.() + if (className) { + let fnMember = clazzFnMemberRecord.get(className) + if (!clazzFnMemberRecord.get(className)) { + clazzFnMemberRecord.set(className, new Map()) + fnMember = clazzFnMemberRecord.get(className) + } + fnMember.set(this.activeFn, [...this.activeArgs]) + this.activeArgs = [] + } + } + visitParameters(ctx) { + visitor(ctx.children, this) + } + visitTfpdef(ctx) { + const types = ctx.getText().split(':') + const name = types[0] + const type = types[1] ?? 'any' + this.activeArgs.push([name, type]) + } +} + +/** + * @description + * 例如 `{direction:'left'}|{getDirection:()=>string}` 是和类型 + * + * 但 `{direction:'left'}&{getDirection:()=>string}` 不是和类型,因为是积类型 + * @param {string} typeString + * @returns {boolean} + */ +const isSumType = (typeString) => typeString.includes('|') +/** + * @description + * 例如 `{direction:'left'}&{getDirection:()=>string}` 是积类型 + * + * 但 `{direction:'left'}|{getDirection:()=>string}` 不是, 它是和类型 + * @param {string} typeString + * @returns boolean + */ +const isProductType = (typeString) => typeString.includes('&') + +const levelType = { + any: 1000000, + string: 9, + object: 9, + ParamAttr: 9, + number: 8, + boolean: 7 +} + +/** + * + * @param {string} type + * @returns {string} + */ +const standardizationType = (type) => { + /** + * @param {string} type + */ + const standardizationTypeName = (type) => { + if (type === 'ParamAttr') { + return type + } + let _type = type.toLowerCase() + if (_type === 'any') { + return 'any' + } + if (_type.startsWith('str')) { + return 'string' + } + if (_type === 'int' || _type === 'float') { + return 'number' + } + if (_type.startsWith('obj')) { + return 'object' + } + } + if (!isSumType(type) && !isProductType(type)) { + return standardizationTypeName(type) + } + const typeStack = type + .split('&') + .map((v) => v.split('|')) + .flat(Infinity) + const typeLevelTable = typeStack.map((type) => { + return { + coin: levelType[type] ?? 0, + val: type + } + }) + return typeLevelTable.sort((a, b) => a.coin - b.coin)[0] +} + +/** + * @param {[string,string][]} args + */ +const toProperty = (args) => { + return args.map( + /** + * + * @param {[string, strig]} param0 + * @returns {import('./useX6').Property} + */ + ([argName, argType]) => { + return { + id: argName, + label: { + zh_CN: argName, + en_US: argName + }, + type: standardizationType(argType), + default: '' + } + } + ) +} + +const v = new Visitor() +export const useVisitor = () => { + const getClassNames = () => { + return classNames + } + /** + * + * @param {string} className + * @returns {import('./useX6').Property[]} + */ + const getProperty = (className) => { + const args = clazzFnMemberRecord.get(className)?.get('__init__') + if (!args.length) { + return [] + } + return toProperty(args) + } + return { + visitor: v, + getClassNames, + toProperty, + getProperty + } +} diff --git a/dl-flow-frontend/packages/controller/src/useWS.js b/dl-flow-frontend/packages/controller/src/useWS.js new file mode 100644 index 0000000..97bb464 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useWS.js @@ -0,0 +1,71 @@ +import {io} from 'socket.io-client'; +import {useSessionStorage} from '@vueuse/core' + +const token = useSessionStorage('token', ''); + +const client = io({ + path: '/socket.io', + retries: 0, + extraHeaders: { + authorization: token.value + } +}) + +client.on('unauth', ()=>{ + window.location.href = '/authentication.html' +}) + +/** + * + * @param {(socket: import('socket.io-client').Socket)=>void} cb + */ +const onConnect = (cb) => { + client.on('connection', (socket) => { + cb(socket); + }) +} +/** + * + * @param {(message: string)=>void} cb + */ +const onProgess = (cb) => { + client.on('progress', cb); +} +/** + * + * @param {(message: string)=>void} cb + */ +const onFinish = (cb) => { + client.on('finish', cb); +} + +/** + * + * @param {(reason: string)=>void} cb + */ +const onError = (cb) => { + client.on('err', cb); +} + +/** + * + * @param {(fileName: string)=>void} cb + */ +const onDone = (cb) => { + client.on('done', cb); +} + +export default ()=>{ + /** + * + * @param {(socket: import('socket.io-client').Socket)=>void} cb + */ + return { + client, + onConnect, + onProgess, + onFinish, + onError, + onDone + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/src/useX6.js b/dl-flow-frontend/packages/controller/src/useX6.js new file mode 100644 index 0000000..2fe4169 --- /dev/null +++ b/dl-flow-frontend/packages/controller/src/useX6.js @@ -0,0 +1,426 @@ +import { Graph, Path } from '@antv/x6' +import { register } from '@antv/x6-vue-shape' +import { AlgoNode, GroupNode } from '@opentiny/tiny-engine-canvas' +import { Selection } from '@antv/x6-plugin-selection' +import { Keyboard } from '@antv/x6-plugin-keyboard' +import { Notify } from '@opentiny/vue'; +/** + * @typedef {Object} + * @prop {'L1Decay' | 'L2Decay'} type + * @prop {number} val + */ +/** + * @typedef {Object} ParamAttr + * @prop {string} id + * @prop {string} [name] + * @prop {null} [initializer] + * @prop {number} [learning_rate] + * @prop {Regularizer} [regularizer] + * @prop {boolean} [trainable] + * @prop {boolean} [do_model_average] + * @prop {boolean} [need_clip] + */ +/** + * @typedef {Object} Property + * @property {number} order + * @property {string} id + * @property {{zh_CN:string,en_US:string}} label + * @property {'number'|'string'|'boolean'|'enums'|'ParamAttr'|'list'} type + * @property {{id:number,label:string,value:any,default?:boolean}[]} [enums] + * @property {any} default + * @property {'boolean'|'string'|'number'} [items] + * @prop {number | string | boolean | ParamAttr} data - 用于存储Property数据 + */ +/** + * @typedef {Object} MaterialInfo - 物料信息 + * @prop {string} id 用于标识以及转码时候插入 + * @prop {{zh_CN: string, en_US: string}} label - 物料名称 + * @prop {string|undefined} nnName - 如果为网络,网络名称 + * @prop {string} desc - 简介 + * @prop {boolean} nn - 是否为网络 + * @prop {'nn'|'layer'|'backbone'|'utils'} mode + * @prop {Property[]} properties - 配置信息 + */ +/** + * @typedef {{materials: MaterialInfo[]}} Materials + */ +/** + * + * @param {`in-${string}` | `out-${string}`} a + * @param {`in-${string}` | `out-${string}`} b + */ +/** + * @type {Graph|null} + */ +let g = null +/** + * + * @param {import('@antv/x6').Cell} node + */ +const isGroup = (node) => node.shape.includes('group'); +/** @type {import('@antv/x6').Graph.Options} */ +const DEFAULT_OPTION = { + background: { + color: '#F2F7FA' + }, + grid: { + visible: true, + type: 'doubleMesh', + args: [ + { + color: '#eee', + thickness: 1 + }, + { + color: '#ddd', + thickness: 1, + factor: 4 + } + ] + }, + panning: true, + mousewheel: { + enabled: true, + modifiers: 'shift', + maxScale: 10, + minScale: 0.1 + }, + autoResize: true, + connecting: { + snap: true, + allowBlank: false, + allowLoop: false, + highlight: true, + allowNode: false, + connector: 'algo-connector', + connectionPoint: 'anchor', + anchor: 'center', + allowMulti: true, + validateMagnet() { + return true; + }, + createEdge() { + return g.createEdge({ + shape: 'dag-edge', + attrs: { + line: { + strokeDasharray: '5 5' + } + }, + zIndex: -1 + }) + }, + validateEdge(args) { + const { + edge: { source, target }, + } = args + const [sourceCell, targetCell] = [g.getCellById(source.cell), g.getCellById(target.cell)]; + if (!sourceCell.isNode() || !targetCell.isNode()){ + return false; + } + if (!isGroup(sourceCell) && !isGroup(targetCell)){ + if (sourceCell.getParentId() !== targetCell.getParentId()){ + Notify({ + type: 'error', + message: '不允许越过组进行连接', + position: 'top-right' + }) + return false; + } + return (source.port.includes('in') && target.port.includes('out')) || + (source.port.includes('out') && target.port.includes('in')) + } + if (isGroup(sourceCell) || isGroup(targetCell)){ + const group = isGroup(sourceCell) ? sourceCell : targetCell; + const node = isGroup(sourceCell) ? targetCell : sourceCell; + if (group.isParentOf(node)){ + return (source.port.includes('out') && target.port.includes('out')) + } + if (group.getParentId() === node.getParentId()){ + return (source.port.includes('in') && target.port.includes('out')) || + (source.port.includes('out') && target.port.includes('in')) + } + } + if (isGroup(sourceCell) || isGroup(targetCell)) { + Notify({ + type: 'error', + message: '不允许组嵌套', + position: 'top-right' + }) + return false; + } + + return (source.port.includes('in') && target.port.includes('out')) || + (source.port.includes('out') && target.port.includes('in')) + } + } +} +let ready = false +const graphPreapre = () => { + if (ready) { + return ready + } + Graph.registerEdge( + 'dag-edge', + { + inherit: 'edge', + attrs: { + line: { + stroke: '#C2C8D5', + strokeWidth: 1, + targetMarker: 'block' + } + } + }, + true + ) + register({ + shape: 'dag-node', + width: 180, + height: 36, + component: AlgoNode, + ports: { + groups: { + top: { + position: 'top', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#C2C8D5', + strokeWidth: 1, + fill: '#fff' + } + } + }, + bottom: { + position: 'bottom', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#C2C8D5', + strokeWidth: 1, + fill: '#fff' + } + } + } + } + } + }) + register({ + shape: 'group-node', + component: GroupNode, + zIndex: -1, + ports: { + groups: { + top: { + position: { + name: 'top', + }, + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#C2C8D5', + strokeWidth: 1, + fill: '#fff', + }, + }, + }, + bottom: { + position: 'bottom', + attrs: { + circle: { + r: 4, + magnet: true, + stroke: '#C2C8D5', + strokeWidth: 1, + fill: '#fff' + } + } + }, + } + } + }) + Graph.registerConnector( + 'algo-connector', + (s, e) => { + const offset = 4 + const deltaY = Math.abs(e.y - s.y) + const control = Math.floor((deltaY / 3) * 2) + + const v1 = { x: s.x, y: s.y + offset + control } + const v2 = { x: e.x, y: e.y - offset - control } + + return Path.normalize( + `M ${s.x} ${s.y} + L ${s.x} ${s.y + offset} + C ${v1.x} ${v1.y} ${v2.x} ${v2.y} ${e.x} ${e.y - offset} + L ${e.x} ${e.y} + ` + ) + }, + true + ) + ready = true + return ready +} +export const getCanvas = () => g + +/** + * + * @param {Property} property + * @param {{[x:string]:import('./useResource').Type}[]} externalType + */ +const processDefaultValue = (property, externalType) => { + /** + * @type {import('./useResource').Type[]} + */ + const paramAttr = externalType.ParamAttr + let data = {} + switch (property.type) { + case 'string': + return property.default ?? '' + case 'number': + return property.default ?? 0 + case 'boolean': + return property.default ?? false + case 'enums': + return property.enums.filter((v) => v.default)[0].value + case 'ParamAttr': + for (const attr of paramAttr) { + data[attr.id] = processDefaultValue(attr, externalType) + } + return data + default: + return ''; + } +} +/** + * + * @param {MaterialInfo} info + * @param {{[x:string]:import('./useResource').Type[]}} types + */ +const addNode = (info, types) => { + const g = getCanvas() + if (info.properties) { + info.properties = info.properties.map((p) => { + let data = '' + if (!data) { + switch (p.type) { + case 'string': + case 'number': + case 'boolean': + data = p.default ?? 0 + break + case 'enums': + data = p.enums.filter((v) => v.default)[0].value + break + case 'any': + data = ''; + break; + case 'ParamAttr': + data = processDefaultValue(p, types) + break + } + } + return { + ...p, + data + } + }) + } + const node = g.addNode({ + shape: 'dag-node', + data: { + ...info + }, + ports: [ + { + id: 'in', + group: 'top' + }, + { + id: 'out', + group: 'bottom' + } + ] + }) + if (!g.getSelectedCellCount()) { + g.centerCell(node) + return + } + const selectNode = g.getSelectedCells().sort((a, b) => a.getBBox().bottom - b.getBBox().bottom)[0] + const { + bottom, + center: { x } + } = selectNode.getBBox() + const { height } = node.getSize() + node.setPosition({ x: x, y: bottom + height }) +} +/** + * @template T + * @param {import('@antv/x6')['Cell']} cell + * @returns {T extends any ? MaterialInfo : T} + */ +const getData = (cell) => { + return cell.getData() +} + +const GROUP_PADDING = 32; +/** + * + * @param {import('@antv/x6').Graph} g + * @param {Object} [obj] + */ +const reRender = (g, obj) => { + g.fromJSON(obj, {silent: false}); + const node = g.getCells()[0]; + if (!node.isNode()){ + return; + } + g.centerCell(node); + return; +} + +/** + * + * @param {string} [id] + * @param {Partial} [option] + */ +const useX6 = (id, option) => { + if (!graphPreapre()) { + throw new Error('出现未知错误') + } + if (!g) { + g = new Graph({ + container: document.getElementById(id), + ...{ + ...option, + ...DEFAULT_OPTION, + embedding: { + enabled: true, + }, + } + }) + g.use( + new Selection({ + enabled: true, + multiple: true, + rubberband: true, + movable: true, + showNodeSelectionBox: true, + modifiers: ['alt'] + }) + ) + g.use(new Keyboard()) + g.bindKey('delete', () => { + const selectCells = g.getSelectedCells() + g.removeCells(selectCells) + }) + } + return { g: g, addNode, getCanvas, getData, GROUP_PADDING, reRender} +} + +export default useX6 diff --git a/dl-flow-frontend/packages/controller/utils.js b/dl-flow-frontend/packages/controller/utils.js new file mode 100644 index 0000000..a658513 --- /dev/null +++ b/dl-flow-frontend/packages/controller/utils.js @@ -0,0 +1,183 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { isObject, isArray } from '@opentiny/vue-renderless/grid/static' + +export const MATERIAL_TYPE = { + Component: 'component', + Block: 'block' +} + +export const NODE_INSERT_TYPE = { + Inside: 'inside', + After: 'after', + Before: 'before', + Replace: 'replace' +} + +export const PROP_DATA_TYPE = { + I18N: 'i18n', + VARIABLE: 'variable', + JSEXPRESSION: 'JSExpression', + JSRESOURCE: 'JSResource', + JSSLOT: 'JSSlot' +} + +/** + * Create a cached version of a pure function. + */ +function cached(fn) { + const cache = Object.create(null) + return function cachedFn(str) { + if (!cache[str]) { + cache[str] = fn(str) + } + return cache[str] + } +} + +/** + * Camelize a hyphen-delimited string. + */ +const camelizeRE = /-(\w)/g +export const camelize = cached((str) => { + return str.replace(camelizeRE, (_, c) => { + return c ? c.toUpperCase() : '' + }) +}) + +/** + * Capitalize a string. + */ +export const capitalize = cached((str) => { + return str.charAt(0).toUpperCase() + str.slice(1) +}) + +const hyphenateRE = /\B([A-Z])/g +export const hyphenate = cached((str) => { + return str.replace(hyphenateRE, '-$1').toLowerCase() +}) + +export const getEnumData = (item) => { + if (item.enum && item.enumNames) { + return item.enum.map((value, index) => ({ value, text: item.enumNames[index] })) + } + return undefined +} + +export const mapTree = (obj = {}, handler, childName = 'children') => { + const children = obj[childName] + const node = handler(obj) + if (Array.isArray(children)) { + node[childName] = children.map((child) => mapTree(child, handler)) + } + + return node +} + +export const mapObj = (source, handler, rootKey) => { + const caller = (obj, key) => { + const { item, deep } = handler(obj, key) + + return deep ? mapObj(item, handler, key) : item + } + + if (isArray(source)) { + return source.map((obj) => caller(obj, rootKey)) + } + + if (source && isObject(source)) { + return Object.keys(source).reduce((output, key) => { + output[key] = caller(source[key], rootKey || key) + + return output + }, {}) + } + + return source +} + +export const generateFunction = (body, context) => { + const Func = Function + try { + return new Func(`return ${body}`).call(context).bind(context) + } catch (error) { + // do nothing + } + return undefined +} + +export const getDefaultProps = (properties = []) => { + const props = {} + + properties.forEach(({ content = [] }) => { + content.forEach(({ defaultValue, schema, property }) => { + const value = Array.isArray(schema) ? getDefaultProps(schema) : defaultValue + + if (value) { + props[property] = value + } + }) + }) + + return props +} + +export class Channel { + constructor(){ + /** + * @type {Mapvoid)[]} + */ + this.map = new Map(); + } + /** + * + * @param {string} name + * @param {(...args: any[])=>void} cb + */ + on(name, cb){ + if (this.map.get(name)){ + this.map.get(name).push(cb); + return; + } + this.map.set(name, [cb]); + } + /** + * + * @param {string} name + * @param {any[]} args + * @returns + */ + emit(name, ...args){ + const fns = this.map.get(name); + if (!fns){ + return; + } + fns.forEach((f) => f(...args)); + } + /** + * + * @param {(...args:any[])=>void} fn + * @returns + */ + off(fn){ + const fns = this.map.get(name); + if (!fns){ + return ; + } + const idx = fns.indexOf(fn); + if (idx === -1){ + return; + } + fns.splice(idx,1); + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/controller/vite.config.js b/dl-flow-frontend/packages/controller/vite.config.js new file mode 100644 index 0000000..aae2b7b --- /dev/null +++ b/dl-flow-frontend/packages/controller/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + build: { + cssCodeSplit: false, + lib: { + entry: { + index: path.resolve(__dirname, './src/index.js'), + adapter: path.resolve(__dirname, './adapter.js'), + utils: path.resolve(__dirname, './utils.js') + }, + name: 'controller', + fileName: (formats, entryName) => `${entryName}.js`, + formats: ['es'] + }, + rollupOptions: { + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/design-core/.env.alpha b/dl-flow-frontend/packages/design-core/.env.alpha new file mode 100644 index 0000000..015943e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/.env.alpha @@ -0,0 +1,7 @@ +# alpha mode, used by the "build:alpha" script + +NODE_ENV=production +VITE_CDN_DOMAIN=https://npm.webcache.cn +VITE_ENDPOINT_URL="http://localhost:9000" +VITE_ENDPOINT_WS_URL="http://localhost:9001" +# VITE_ORIGIN= diff --git a/dl-flow-frontend/packages/design-core/.env.development b/dl-flow-frontend/packages/design-core/.env.development new file mode 100644 index 0000000..9b2159e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/.env.development @@ -0,0 +1,8 @@ +# development mode, used by the "vite" command + +NODE_ENV=development +VITE_CDN_DOMAIN=https://npm.webcache.cn +VITE_ENDPOINT_URL="http://localhost:9000" +VITE_ENDPOINT_WS_URL="http://localhost:9001" +# request data via alpha service +# VITE_ORIGIN= \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/.env.prod b/dl-flow-frontend/packages/design-core/.env.prod new file mode 100644 index 0000000..73659b9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/.env.prod @@ -0,0 +1,7 @@ +# prod mode, used by the "build:prod" script + +NODE_ENV=production +VITE_CDN_DOMAIN=https://npm.webcache.cn +VITE_ENDPOINT_URL="http://localhost:9000" +VITE_ENDPOINT_WS_URL="http://localhost:9001" +#VITE_ORIGIN= \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/.npmignore b/dl-flow-frontend/packages/design-core/.npmignore new file mode 100644 index 0000000..474a335 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/.npmignore @@ -0,0 +1,8 @@ +test +node_modules +package-lock.json +.idea + +public/mock/* +tmp +temp \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/AI.png b/dl-flow-frontend/packages/design-core/assets/AI.png new file mode 100644 index 0000000..05ea374 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/assets/AI.png differ diff --git a/dl-flow-frontend/packages/design-core/assets/accessdeclined.svg b/dl-flow-frontend/packages/design-core/assets/accessdeclined.svg new file mode 100644 index 0000000..ecc26a9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/accessdeclined.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/accordion.svg b/dl-flow-frontend/packages/design-core/assets/accordion.svg new file mode 100644 index 0000000..a58c5db --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/accordion.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/achart.svg b/dl-flow-frontend/packages/design-core/assets/achart.svg new file mode 100644 index 0000000..3f0b059 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/achart.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/add-collection.svg b/dl-flow-frontend/packages/design-core/assets/add-collection.svg new file mode 100644 index 0000000..322b2e7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add-collection.svg @@ -0,0 +1,13 @@ + + + 操作/添加 2 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/add-folder.svg b/dl-flow-frontend/packages/design-core/assets/add-folder.svg new file mode 100644 index 0000000..a357eb3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add-folder.svg @@ -0,0 +1,12 @@ + + + 类型/新建文件夹 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/add-group.svg b/dl-flow-frontend/packages/design-core/assets/add-group.svg new file mode 100644 index 0000000..23a31ee --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add-group.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/add-page-new.svg b/dl-flow-frontend/packages/design-core/assets/add-page-new.svg new file mode 100644 index 0000000..55ca792 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add-page-new.svg @@ -0,0 +1,13 @@ + + + 操作/添加 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/add-page.svg b/dl-flow-frontend/packages/design-core/assets/add-page.svg new file mode 100644 index 0000000..011725e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add-page.svg @@ -0,0 +1,9 @@ + + ic_redirect_plus_lined + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/add-utils.svg b/dl-flow-frontend/packages/design-core/assets/add-utils.svg new file mode 100644 index 0000000..23b8ea0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add-utils.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/add.svg b/dl-flow-frontend/packages/design-core/assets/add.svg new file mode 100644 index 0000000..44f21fa --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/add.svg @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/alert.svg b/dl-flow-frontend/packages/design-core/assets/alert.svg new file mode 100644 index 0000000..02be2f4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/alert.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-content-center.svg b/dl-flow-frontend/packages/design-core/assets/align-content-center.svg new file mode 100644 index 0000000..9005992 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-content-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-content-end.svg b/dl-flow-frontend/packages/design-core/assets/align-content-end.svg new file mode 100644 index 0000000..1009658 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-content-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-content-space-around.svg b/dl-flow-frontend/packages/design-core/assets/align-content-space-around.svg new file mode 100644 index 0000000..c200c8e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-content-space-around.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-content-space-between.svg b/dl-flow-frontend/packages/design-core/assets/align-content-space-between.svg new file mode 100644 index 0000000..90e9cc8 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-content-space-between.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-content-start.svg b/dl-flow-frontend/packages/design-core/assets/align-content-start.svg new file mode 100644 index 0000000..8acd3ae --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-content-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-content-stretch.svg b/dl-flow-frontend/packages/design-core/assets/align-content-stretch.svg new file mode 100644 index 0000000..6f13565 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-content-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-items-baseline.svg b/dl-flow-frontend/packages/design-core/assets/align-items-baseline.svg new file mode 100644 index 0000000..be7f60e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-items-baseline.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-items-center.svg b/dl-flow-frontend/packages/design-core/assets/align-items-center.svg new file mode 100644 index 0000000..ac4d44c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-items-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-items-end.svg b/dl-flow-frontend/packages/design-core/assets/align-items-end.svg new file mode 100644 index 0000000..cda47ff --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-items-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-items-start.svg b/dl-flow-frontend/packages/design-core/assets/align-items-start.svg new file mode 100644 index 0000000..b52a39b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-items-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/align-items-stretch.svg b/dl-flow-frontend/packages/design-core/assets/align-items-stretch.svg new file mode 100644 index 0000000..7cf7af4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/align-items-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/background-color.svg b/dl-flow-frontend/packages/design-core/assets/background-color.svg new file mode 100644 index 0000000..5a5b788 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/background-color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/background-image.svg b/dl-flow-frontend/packages/design-core/assets/background-image.svg new file mode 100644 index 0000000..229cae5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/background-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/bar.svg b/dl-flow-frontend/packages/design-core/assets/bar.svg new file mode 100644 index 0000000..5f95d02 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/bar.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/basic-search.svg b/dl-flow-frontend/packages/design-core/assets/basic-search.svg new file mode 100644 index 0000000..c819bf7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/basic-search.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/bdlayout.svg b/dl-flow-frontend/packages/design-core/assets/bdlayout.svg new file mode 100644 index 0000000..213803f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/bdlayout.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/beingmaintained.svg b/dl-flow-frontend/packages/design-core/assets/beingmaintained.svg new file mode 100644 index 0000000..ce9ff98 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/beingmaintained.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/bem.svg b/dl-flow-frontend/packages/design-core/assets/bem.svg new file mode 100644 index 0000000..d8b74b2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/bem.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/beta.svg b/dl-flow-frontend/packages/design-core/assets/beta.svg new file mode 100644 index 0000000..d9bb147 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/beta.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/bind-variable.svg b/dl-flow-frontend/packages/design-core/assets/bind-variable.svg new file mode 100644 index 0000000..9ccc2b6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/bind-variable.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/block-default-img.svg b/dl-flow-frontend/packages/design-core/assets/block-default-img.svg new file mode 100644 index 0000000..543ff6a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/block-default-img.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/block-manage.svg b/dl-flow-frontend/packages/design-core/assets/block-manage.svg new file mode 100644 index 0000000..9ad7e7b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/block-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-all.svg b/dl-flow-frontend/packages/design-core/assets/border-all.svg new file mode 100644 index 0000000..4ffa181 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-all.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-bottom.svg b/dl-flow-frontend/packages/design-core/assets/border-bottom.svg new file mode 100644 index 0000000..8f93e91 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-bottom.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-left.svg b/dl-flow-frontend/packages/design-core/assets/border-left.svg new file mode 100644 index 0000000..a6f8940 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-left.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-radius-bottomleft.svg b/dl-flow-frontend/packages/design-core/assets/border-radius-bottomleft.svg new file mode 100644 index 0000000..59f226f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-radius-bottomleft.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-radius-bottomright.svg b/dl-flow-frontend/packages/design-core/assets/border-radius-bottomright.svg new file mode 100644 index 0000000..d271d9e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-radius-bottomright.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-radius-multiple.svg b/dl-flow-frontend/packages/design-core/assets/border-radius-multiple.svg new file mode 100644 index 0000000..f1fef4b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-radius-multiple.svg @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-radius-single.svg b/dl-flow-frontend/packages/design-core/assets/border-radius-single.svg new file mode 100644 index 0000000..be7c187 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-radius-single.svg @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-radius-topleft.svg b/dl-flow-frontend/packages/design-core/assets/border-radius-topleft.svg new file mode 100644 index 0000000..b9fb600 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-radius-topleft.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-radius-topright.svg b/dl-flow-frontend/packages/design-core/assets/border-radius-topright.svg new file mode 100644 index 0000000..dce377c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-radius-topright.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-right.svg b/dl-flow-frontend/packages/design-core/assets/border-right.svg new file mode 100644 index 0000000..3692a90 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-right.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-style-dashed.svg b/dl-flow-frontend/packages/design-core/assets/border-style-dashed.svg new file mode 100644 index 0000000..df7c5c9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-style-dashed.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-style-dotted.svg b/dl-flow-frontend/packages/design-core/assets/border-style-dotted.svg new file mode 100644 index 0000000..2318c01 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-style-dotted.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-style-solid.svg b/dl-flow-frontend/packages/design-core/assets/border-style-solid.svg new file mode 100644 index 0000000..1fa74bb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-style-solid.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/border-top.svg b/dl-flow-frontend/packages/design-core/assets/border-top.svg new file mode 100644 index 0000000..b73d8a4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/border-top.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/box.svg b/dl-flow-frontend/packages/design-core/assets/box.svg new file mode 100644 index 0000000..582efb3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/box.svg @@ -0,0 +1,10 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/breadcrumb.svg b/dl-flow-frontend/packages/design-core/assets/breadcrumb.svg new file mode 100644 index 0000000..bd90eda --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/breadcrumb.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/bridge.svg b/dl-flow-frontend/packages/design-core/assets/bridge.svg new file mode 100644 index 0000000..53d4fd6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/bridge.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/button.svg b/dl-flow-frontend/packages/design-core/assets/button.svg new file mode 100644 index 0000000..b0e05b7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/button.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/buttons.svg b/dl-flow-frontend/packages/design-core/assets/buttons.svg new file mode 100644 index 0000000..b9efa9c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/buttons.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/cancel-full-screen.svg b/dl-flow-frontend/packages/design-core/assets/cancel-full-screen.svg new file mode 100644 index 0000000..f2ae2e9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cancel-full-screen.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/canvas-fit.svg b/dl-flow-frontend/packages/design-core/assets/canvas-fit.svg new file mode 100644 index 0000000..ac33f3c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/canvas-fit.svg @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/carousel.svg b/dl-flow-frontend/packages/design-core/assets/carousel.svg new file mode 100644 index 0000000..0da9548 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/carousel.svg @@ -0,0 +1,15 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/carouselitem.svg b/dl-flow-frontend/packages/design-core/assets/carouselitem.svg new file mode 100644 index 0000000..b40cfe4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/carouselitem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/chat-maximize.svg b/dl-flow-frontend/packages/design-core/assets/chat-maximize.svg new file mode 100644 index 0000000..0ea8607 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/chat-maximize.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/chat-message.svg b/dl-flow-frontend/packages/design-core/assets/chat-message.svg new file mode 100644 index 0000000..9e7fd69 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/chat-message.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/chat-microphone.svg b/dl-flow-frontend/packages/design-core/assets/chat-microphone.svg new file mode 100644 index 0000000..486f8a6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/chat-microphone.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/chat-minimize.svg b/dl-flow-frontend/packages/design-core/assets/chat-minimize.svg new file mode 100644 index 0000000..88f0c3f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/chat-minimize.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/checkbox.svg b/dl-flow-frontend/packages/design-core/assets/checkbox.svg new file mode 100644 index 0000000..f2de5a9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/checkbox.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/checkboxgroup.svg b/dl-flow-frontend/packages/design-core/assets/checkboxgroup.svg new file mode 100644 index 0000000..b312c70 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/checkboxgroup.svg @@ -0,0 +1,10 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/checkboxs.svg b/dl-flow-frontend/packages/design-core/assets/checkboxs.svg new file mode 100644 index 0000000..fdbbaa2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/checkboxs.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/checkin.svg b/dl-flow-frontend/packages/design-core/assets/checkin.svg new file mode 100644 index 0000000..3ad506e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/checkin.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/checkout.svg b/dl-flow-frontend/packages/design-core/assets/checkout.svg new file mode 100644 index 0000000..ca19c63 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/checkout.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/clear.svg b/dl-flow-frontend/packages/design-core/assets/clear.svg new file mode 100644 index 0000000..8619e21 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/clear.svg @@ -0,0 +1,13 @@ + + + ic_eraser_lined + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/clock-small.svg b/dl-flow-frontend/packages/design-core/assets/clock-small.svg new file mode 100644 index 0000000..e2b9ae8 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/clock-small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/clock-wise-counter.svg b/dl-flow-frontend/packages/design-core/assets/clock-wise-counter.svg new file mode 100644 index 0000000..c1737d2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/clock-wise-counter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/clock-wise.svg b/dl-flow-frontend/packages/design-core/assets/clock-wise.svg new file mode 100644 index 0000000..ec7b481 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/clock-wise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/close.svg b/dl-flow-frontend/packages/design-core/assets/close.svg new file mode 100644 index 0000000..ce53f7c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/close.svg @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/closest-corner.svg b/dl-flow-frontend/packages/design-core/assets/closest-corner.svg new file mode 100644 index 0000000..8defcf2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/closest-corner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/closest-side.svg b/dl-flow-frontend/packages/design-core/assets/closest-side.svg new file mode 100644 index 0000000..37515b3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/closest-side.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cloud-shell.svg b/dl-flow-frontend/packages/design-core/assets/cloud-shell.svg new file mode 100644 index 0000000..e04bbba --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cloud-shell.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cn.svg b/dl-flow-frontend/packages/design-core/assets/cn.svg new file mode 100644 index 0000000..17459c6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cn.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/col.svg b/dl-flow-frontend/packages/design-core/assets/col.svg new file mode 100644 index 0000000..fbda1f5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/col.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/collapse.svg b/dl-flow-frontend/packages/design-core/assets/collapse.svg new file mode 100644 index 0000000..080b417 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/collapse.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/collection.svg b/dl-flow-frontend/packages/design-core/assets/collection.svg new file mode 100644 index 0000000..8f455f9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/collection.svg @@ -0,0 +1,11 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/copy-outline.svg b/dl-flow-frontend/packages/design-core/assets/copy-outline.svg new file mode 100644 index 0000000..d6c3e64 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/copy-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/copy.svg b/dl-flow-frontend/packages/design-core/assets/copy.svg new file mode 100644 index 0000000..f8d5297 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/copy.svg @@ -0,0 +1,8 @@ + + + 操作/复制 + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cross.svg b/dl-flow-frontend/packages/design-core/assets/cross.svg new file mode 100644 index 0000000..4bdee7c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cross.svg @@ -0,0 +1,10 @@ + + + 全局/关闭 + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-alias.svg b/dl-flow-frontend/packages/design-core/assets/cursor-alias.svg new file mode 100644 index 0000000..cf615aa --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-alias.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-auto.svg b/dl-flow-frontend/packages/design-core/assets/cursor-auto.svg new file mode 100644 index 0000000..a2ecb13 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-auto.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-cell.svg b/dl-flow-frontend/packages/design-core/assets/cursor-cell.svg new file mode 100644 index 0000000..b5ddd25 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-cell.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-col-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-col-resize.svg new file mode 100644 index 0000000..7ee4630 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-col-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-context-menu.svg b/dl-flow-frontend/packages/design-core/assets/cursor-context-menu.svg new file mode 100644 index 0000000..88decec --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-context-menu.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-copy.svg b/dl-flow-frontend/packages/design-core/assets/cursor-copy.svg new file mode 100644 index 0000000..fe39ffb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-copy.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-crosshair.svg b/dl-flow-frontend/packages/design-core/assets/cursor-crosshair.svg new file mode 100644 index 0000000..3a94a5e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-crosshair.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-e-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-e-resize.svg new file mode 100644 index 0000000..5032785 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-e-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-ew-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-ew-resize.svg new file mode 100644 index 0000000..74f7a48 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-ew-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-grab.svg b/dl-flow-frontend/packages/design-core/assets/cursor-grab.svg new file mode 100644 index 0000000..8ff2b2c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-grab.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-grabbing.svg b/dl-flow-frontend/packages/design-core/assets/cursor-grabbing.svg new file mode 100644 index 0000000..47df374 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-grabbing.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-help.svg b/dl-flow-frontend/packages/design-core/assets/cursor-help.svg new file mode 100644 index 0000000..952c6ec --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-help.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-move.svg b/dl-flow-frontend/packages/design-core/assets/cursor-move.svg new file mode 100644 index 0000000..da2d388 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-move.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-n-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-n-resize.svg new file mode 100644 index 0000000..b7295e2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-n-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-ne-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-ne-resize.svg new file mode 100644 index 0000000..9ba4622 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-ne-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-nesw-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-nesw-resize.svg new file mode 100644 index 0000000..b2bc180 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-nesw-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-none.svg b/dl-flow-frontend/packages/design-core/assets/cursor-none.svg new file mode 100644 index 0000000..a3d7e3e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-none.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-not-allowed.svg b/dl-flow-frontend/packages/design-core/assets/cursor-not-allowed.svg new file mode 100644 index 0000000..324df30 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-not-allowed.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-ns-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-ns-resize.svg new file mode 100644 index 0000000..ff628d1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-ns-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-nw-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-nw-resize.svg new file mode 100644 index 0000000..e00c770 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-nw-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-nwse-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-nwse-resize.svg new file mode 100644 index 0000000..fa046f6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-nwse-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-pointer.svg b/dl-flow-frontend/packages/design-core/assets/cursor-pointer.svg new file mode 100644 index 0000000..5e798a4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-pointer.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-progress.svg b/dl-flow-frontend/packages/design-core/assets/cursor-progress.svg new file mode 100644 index 0000000..c6a2771 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-progress.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-row-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-row-resize.svg new file mode 100644 index 0000000..7ca65ed --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-row-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-s-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-s-resize.svg new file mode 100644 index 0000000..1d18741 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-s-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-se-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-se-resize.svg new file mode 100644 index 0000000..3faeb42 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-se-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-sw-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-sw-resize.svg new file mode 100644 index 0000000..c88a666 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-sw-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-text.svg b/dl-flow-frontend/packages/design-core/assets/cursor-text.svg new file mode 100644 index 0000000..d486055 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-text.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-vertical-text.svg b/dl-flow-frontend/packages/design-core/assets/cursor-vertical-text.svg new file mode 100644 index 0000000..a699b14 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-vertical-text.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-w-resize.svg b/dl-flow-frontend/packages/design-core/assets/cursor-w-resize.svg new file mode 100644 index 0000000..16c98fd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-w-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-wait.svg b/dl-flow-frontend/packages/design-core/assets/cursor-wait.svg new file mode 100644 index 0000000..0528fb3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-wait.svg @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-zoom-in.svg b/dl-flow-frontend/packages/design-core/assets/cursor-zoom-in.svg new file mode 100644 index 0000000..2801ba5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-zoom-in.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/cursor-zoom-out.svg b/dl-flow-frontend/packages/design-core/assets/cursor-zoom-out.svg new file mode 100644 index 0000000..f4c5704 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/cursor-zoom-out.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/data.svg b/dl-flow-frontend/packages/design-core/assets/data.svg new file mode 100644 index 0000000..de1c97b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/data.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/datepick.svg b/dl-flow-frontend/packages/design-core/assets/datepick.svg new file mode 100644 index 0000000..677b860 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/datepick.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/daterange.svg b/dl-flow-frontend/packages/design-core/assets/daterange.svg new file mode 100644 index 0000000..9159c82 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/daterange.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/delete.svg b/dl-flow-frontend/packages/design-core/assets/delete.svg new file mode 100644 index 0000000..03d1807 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/delete.svg @@ -0,0 +1,11 @@ + + + 操作/删除 + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/descend.svg b/dl-flow-frontend/packages/design-core/assets/descend.svg new file mode 100644 index 0000000..d1bdb91 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/descend.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/desktop-large.svg b/dl-flow-frontend/packages/design-core/assets/desktop-large.svg new file mode 100644 index 0000000..51690b6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/desktop-large.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/dialogbox.svg b/dl-flow-frontend/packages/design-core/assets/dialogbox.svg new file mode 100644 index 0000000..3889208 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/dialogbox.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/display-block.svg b/dl-flow-frontend/packages/design-core/assets/display-block.svg new file mode 100644 index 0000000..99e4c35 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/display-block.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/display-flex.svg b/dl-flow-frontend/packages/design-core/assets/display-flex.svg new file mode 100644 index 0000000..98bdc1d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/display-flex.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/display-grid.svg b/dl-flow-frontend/packages/design-core/assets/display-grid.svg new file mode 100644 index 0000000..305e298 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/display-grid.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/display-inline-block.svg b/dl-flow-frontend/packages/design-core/assets/display-inline-block.svg new file mode 100644 index 0000000..1c10000 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/display-inline-block.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/display-inline.svg b/dl-flow-frontend/packages/design-core/assets/display-inline.svg new file mode 100644 index 0000000..214c2a4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/display-inline.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/dragger.svg b/dl-flow-frontend/packages/design-core/assets/dragger.svg new file mode 100644 index 0000000..ed906ca --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/dragger.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/dropdown.svg b/dl-flow-frontend/packages/design-core/assets/dropdown.svg new file mode 100644 index 0000000..bf4ce3d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/dropdown.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/edit.svg b/dl-flow-frontend/packages/design-core/assets/edit.svg new file mode 100644 index 0000000..aeafe44 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/edit.svg @@ -0,0 +1,11 @@ + + + 操作/编辑 2 + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/ellipsis.svg b/dl-flow-frontend/packages/design-core/assets/ellipsis.svg new file mode 100644 index 0000000..7f0e7b6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/ellipsis.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/empty-action.svg b/dl-flow-frontend/packages/design-core/assets/empty-action.svg new file mode 100644 index 0000000..357df95 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/empty-action.svg @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/empty-data.svg b/dl-flow-frontend/packages/design-core/assets/empty-data.svg new file mode 100644 index 0000000..26dccc9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/empty-data.svg @@ -0,0 +1,19 @@ + + emptydata + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/empty.svg b/dl-flow-frontend/packages/design-core/assets/empty.svg new file mode 100644 index 0000000..055253a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/empty.svg @@ -0,0 +1,27 @@ + + + 空数据 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/en.svg b/dl-flow-frontend/packages/design-core/assets/en.svg new file mode 100644 index 0000000..877870f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/en.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/events.svg b/dl-flow-frontend/packages/design-core/assets/events.svg new file mode 100644 index 0000000..d96ad7e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/events.svg @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/expand.svg b/dl-flow-frontend/packages/design-core/assets/expand.svg new file mode 100644 index 0000000..3a6bfa6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/expand.svg @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/eye-invisible.svg b/dl-flow-frontend/packages/design-core/assets/eye-invisible.svg new file mode 100644 index 0000000..cbe2feb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/eye-invisible.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/eye.svg b/dl-flow-frontend/packages/design-core/assets/eye.svg new file mode 100644 index 0000000..42be6ff --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/eye.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/farthest-corner.svg b/dl-flow-frontend/packages/design-core/assets/farthest-corner.svg new file mode 100644 index 0000000..c791bda --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/farthest-corner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/farthest-side.svg b/dl-flow-frontend/packages/design-core/assets/farthest-side.svg new file mode 100644 index 0000000..f1890e8 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/farthest-side.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/fixed.svg b/dl-flow-frontend/packages/design-core/assets/fixed.svg new file mode 100644 index 0000000..d7c8ce6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/fixed.svg @@ -0,0 +1,7 @@ + + + 操作/未固定 + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-alignbaselinerow.svg b/dl-flow-frontend/packages/design-core/assets/flex-alignbaselinerow.svg new file mode 100644 index 0000000..3609843 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-alignbaselinerow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-aligncenterrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-aligncenterrow.svg new file mode 100644 index 0000000..8050c98 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-aligncenterrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-alignflex-endrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-alignflex-endrow.svg new file mode 100644 index 0000000..946d635 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-alignflex-endrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-alignflex-startrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-alignflex-startrow.svg new file mode 100644 index 0000000..1ae35c0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-alignflex-startrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-alignstretchrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-alignstretchrow.svg new file mode 100644 index 0000000..259602e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-alignstretchrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-directioncolumn-reverse.svg b/dl-flow-frontend/packages/design-core/assets/flex-directioncolumn-reverse.svg new file mode 100644 index 0000000..517c724 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-directioncolumn-reverse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-directioncolumn.svg b/dl-flow-frontend/packages/design-core/assets/flex-directioncolumn.svg new file mode 100644 index 0000000..2f1ff77 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-directioncolumn.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-directionrow-reverse.svg b/dl-flow-frontend/packages/design-core/assets/flex-directionrow-reverse.svg new file mode 100644 index 0000000..cbaa8cd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-directionrow-reverse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-directionrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-directionrow.svg new file mode 100644 index 0000000..bd4b7d5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-directionrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-justifycenterrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-justifycenterrow.svg new file mode 100644 index 0000000..bfe683f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-justifycenterrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-justifyflex-endrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-justifyflex-endrow.svg new file mode 100644 index 0000000..7f970a0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-justifyflex-endrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-justifyflex-startrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-justifyflex-startrow.svg new file mode 100644 index 0000000..a788a94 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-justifyflex-startrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-justifyspace-aroundrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-justifyspace-aroundrow.svg new file mode 100644 index 0000000..063c656 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-justifyspace-aroundrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flex-justifyspace-betweenrow.svg b/dl-flow-frontend/packages/design-core/assets/flex-justifyspace-betweenrow.svg new file mode 100644 index 0000000..2ceea34 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flex-justifyspace-betweenrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-add.svg b/dl-flow-frontend/packages/design-core/assets/flow-add.svg new file mode 100644 index 0000000..73ffde4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-add.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-bottom.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-bottom.svg new file mode 100644 index 0000000..0ff7d00 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-bottom.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-left.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-left.svg new file mode 100644 index 0000000..e237485 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-left.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-level.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-level.svg new file mode 100644 index 0000000..cdde2e5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-level.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-rf.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-rf.svg new file mode 100644 index 0000000..d33e4ea --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-rf.svg @@ -0,0 +1,27 @@ + + + icon9 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-right.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-right.svg new file mode 100644 index 0000000..2fc31a2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-right.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-top.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-top.svg new file mode 100644 index 0000000..8dcc0f6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-top.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-align-vertical.svg b/dl-flow-frontend/packages/design-core/assets/flow-align-vertical.svg new file mode 100644 index 0000000..2963685 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-align-vertical.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-box-select-rf.svg b/dl-flow-frontend/packages/design-core/assets/flow-box-select-rf.svg new file mode 100644 index 0000000..402dc90 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-box-select-rf.svg @@ -0,0 +1,21 @@ + + + 框选 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-box-select.svg b/dl-flow-frontend/packages/design-core/assets/flow-box-select.svg new file mode 100644 index 0000000..4e9fb70 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-box-select.svg @@ -0,0 +1,41 @@ + + + + +Created with Sketch. + + + + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-checkmark.svg b/dl-flow-frontend/packages/design-core/assets/flow-checkmark.svg new file mode 100644 index 0000000..799de6c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-checkmark.svg @@ -0,0 +1 @@ +checkmark \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-clear.svg b/dl-flow-frontend/packages/design-core/assets/flow-clear.svg new file mode 100644 index 0000000..d0d8780 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-clear.svg @@ -0,0 +1,16 @@ + + + icon7 + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-cross.svg b/dl-flow-frontend/packages/design-core/assets/flow-cross.svg new file mode 100644 index 0000000..266e8ec --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-cross.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-delete.svg b/dl-flow-frontend/packages/design-core/assets/flow-delete.svg new file mode 100644 index 0000000..47b3f64 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-delete.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-download.svg b/dl-flow-frontend/packages/design-core/assets/flow-download.svg new file mode 100644 index 0000000..9f7cb78 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-download.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-edit.svg b/dl-flow-frontend/packages/design-core/assets/flow-edit.svg new file mode 100644 index 0000000..ea80621 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-edit.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-empty.svg b/dl-flow-frontend/packages/design-core/assets/flow-empty.svg new file mode 100644 index 0000000..d580e0f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-empty.svg @@ -0,0 +1,26 @@ + + 小 暂无数据 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-failure.svg b/dl-flow-frontend/packages/design-core/assets/flow-failure.svg new file mode 100644 index 0000000..cd15fca --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-failure.svg @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-file-download.svg b/dl-flow-frontend/packages/design-core/assets/flow-file-download.svg new file mode 100644 index 0000000..f215dc1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-file-download.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-fullscreen-icon.svg b/dl-flow-frontend/packages/design-core/assets/flow-fullscreen-icon.svg new file mode 100644 index 0000000..8b8b07b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-fullscreen-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-guide.svg b/dl-flow-frontend/packages/design-core/assets/flow-guide.svg new file mode 100644 index 0000000..8ad4496 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-guide.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-help-center.svg b/dl-flow-frontend/packages/design-core/assets/flow-help-center.svg new file mode 100644 index 0000000..cb1234b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-help-center.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-location.svg b/dl-flow-frontend/packages/design-core/assets/flow-location.svg new file mode 100644 index 0000000..3e18a61 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-location.svg @@ -0,0 +1,21 @@ + + + icon5 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-minscreen-icon.svg b/dl-flow-frontend/packages/design-core/assets/flow-minscreen-icon.svg new file mode 100644 index 0000000..8c0f398 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-minscreen-icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-navigation.svg b/dl-flow-frontend/packages/design-core/assets/flow-navigation.svg new file mode 100644 index 0000000..cc1b5ca --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-navigation.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-params-rf.svg b/dl-flow-frontend/packages/design-core/assets/flow-params-rf.svg new file mode 100644 index 0000000..9f701ac --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-params-rf.svg @@ -0,0 +1,9 @@ + + + 画板 + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-params.svg b/dl-flow-frontend/packages/design-core/assets/flow-params.svg new file mode 100644 index 0000000..a4f7bed --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-params.svg @@ -0,0 +1,49 @@ + + + 编组 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-prompt.svg b/dl-flow-frontend/packages/design-core/assets/flow-prompt.svg new file mode 100644 index 0000000..58b2bad --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-prompt.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-redo.svg b/dl-flow-frontend/packages/design-core/assets/flow-redo.svg new file mode 100644 index 0000000..0361bdd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-redo.svg @@ -0,0 +1,15 @@ + + + xiugai111 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-reduce.svg b/dl-flow-frontend/packages/design-core/assets/flow-reduce.svg new file mode 100644 index 0000000..460059e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-reduce.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-refresh.svg b/dl-flow-frontend/packages/design-core/assets/flow-refresh.svg new file mode 100644 index 0000000..dfc3c4a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-refresh.svg @@ -0,0 +1,12 @@ + + + 刷新 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-requirestar.svg b/dl-flow-frontend/packages/design-core/assets/flow-requirestar.svg new file mode 100644 index 0000000..4d42822 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-requirestar.svg @@ -0,0 +1,14 @@ + + + 星号 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-select.svg b/dl-flow-frontend/packages/design-core/assets/flow-select.svg new file mode 100644 index 0000000..68445c1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-select.svg @@ -0,0 +1,18 @@ + + + + +Created with Sketch. + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-set-bottom.svg b/dl-flow-frontend/packages/design-core/assets/flow-set-bottom.svg new file mode 100644 index 0000000..c34ff14 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-set-bottom.svg @@ -0,0 +1,27 @@ + + + icon0 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-set-top.svg b/dl-flow-frontend/packages/design-core/assets/flow-set-top.svg new file mode 100644 index 0000000..b78cb94 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-set-top.svg @@ -0,0 +1,27 @@ + + + icon-a + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-success.svg b/dl-flow-frontend/packages/design-core/assets/flow-success.svg new file mode 100644 index 0000000..c75a6c6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-success.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-undo.svg b/dl-flow-frontend/packages/design-core/assets/flow-undo.svg new file mode 100644 index 0000000..a6dcf09 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-undo.svg @@ -0,0 +1,16 @@ + + + xiugai111 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-view-rf.svg b/dl-flow-frontend/packages/design-core/assets/flow-view-rf.svg new file mode 100644 index 0000000..6c934fb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-view-rf.svg @@ -0,0 +1,13 @@ + + + 编组 31 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-view.svg b/dl-flow-frontend/packages/design-core/assets/flow-view.svg new file mode 100644 index 0000000..0568015 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-view.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/flow-zoom-in.svg b/dl-flow-frontend/packages/design-core/assets/flow-zoom-in.svg new file mode 100644 index 0000000..ae64378 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-zoom-in.svg @@ -0,0 +1,12 @@ + + + icon4 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/flow-zoom-out.svg b/dl-flow-frontend/packages/design-core/assets/flow-zoom-out.svg new file mode 100644 index 0000000..4a0300b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/flow-zoom-out.svg @@ -0,0 +1,12 @@ + + + icon4 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/fold-outline.svg b/dl-flow-frontend/packages/design-core/assets/fold-outline.svg new file mode 100644 index 0000000..a13f5ec --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/fold-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/folder-wold.svg b/dl-flow-frontend/packages/design-core/assets/folder-wold.svg new file mode 100644 index 0000000..1aa966c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/folder-wold.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/folder.svg b/dl-flow-frontend/packages/design-core/assets/folder.svg new file mode 100644 index 0000000..ce14556 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/folder.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/font-style-italic.svg b/dl-flow-frontend/packages/design-core/assets/font-style-italic.svg new file mode 100644 index 0000000..cbb3036 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/font-style-italic.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/font-style-none.svg b/dl-flow-frontend/packages/design-core/assets/font-style-none.svg new file mode 100644 index 0000000..8dcdd57 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/font-style-none.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/form.svg b/dl-flow-frontend/packages/design-core/assets/form.svg new file mode 100644 index 0000000..3eb5cf0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/form.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/formfield.svg b/dl-flow-frontend/packages/design-core/assets/formfield.svg new file mode 100644 index 0000000..35daddc --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/formfield.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/formitem.svg b/dl-flow-frontend/packages/design-core/assets/formitem.svg new file mode 100644 index 0000000..c097e40 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/formitem.svg @@ -0,0 +1,2 @@ + + diff --git a/dl-flow-frontend/packages/design-core/assets/frozenpage.svg b/dl-flow-frontend/packages/design-core/assets/frozenpage.svg new file mode 100644 index 0000000..5f6066f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/frozenpage.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/full-screen.svg b/dl-flow-frontend/packages/design-core/assets/full-screen.svg new file mode 100644 index 0000000..71f2eb1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/full-screen.svg @@ -0,0 +1,30 @@ + + + 操作/全屏 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/generate-code.svg b/dl-flow-frontend/packages/design-core/assets/generate-code.svg new file mode 100644 index 0000000..2c78583 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/generate-code.svg @@ -0,0 +1,17 @@ + + + 操作/下载 + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/grid-column-flex.svg b/dl-flow-frontend/packages/design-core/assets/grid-column-flex.svg new file mode 100644 index 0000000..c855bf0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/grid-column-flex.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/grid-row-auto.svg b/dl-flow-frontend/packages/design-core/assets/grid-row-auto.svg new file mode 100644 index 0000000..c0e1295 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/grid-row-auto.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/grid.svg b/dl-flow-frontend/packages/design-core/assets/grid.svg new file mode 100644 index 0000000..32abffe --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/grid.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/h1.svg b/dl-flow-frontend/packages/design-core/assets/h1.svg new file mode 100644 index 0000000..79506ba --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/h16.svg b/dl-flow-frontend/packages/design-core/assets/h16.svg new file mode 100644 index 0000000..c3f7d7f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h16.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/h2.svg b/dl-flow-frontend/packages/design-core/assets/h2.svg new file mode 100644 index 0000000..34ee332 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/h3.svg b/dl-flow-frontend/packages/design-core/assets/h3.svg new file mode 100644 index 0000000..85f4886 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/h4.svg b/dl-flow-frontend/packages/design-core/assets/h4.svg new file mode 100644 index 0000000..b3e2183 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/h5.svg b/dl-flow-frontend/packages/design-core/assets/h5.svg new file mode 100644 index 0000000..11d5a58 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h5.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/h6.svg b/dl-flow-frontend/packages/design-core/assets/h6.svg new file mode 100644 index 0000000..008ebf3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/h6.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/help-center.svg b/dl-flow-frontend/packages/design-core/assets/help-center.svg new file mode 100644 index 0000000..45b4885 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/help-center.svg @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/help.svg b/dl-flow-frontend/packages/design-core/assets/help.svg new file mode 100644 index 0000000..68233e3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/help.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/histogram.svg b/dl-flow-frontend/packages/design-core/assets/histogram.svg new file mode 100644 index 0000000..d0ed4ef --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/histogram.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/home-outline.svg b/dl-flow-frontend/packages/design-core/assets/home-outline.svg new file mode 100644 index 0000000..6ccdc65 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/home-outline.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/home.svg b/dl-flow-frontend/packages/design-core/assets/home.svg new file mode 100644 index 0000000..2cb522a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/home.svg @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/hr.svg b/dl-flow-frontend/packages/design-core/assets/hr.svg new file mode 100644 index 0000000..4ae70e2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/hr.svg @@ -0,0 +1,8 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/icon.svg b/dl-flow-frontend/packages/design-core/assets/icon.svg new file mode 100644 index 0000000..34dae44 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/image.svg b/dl-flow-frontend/packages/design-core/assets/image.svg new file mode 100644 index 0000000..07c59d4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/image.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/input.svg b/dl-flow-frontend/packages/design-core/assets/input.svg new file mode 100644 index 0000000..6a47c50 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/input.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/js.svg b/dl-flow-frontend/packages/design-core/assets/js.svg new file mode 100644 index 0000000..25c11a4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/js.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/json.svg b/dl-flow-frontend/packages/design-core/assets/json.svg new file mode 100644 index 0000000..84ffaee --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/json.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-content-center.svg b/dl-flow-frontend/packages/design-core/assets/justify-content-center.svg new file mode 100644 index 0000000..c34402e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-content-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-content-end.svg b/dl-flow-frontend/packages/design-core/assets/justify-content-end.svg new file mode 100644 index 0000000..db8fda4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-content-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-content-space-around.svg b/dl-flow-frontend/packages/design-core/assets/justify-content-space-around.svg new file mode 100644 index 0000000..e4b2f03 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-content-space-around.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-content-space-between.svg b/dl-flow-frontend/packages/design-core/assets/justify-content-space-between.svg new file mode 100644 index 0000000..3a1861d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-content-space-between.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-content-start.svg b/dl-flow-frontend/packages/design-core/assets/justify-content-start.svg new file mode 100644 index 0000000..e9a323a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-content-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-content-stretch.svg b/dl-flow-frontend/packages/design-core/assets/justify-content-stretch.svg new file mode 100644 index 0000000..fa7ef67 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-content-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-items-baseline.svg b/dl-flow-frontend/packages/design-core/assets/justify-items-baseline.svg new file mode 100644 index 0000000..bb52268 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-items-baseline.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-items-center.svg b/dl-flow-frontend/packages/design-core/assets/justify-items-center.svg new file mode 100644 index 0000000..8f1387a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-items-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-items-end.svg b/dl-flow-frontend/packages/design-core/assets/justify-items-end.svg new file mode 100644 index 0000000..20a3fc4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-items-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-items-start.svg b/dl-flow-frontend/packages/design-core/assets/justify-items-start.svg new file mode 100644 index 0000000..ab1a1a4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-items-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/justify-items-stretch.svg b/dl-flow-frontend/packages/design-core/assets/justify-items-stretch.svg new file mode 100644 index 0000000..bbc5d53 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/justify-items-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/language.svg b/dl-flow-frontend/packages/design-core/assets/language.svg new file mode 100644 index 0000000..068f881 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/language.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/laptop-cut-corner.svg b/dl-flow-frontend/packages/design-core/assets/laptop-cut-corner.svg new file mode 100644 index 0000000..3b49fe0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/laptop-cut-corner.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/line.svg b/dl-flow-frontend/packages/design-core/assets/line.svg new file mode 100644 index 0000000..a1d1eae --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/line.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/linear-gradient.svg b/dl-flow-frontend/packages/design-core/assets/linear-gradient.svg new file mode 100644 index 0000000..c1c4c32 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/linear-gradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/link.svg b/dl-flow-frontend/packages/design-core/assets/link.svg new file mode 100644 index 0000000..85f8219 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/link.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/list.svg b/dl-flow-frontend/packages/design-core/assets/list.svg new file mode 100644 index 0000000..05edc61 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/list.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/loading.svg b/dl-flow-frontend/packages/design-core/assets/loading.svg new file mode 100644 index 0000000..299e8aa --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/loading.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/location.svg b/dl-flow-frontend/packages/design-core/assets/location.svg new file mode 100644 index 0000000..a5e4e9a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/location.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/locked-outline.svg b/dl-flow-frontend/packages/design-core/assets/locked-outline.svg new file mode 100644 index 0000000..69f5b2e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/locked-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/locked.svg b/dl-flow-frontend/packages/design-core/assets/locked.svg new file mode 100644 index 0000000..dc8a8eb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/locked.svg @@ -0,0 +1,10 @@ + + + ic_locked_lined + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/logout.svg b/dl-flow-frontend/packages/design-core/assets/logout.svg new file mode 100644 index 0000000..5026ac9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/logout.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/margin.svg b/dl-flow-frontend/packages/design-core/assets/margin.svg new file mode 100644 index 0000000..faf1eb7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/margin.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/materials.svg b/dl-flow-frontend/packages/design-core/assets/materials.svg new file mode 100644 index 0000000..7cf24ce --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/materials.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/menu.svg b/dl-flow-frontend/packages/design-core/assets/menu.svg new file mode 100644 index 0000000..9f13785 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/menu.svg @@ -0,0 +1,13 @@ + + + ic_menul_line_lined + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/mobile-landscape.svg b/dl-flow-frontend/packages/design-core/assets/mobile-landscape.svg new file mode 100644 index 0000000..50786bd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/mobile-landscape.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/mobile-portrai.svg b/dl-flow-frontend/packages/design-core/assets/mobile-portrai.svg new file mode 100644 index 0000000..7b0a1dd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/mobile-portrai.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/new-page.svg b/dl-flow-frontend/packages/design-core/assets/new-page.svg new file mode 100644 index 0000000..ef15cdd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/new-page.svg @@ -0,0 +1,13 @@ + + + 操作/定位到面板 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/news.svg b/dl-flow-frontend/packages/design-core/assets/news.svg new file mode 100644 index 0000000..5b97910 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/news.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/nonsupportregion.svg b/dl-flow-frontend/packages/design-core/assets/nonsupportregion.svg new file mode 100644 index 0000000..78803a6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/nonsupportregion.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/notify-alarm.svg b/dl-flow-frontend/packages/design-core/assets/notify-alarm.svg new file mode 100644 index 0000000..6525033 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/notify-alarm.svg @@ -0,0 +1,11 @@ + + + alarm + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/notify-failure.svg b/dl-flow-frontend/packages/design-core/assets/notify-failure.svg new file mode 100644 index 0000000..f43ef8a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/notify-failure.svg @@ -0,0 +1,11 @@ + + + failure + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/notify-prompt.svg b/dl-flow-frontend/packages/design-core/assets/notify-prompt.svg new file mode 100644 index 0000000..4c88ecc --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/notify-prompt.svg @@ -0,0 +1,11 @@ + + + prompt + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/notify-success.svg b/dl-flow-frontend/packages/design-core/assets/notify-success.svg new file mode 100644 index 0000000..e6308a7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/notify-success.svg @@ -0,0 +1,11 @@ + + + success + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/numeric.svg b/dl-flow-frontend/packages/design-core/assets/numeric.svg new file mode 100644 index 0000000..4fc04e7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/numeric.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/overflow-scroll.svg b/dl-flow-frontend/packages/design-core/assets/overflow-scroll.svg new file mode 100644 index 0000000..028a7b7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/overflow-scroll.svg @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/padding.svg b/dl-flow-frontend/packages/design-core/assets/padding.svg new file mode 100644 index 0000000..fe4f6e5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/padding.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/page-schema.svg b/dl-flow-frontend/packages/design-core/assets/page-schema.svg new file mode 100644 index 0000000..ab4b1b6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/page-schema.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/page.svg b/dl-flow-frontend/packages/design-core/assets/page.svg new file mode 100644 index 0000000..7241678 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/page.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/pager.svg b/dl-flow-frontend/packages/design-core/assets/pager.svg new file mode 100644 index 0000000..5961938 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/pager.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/paragraph.svg b/dl-flow-frontend/packages/design-core/assets/paragraph.svg new file mode 100644 index 0000000..da5e4d7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/paragraph.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/pencil-thick.svg b/dl-flow-frontend/packages/design-core/assets/pencil-thick.svg new file mode 100644 index 0000000..f9c06a7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/pencil-thick.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/pie.svg b/dl-flow-frontend/packages/design-core/assets/pie.svg new file mode 100644 index 0000000..c9d07ad --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/pie.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-help.svg b/dl-flow-frontend/packages/design-core/assets/plugin-help.svg new file mode 100644 index 0000000..1431b3c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-help.svg @@ -0,0 +1 @@ +帮助中心 \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-data.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-data.svg new file mode 100644 index 0000000..f0f7a87 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-data.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-js.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-js.svg new file mode 100644 index 0000000..f912d10 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-js.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-language.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-language.svg new file mode 100644 index 0000000..780b81b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-language.svg @@ -0,0 +1,20 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-materials.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-materials.svg new file mode 100644 index 0000000..3124072 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-materials.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-page-schema.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-page-schema.svg new file mode 100644 index 0000000..f64793b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-page-schema.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-page.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-page.svg new file mode 100644 index 0000000..41aaecc --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-page.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-plugin-help.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-plugin-help.svg new file mode 100644 index 0000000..d5a5e9c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-plugin-help.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-robot.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-robot.svg new file mode 100644 index 0000000..82212f3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-robot.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-sresources.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-sresources.svg new file mode 100644 index 0000000..94786d6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-sresources.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-symbol.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-symbol.svg new file mode 100644 index 0000000..495d60d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-symbol.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-tree.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-tree.svg new file mode 100644 index 0000000..b37d62c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-tree.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-tutorial.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-tutorial.svg new file mode 100644 index 0000000..aaf5a08 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-tutorial.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plugin-icon-var.svg b/dl-flow-frontend/packages/design-core/assets/plugin-icon-var.svg new file mode 100644 index 0000000..18c15a6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plugin-icon-var.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/plus-circle.svg b/dl-flow-frontend/packages/design-core/assets/plus-circle.svg new file mode 100644 index 0000000..a0bbe29 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plus-circle.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/plus.svg b/dl-flow-frontend/packages/design-core/assets/plus.svg new file mode 100644 index 0000000..73ffde4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/plus.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/popeditor.svg b/dl-flow-frontend/packages/design-core/assets/popeditor.svg new file mode 100644 index 0000000..5a846e1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/popeditor.svg @@ -0,0 +1,15 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/popover.svg b/dl-flow-frontend/packages/design-core/assets/popover.svg new file mode 100644 index 0000000..bb5c624 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/popover.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/position-all.svg b/dl-flow-frontend/packages/design-core/assets/position-all.svg new file mode 100644 index 0000000..d911e6c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-all.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-bottom-left.svg b/dl-flow-frontend/packages/design-core/assets/position-bottom-left.svg new file mode 100644 index 0000000..6734d57 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-bottom-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-bottom-right.svg b/dl-flow-frontend/packages/design-core/assets/position-bottom-right.svg new file mode 100644 index 0000000..87b46dc --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-bottom-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-bottom.svg b/dl-flow-frontend/packages/design-core/assets/position-bottom.svg new file mode 100644 index 0000000..de8468b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-bottom.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-left.svg b/dl-flow-frontend/packages/design-core/assets/position-left.svg new file mode 100644 index 0000000..0a14b8f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-right.svg b/dl-flow-frontend/packages/design-core/assets/position-right.svg new file mode 100644 index 0000000..45df771 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-top-left.svg b/dl-flow-frontend/packages/design-core/assets/position-top-left.svg new file mode 100644 index 0000000..965c7bc --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-top-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-top-right.svg b/dl-flow-frontend/packages/design-core/assets/position-top-right.svg new file mode 100644 index 0000000..0068080 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-top-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/position-top.svg b/dl-flow-frontend/packages/design-core/assets/position-top.svg new file mode 100644 index 0000000..2fc39c9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/position-top.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/preview.svg b/dl-flow-frontend/packages/design-core/assets/preview.svg new file mode 100644 index 0000000..da9964e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/preview.svg @@ -0,0 +1,12 @@ + + + 操作/播放1 + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/prompt.svg b/dl-flow-frontend/packages/design-core/assets/prompt.svg new file mode 100644 index 0000000..9652fa1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/prompt.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/radar.svg b/dl-flow-frontend/packages/design-core/assets/radar.svg new file mode 100644 index 0000000..e758f79 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/radar.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/radial-gradient.svg b/dl-flow-frontend/packages/design-core/assets/radial-gradient.svg new file mode 100644 index 0000000..a01f766 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/radial-gradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/radio.svg b/dl-flow-frontend/packages/design-core/assets/radio.svg new file mode 100644 index 0000000..41ee7ab --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/radio.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/realtime-flow.svg b/dl-flow-frontend/packages/design-core/assets/realtime-flow.svg new file mode 100644 index 0000000..3465dc4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/realtime-flow.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/redo.svg b/dl-flow-frontend/packages/design-core/assets/redo.svg new file mode 100644 index 0000000..9c84d4c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/redo.svg @@ -0,0 +1,12 @@ + + + 操作/还原 2 + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/refresh.svg b/dl-flow-frontend/packages/design-core/assets/refresh.svg new file mode 100644 index 0000000..762d72d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/refresh.svg @@ -0,0 +1,13 @@ + + + 操作/刷新 2 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/report.svg b/dl-flow-frontend/packages/design-core/assets/report.svg new file mode 100644 index 0000000..257119f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/report.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/resources.svg b/dl-flow-frontend/packages/design-core/assets/resources.svg new file mode 100644 index 0000000..469e788 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/resources.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/return.svg b/dl-flow-frontend/packages/design-core/assets/return.svg new file mode 100644 index 0000000..0897b35 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/return.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/rf-alarm.svg b/dl-flow-frontend/packages/design-core/assets/rf-alarm.svg new file mode 100644 index 0000000..d31ce33 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/rf-alarm.svg @@ -0,0 +1,11 @@ + + + alarm + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-ecs.svg b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-ecs.svg new file mode 100644 index 0000000..933fb2a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-ecs.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-evs.svg b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-evs.svg new file mode 100644 index 0000000..f864d6a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-evs.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-rds.svg b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-rds.svg new file mode 100644 index 0000000..efb34b3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-rds.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-vpc.svg b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-vpc.svg new file mode 100644 index 0000000..a85acdc --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/rf-resources/flowchart-vpc.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/ring.svg b/dl-flow-frontend/packages/design-core/assets/ring.svg new file mode 100644 index 0000000..09aeb9b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/ring.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/row.svg b/dl-flow-frontend/packages/design-core/assets/row.svg new file mode 100644 index 0000000..7c31b07 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/row.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/save.svg b/dl-flow-frontend/packages/design-core/assets/save.svg new file mode 100644 index 0000000..157897b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/save.svg @@ -0,0 +1,12 @@ + + + 操作/保存 + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/search.svg b/dl-flow-frontend/packages/design-core/assets/search.svg new file mode 100644 index 0000000..6fe9f41 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/search.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/select.svg b/dl-flow-frontend/packages/design-core/assets/select.svg new file mode 100644 index 0000000..c5d8b4c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/select.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/setting-outline.svg b/dl-flow-frontend/packages/design-core/assets/setting-outline.svg new file mode 100644 index 0000000..6a391f9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/setting-outline.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/setting.svg b/dl-flow-frontend/packages/design-core/assets/setting.svg new file mode 100644 index 0000000..852a945 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/setting.svg @@ -0,0 +1,13 @@ + + + 操作/设置 2 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/slot.svg b/dl-flow-frontend/packages/design-core/assets/slot.svg new file mode 100644 index 0000000..79ed51c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/slot.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/small-list.svg b/dl-flow-frontend/packages/design-core/assets/small-list.svg new file mode 100644 index 0000000..db30d39 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/small-list.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/stars.svg b/dl-flow-frontend/packages/design-core/assets/stars.svg new file mode 100644 index 0000000..cedfce5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/stars.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/start.svg b/dl-flow-frontend/packages/design-core/assets/start.svg new file mode 100644 index 0000000..5d56834 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/start.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/style-setting-background-image.svg b/dl-flow-frontend/packages/design-core/assets/style-setting-background-image.svg new file mode 100644 index 0000000..c31fef5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/style-setting-background-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/swiper.svg b/dl-flow-frontend/packages/design-core/assets/swiper.svg new file mode 100644 index 0000000..43ae606 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/swiper.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/switch.svg b/dl-flow-frontend/packages/design-core/assets/switch.svg new file mode 100644 index 0000000..d976f58 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/switch.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/symbol.svg b/dl-flow-frontend/packages/design-core/assets/symbol.svg new file mode 100644 index 0000000..2b96eab --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/symbol.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/table.svg b/dl-flow-frontend/packages/design-core/assets/table.svg new file mode 100644 index 0000000..c8edd03 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/table.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/tablefilter.svg b/dl-flow-frontend/packages/design-core/assets/tablefilter.svg new file mode 100644 index 0000000..da00316 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tablefilter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/tablet-portrait.svg b/dl-flow-frontend/packages/design-core/assets/tablet-portrait.svg new file mode 100644 index 0000000..52fafc3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tablet-portrait.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/tabs.svg b/dl-flow-frontend/packages/design-core/assets/tabs.svg new file mode 100644 index 0000000..0f9156b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tabs.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/tag.svg b/dl-flow-frontend/packages/design-core/assets/tag.svg new file mode 100644 index 0000000..3fcf36c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tag.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/target.svg b/dl-flow-frontend/packages/design-core/assets/target.svg new file mode 100644 index 0000000..9522431 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/target.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-align-center.svg b/dl-flow-frontend/packages/design-core/assets/text-align-center.svg new file mode 100644 index 0000000..b837c74 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-align-center.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-align-justify.svg b/dl-flow-frontend/packages/design-core/assets/text-align-justify.svg new file mode 100644 index 0000000..4a1cc1c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-align-justify.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-align-left.svg b/dl-flow-frontend/packages/design-core/assets/text-align-left.svg new file mode 100644 index 0000000..33b6a60 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-align-left.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-align-right.svg b/dl-flow-frontend/packages/design-core/assets/text-align-right.svg new file mode 100644 index 0000000..8797696 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-align-right.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-copy-page.svg b/dl-flow-frontend/packages/design-core/assets/text-copy-page.svg new file mode 100644 index 0000000..6cf9d0e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-copy-page.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/text-decoration-overline.svg b/dl-flow-frontend/packages/design-core/assets/text-decoration-overline.svg new file mode 100644 index 0000000..396ddf4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-decoration-overline.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-decoration-strike.svg b/dl-flow-frontend/packages/design-core/assets/text-decoration-strike.svg new file mode 100644 index 0000000..5095a65 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-decoration-strike.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-decoration-underline.svg b/dl-flow-frontend/packages/design-core/assets/text-decoration-underline.svg new file mode 100644 index 0000000..05b5983 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-decoration-underline.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-direction-ltr.svg b/dl-flow-frontend/packages/design-core/assets/text-direction-ltr.svg new file mode 100644 index 0000000..cc41134 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-direction-ltr.svg @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-direction-rtl.svg b/dl-flow-frontend/packages/design-core/assets/text-direction-rtl.svg new file mode 100644 index 0000000..5866af9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-direction-rtl.svg @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-common.svg b/dl-flow-frontend/packages/design-core/assets/text-page-common.svg new file mode 100644 index 0000000..13dd986 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-common.svg @@ -0,0 +1,9 @@ + + + 操作/反馈备份 + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-folder-closed.svg b/dl-flow-frontend/packages/design-core/assets/text-page-folder-closed.svg new file mode 100644 index 0000000..c80e854 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-folder-closed.svg @@ -0,0 +1,10 @@ + + + 类型/文件夹 + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-folder.svg b/dl-flow-frontend/packages/design-core/assets/text-page-folder.svg new file mode 100644 index 0000000..39415bb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-folder.svg @@ -0,0 +1,12 @@ + + + 类型/文件夹展开 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-home.svg b/dl-flow-frontend/packages/design-core/assets/text-page-home.svg new file mode 100644 index 0000000..be62073 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-home.svg @@ -0,0 +1,7 @@ + + + 全局/首页 + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-link.svg b/dl-flow-frontend/packages/design-core/assets/text-page-link.svg new file mode 100644 index 0000000..1dbc5e6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-link.svg @@ -0,0 +1,10 @@ + + + 类型/图表/链接到 + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-revert.svg b/dl-flow-frontend/packages/design-core/assets/text-page-revert.svg new file mode 100644 index 0000000..d59a32c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-revert.svg @@ -0,0 +1,9 @@ + + + 返回 back + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-page-review.svg b/dl-flow-frontend/packages/design-core/assets/text-page-review.svg new file mode 100644 index 0000000..3c2c64b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-page-review.svg @@ -0,0 +1,20 @@ + + + 全局/隐藏 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-source-delete.svg b/dl-flow-frontend/packages/design-core/assets/text-source-delete.svg new file mode 100644 index 0000000..090a081 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-source-delete.svg @@ -0,0 +1,13 @@ + + + 删除 delete + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-source-list-add.svg b/dl-flow-frontend/packages/design-core/assets/text-source-list-add.svg new file mode 100644 index 0000000..2daacb4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-source-list-add.svg @@ -0,0 +1,13 @@ + + + 创建/添加 create/add + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-source-list-close.svg b/dl-flow-frontend/packages/design-core/assets/text-source-list-close.svg new file mode 100644 index 0000000..76351fd --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-source-list-close.svg @@ -0,0 +1,12 @@ + + + 全局/关闭 + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-source-list-ref.svg b/dl-flow-frontend/packages/design-core/assets/text-source-list-ref.svg new file mode 100644 index 0000000..6b4d129 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-source-list-ref.svg @@ -0,0 +1,13 @@ + + + 操作/刷新 + + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-source-setting.svg b/dl-flow-frontend/packages/design-core/assets/text-source-setting.svg new file mode 100644 index 0000000..e22e972 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-source-setting.svg @@ -0,0 +1,10 @@ + + + 设置 setting + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-source-string.svg b/dl-flow-frontend/packages/design-core/assets/text-source-string.svg new file mode 100644 index 0000000..0517683 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-source-string.svg @@ -0,0 +1,11 @@ + + + 类型/文本 + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-transform-capitalize.svg b/dl-flow-frontend/packages/design-core/assets/text-transform-capitalize.svg new file mode 100644 index 0000000..0a2a570 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-transform-capitalize.svg @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-transform-lowercase.svg b/dl-flow-frontend/packages/design-core/assets/text-transform-lowercase.svg new file mode 100644 index 0000000..4486a66 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-transform-lowercase.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text-transform-sentence.svg b/dl-flow-frontend/packages/design-core/assets/text-transform-sentence.svg new file mode 100644 index 0000000..1607a37 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text-transform-sentence.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/text.svg b/dl-flow-frontend/packages/design-core/assets/text.svg new file mode 100644 index 0000000..2ded44c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/text.svg @@ -0,0 +1,9 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/tile-x.svg b/dl-flow-frontend/packages/design-core/assets/tile-x.svg new file mode 100644 index 0000000..3c6f808 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tile-x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/tile-xy.svg b/dl-flow-frontend/packages/design-core/assets/tile-xy.svg new file mode 100644 index 0000000..0cd82ec --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tile-xy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/tile-y.svg b/dl-flow-frontend/packages/design-core/assets/tile-y.svg new file mode 100644 index 0000000..12e962c --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tile-y.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/timeline.svg b/dl-flow-frontend/packages/design-core/assets/timeline.svg new file mode 100644 index 0000000..10a659b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/timeline.svg @@ -0,0 +1,12 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/tiny-logo.svg b/dl-flow-frontend/packages/design-core/assets/tiny-logo.svg new file mode 100644 index 0000000..f62b777 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tiny-logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/tooltip.svg b/dl-flow-frontend/packages/design-core/assets/tooltip.svg new file mode 100644 index 0000000..af473eb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tooltip.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom-left.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom-left.svg new file mode 100644 index 0000000..04e0c94 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom-right.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom-right.svg new file mode 100644 index 0000000..a83c196 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom.svg new file mode 100644 index 0000000..2384b99 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-bottom.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-center.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-center.svg new file mode 100644 index 0000000..de1ee09 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-center.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-left.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-left.svg new file mode 100644 index 0000000..b91debe --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-point.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-point.svg new file mode 100644 index 0000000..be219a8 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-point.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-right.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-right.svg new file mode 100644 index 0000000..a77a9af --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-top-left.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-top-left.svg new file mode 100644 index 0000000..e48650f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-top-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-top-right.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-top-right.svg new file mode 100644 index 0000000..6c71fd6 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-top-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/transform-origin-top.svg b/dl-flow-frontend/packages/design-core/assets/transform-origin-top.svg new file mode 100644 index 0000000..6e41633 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/transform-origin-top.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/trash.svg b/dl-flow-frontend/packages/design-core/assets/trash.svg new file mode 100644 index 0000000..47c3fad --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/trash.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/tree-shape.svg b/dl-flow-frontend/packages/design-core/assets/tree-shape.svg new file mode 100644 index 0000000..1c69bec --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tree-shape.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/tree.svg b/dl-flow-frontend/packages/design-core/assets/tree.svg new file mode 100644 index 0000000..b2275e7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tree.svg @@ -0,0 +1,11 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/tutorial.svg b/dl-flow-frontend/packages/design-core/assets/tutorial.svg new file mode 100644 index 0000000..5abdf3f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/tutorial.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/undo.svg b/dl-flow-frontend/packages/design-core/assets/undo.svg new file mode 100644 index 0000000..97f628e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/undo.svg @@ -0,0 +1,11 @@ + + + 操作/撤销 + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/unfold-outline.svg b/dl-flow-frontend/packages/design-core/assets/unfold-outline.svg new file mode 100644 index 0000000..9d4d0c1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/unfold-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/unlocked.svg b/dl-flow-frontend/packages/design-core/assets/unlocked.svg new file mode 100644 index 0000000..79e990f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/unlocked.svg @@ -0,0 +1,10 @@ + + + ic_lock_open_lined + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/var.svg b/dl-flow-frontend/packages/design-core/assets/var.svg new file mode 100644 index 0000000..fc96415 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/var.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/dl-flow-frontend/packages/design-core/assets/video.svg b/dl-flow-frontend/packages/design-core/assets/video.svg new file mode 100644 index 0000000..37384f1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/video.svg @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/warning.svg b/dl-flow-frontend/packages/design-core/assets/warning.svg new file mode 100644 index 0000000..c55807e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/warning.svg @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/assets/wizard.svg b/dl-flow-frontend/packages/design-core/assets/wizard.svg new file mode 100644 index 0000000..c6d8ce2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/assets/wizard.svg @@ -0,0 +1,11 @@ + + + + diff --git a/dl-flow-frontend/packages/design-core/authentication.html b/dl-flow-frontend/packages/design-core/authentication.html new file mode 100644 index 0000000..e4aaf3d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/authentication.html @@ -0,0 +1,13 @@ + + + + + + + Design Core Authentication + + +
+ + + diff --git a/dl-flow-frontend/packages/design-core/canvas.html b/dl-flow-frontend/packages/design-core/canvas.html new file mode 100644 index 0000000..fedb111 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/canvas.html @@ -0,0 +1,266 @@ + + + + + + + + + + +
+
+
+
+
+
+
+ + + diff --git a/dl-flow-frontend/packages/design-core/config/addons.js b/dl-flow-frontend/packages/design-core/config/addons.js new file mode 100644 index 0000000..e2703ad --- /dev/null +++ b/dl-flow-frontend/packages/design-core/config/addons.js @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import Materials from '@opentiny/tiny-engine-plugin-materials' +import Props from '@opentiny/tiny-engine-setting-props' +import Schema from '@opentiny/tiny-engine-plugin-schema' +import Code from 'dl-flow-setting-code' +import Export from 'dl-flow-toolbar-export' +import Save from 'dl-flow-toolbar-save'; +import Rename from 'dl-flow-toolbar-rename' +import Menu from 'dl-flow-toolbar-menu'; + +import '@opentiny/tiny-engine-theme' + +const addons = { + plugins: [Materials, Schema], + + toolbars: [Export, Save, Rename, Menu ], + settings: [Props, Code] +} + +export default addons diff --git a/dl-flow-frontend/packages/design-core/config/lowcode.config.js b/dl-flow-frontend/packages/design-core/config/lowcode.config.js new file mode 100644 index 0000000..37d88ef --- /dev/null +++ b/dl-flow-frontend/packages/design-core/config/lowcode.config.js @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +/** + * + * @typedef {Object} CanvasOptionsItem + * @prop {string[]} material + * @prop {string[]} scripts + * @prop {string[]} styles + * + * @typedef {{[x:string]:CanvasOptionsItem}} CanvasOptions + * + * @typedef {Object} Config + * @prop {'light'|'dark'} theme + * @prop {'paddlepaddle'} dslMode + * @prop {string} delHost + * @prop {string[]} toolbarOptions + * @prop {string[]} pluginOptions + * @prop {CanvasOptions} canvasOptions + * @prop {string} platformHost + * @prop {string} appHost + * @prop {string} materialHost + * @prop {number} platformId + * @prop {number} defaultImportLayout + * @prop {LSPConfig} lspConfig + + * @prop {{enable: boolean, path: string}} extendsEndpoint 扩展接入端 (非TinyEngine服务端, 为了避免歧义(比如SSR中的服务端)这里使用的是接入端) + * + */ +/** + * @type {Config} + */ +const config = { + // 编辑器主题类型, 取值:dark暗色系,light浅色系, 对应的npm包名为:@opentiny/tiny-engine-theme-${theme}, 暗色主题名需要以dark开头 + theme: 'light', + + // 当前面板技术栈类型,DSL转义参数, 其取值有: PaddlePaddle ... (后续追加更多) + dslMode: 'paddlepaddle', + + // DSL 代码转换的服务地址 + dslHost: '', + + // 工具栏配置: Array类型,当前取值: + toolbarOptions: [], + + // 插件栏配置:Array类型,当前取值: + pluginOptions: [], + + canvasOptions: { + paddlepaddle: { + material: ['http://localhost:8080/mock/bundle.json'], + scripts: [], + styles: ['http://localhost:8080/tiny-vue.css'] + } + }, + + // 设计器服务的host + platformHost: '', + + // 发布应用host + appHost: '', + + // 物料服务的host + materialHost: '/endpoint/material', + + // 当前 editor 实例绑定的设计器id + platformId: 897, + + // 是否默认导入布局组件 + defaultImportLayout: 1, + + extendsEndpoint: { + enable: true, + path: 'http://localhost:9000' + } +} + +export default config diff --git a/dl-flow-frontend/packages/design-core/dashboard.html b/dl-flow-frontend/packages/design-core/dashboard.html new file mode 100644 index 0000000..567f773 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/dashboard.html @@ -0,0 +1,13 @@ + + + + + + + Dashboard + + +
+ + + diff --git a/dl-flow-frontend/packages/design-core/index.html b/dl-flow-frontend/packages/design-core/index.html new file mode 100644 index 0000000..8435cb4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/index.html @@ -0,0 +1,140 @@ + + + + + + + + TinyEditor 前端可视化设计器 + + + +
+
+
+

Loading

+ + + + + + + +
+
+
+ + + + diff --git a/dl-flow-frontend/packages/design-core/package.json b/dl-flow-frontend/packages/design-core/package.json new file mode 100644 index 0000000..05c61a4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/package.json @@ -0,0 +1,111 @@ +{ + "name": "@opentiny/tiny-engine", + "version": "1.0.0-beta.3", + "description": "TinyEngine enables developers to customize low-code platforms, build low-bit platforms online in real time, and support secondary development or integration of low-bit platform capabilities.", + "homepage": "https://opentiny.design/tiny-engine", + "keywords": [ + "vue", + "vue3", + "frontend", + "opentiny", + "lowcode", + "tiny-engine" + ], + "scripts": { + "dev": "cross-env NODE_OPTIONS=--max-old-space-size=10240 VITE_API_MOCK=mock vite", + "serve": "cross-env NODE_OPTIONS=--max-old-space-size=10240 vite", + "build:alpha": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode alpha", + "build:prod": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode prod", + "preview": "vite preview", + "lint": "eslint . --ext .js,.vue,.jsx --fix" + }, + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/design-core" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "dependencies": { + "@babel/core": "7.18.13", + "@babel/generator": "7.18.13", + "@babel/parser": "7.18.13", + "@babel/traverse": "7.18.13", + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:*", + "@opentiny/tiny-engine-plugin-materials": "workspace:*", + "@opentiny/tiny-engine-plugin-schema": "workspace:*", + "@opentiny/tiny-engine-setting-props": "workspace:*", + "@opentiny/tiny-engine-svgs": "workspace:*", + "@opentiny/tiny-engine-theme-dark": "workspace:*", + "@opentiny/tiny-engine-theme-light": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/tiny-engine-webcomponent-core": "workspace:*", + "@opentiny/vue": "~3.11.0", + "@opentiny/vue-design-smb": "~3.11.0", + "@opentiny/vue-icon": "^3.15.0", + "@opentiny/vue-renderless": "~3.11.0", + "@opentiny/vue-theme": "~3.11.0", + "@vue/babel-plugin-jsx": "1.1.1", + "@vue/repl": "^2.9.0", + "@vueuse/core": "^9.6.0", + "dl-flow-setting-code": "workspace:^", + "dl-flow-toolbar-export": "workspace:^", + "dl-flow-toolbar-menu": "workspace:^", + "dl-flow-toolbar-rename": "workspace:^", + "dl-flow-toolbar-save": "workspace:^", + "element-resize-detector": "^1.2.4", + "file-saver": "^2.0.5", + "html2canvas": "^1.4.1", + "jszip": "^3.10.1", + "monaco-editor": "0.33.0", + "prettier": "2.7.1", + "sortablejs": "^1.14.0", + "vue": "3.2.45", + "vue-clipboard3": "^2.0.0", + "vue-draggable-next": "2.1.0", + "vue-i18n": "9.2.2", + "vue-router": "^4.3.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.21.3", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "@opentiny/tiny-engine-i18n-host": "workspace:*", + "@types/node": "^18.0.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.2", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "cross-env": "^7.0.3", + "eslint": "^8.38.0", + "eslint-plugin-vue": "^8.0.0", + "fs-extra": "^10.1.0", + "husky": "^8.0.0", + "lerna": "^7.2.0", + "less": "^4.1.2", + "lint-staged": "^13.2.0", + "path": "^0.12.7", + "rimraf": "^3.0.2", + "rollup-plugin-polyfill-node": "^0.12.0", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-visualizer": "^5.8.3", + "svg-sprite-loader": "^6.0.11", + "vite": "^4.3.7", + "vite-plugin-monaco-editor": "^1.0.10", + "vite-plugin-svg-icons": "^2.0.1", + "vue-eslint-parser": "^8.0.1" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/dl-flow-frontend/packages/design-core/preview.html b/dl-flow-frontend/packages/design-core/preview.html new file mode 100644 index 0000000..fb55265 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/preview.html @@ -0,0 +1,13 @@ + + + + + + + Design Core Preview + + +
+ + + diff --git a/dl-flow-frontend/packages/design-core/previewApp.html b/dl-flow-frontend/packages/design-core/previewApp.html new file mode 100644 index 0000000..6dd44c0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/previewApp.html @@ -0,0 +1,13 @@ + + + + + + + Design Core Preview + + +
+ + + diff --git a/dl-flow-frontend/packages/design-core/public/favicon.ico b/dl-flow-frontend/packages/design-core/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/favicon.ico differ diff --git a/dl-flow-frontend/packages/design-core/public/i18n-mock/i18n-template-for-batch-import.zip b/dl-flow-frontend/packages/design-core/public/i18n-mock/i18n-template-for-batch-import.zip new file mode 100644 index 0000000..635aab0 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/i18n-mock/i18n-template-for-batch-import.zip differ diff --git a/dl-flow-frontend/packages/design-core/public/img/bgcModal.png b/dl-flow-frontend/packages/design-core/public/img/bgcModal.png new file mode 100644 index 0000000..fedfb66 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/img/bgcModal.png differ diff --git a/dl-flow-frontend/packages/design-core/public/img/defaultAvator.png b/dl-flow-frontend/packages/design-core/public/img/defaultAvator.png new file mode 100644 index 0000000..c45c040 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/img/defaultAvator.png differ diff --git a/dl-flow-frontend/packages/design-core/public/img/divider.png b/dl-flow-frontend/packages/design-core/public/img/divider.png new file mode 100644 index 0000000..cf86e32 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/img/divider.png differ diff --git a/dl-flow-frontend/packages/design-core/public/img/dividerActive.png b/dl-flow-frontend/packages/design-core/public/img/dividerActive.png new file mode 100644 index 0000000..e493800 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/img/dividerActive.png differ diff --git a/dl-flow-frontend/packages/design-core/public/img/rocket.jpg b/dl-flow-frontend/packages/design-core/public/img/rocket.jpg new file mode 100644 index 0000000..f17e200 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/img/rocket.jpg differ diff --git a/dl-flow-frontend/packages/design-core/public/img/webNova.jpg b/dl-flow-frontend/packages/design-core/public/img/webNova.jpg new file mode 100644 index 0000000..bc65f73 Binary files /dev/null and b/dl-flow-frontend/packages/design-core/public/img/webNova.jpg differ diff --git a/dl-flow-frontend/packages/design-core/public/mock/bundle.json b/dl-flow-frontend/packages/design-core/public/mock/bundle.json new file mode 100644 index 0000000..277b146 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/public/mock/bundle.json @@ -0,0 +1,5435 @@ +{ + "$schema": "bundle.schema.json", + "data": { + "types": { + "ParamAttr": [ + { + "id": "name", + "label": { + "zh_CN": "前缀", + "en_US": "Name" + }, + "type": "string", + "optional": true, + "default": "" + }, + { + "id": "learning_rate", + "label": { + "zh_CN": "学习率", + "en_US": "learning_rate" + }, + "type": "number", + "optional": true, + "default": 1.0 + }, + { + "id": "trainable", + "label": { + "zh_CN": "是否参与训练", + "en_US": "trainable" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "do_model_average", + "label": { + "zh_CN": "模型平均", + "en_US": "do_model_average" + }, + "type": "boolean", + "optional": true, + "default": true + }, + { + "id": "need_clip", + "label": { + "zh_CN": "梯度裁剪", + "en_US": "need_clip" + }, + "type": "boolean", + "optional": true, + "default": true + } + ] + }, + "materials": [ + { + "id": "AdaptiveAvgPool1D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool1D", + "zh_CN": "1D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool2D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool2D", + "zh_CN": "2D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveAvgPool3D", + "mode": "nn", + "label": { + "en_US": "AdaptiveAvgPool3D", + "zh_CN": "3D 自适应平均池化" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "Output size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool1D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "1D 自适应最大值池化", + "en_US": "AdaptiveMaxPool1D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool2D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "2D 自适应最大值池化", + "en_US": "AdaptiveMaxPool2D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AdaptiveMaxPool3D_cn.rst", + "mode": "nn", + "label": { + "zh_CN": "3D 自适应最大值池化", + "en_US": "AdaptiveMaxPool3D_cn" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出特征都大小", + "en_US": "Feature map size" + } + } + ] + }, + { + "id": "AlphaDropout", + "mode": "nn", + "label": { + "zh_CN": "自归一化dropout", + "en_US": "Alpha dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "丢弃概率", + "en_US": "Dropping probability" + } + } + ] + }, + { + "id": "AvgPool1D", + "mode": "nn", + "label": { + "zh_CN": "", + "en_US": "" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool2D", + "mode": "nn", + "label": { + "zh_CN": "", + "en_US": "" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "AvgPool3D", + "mode": "nn", + "label": { + "zh_CN": "", + "en_US": "" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "ceil_mode", + "label": { + "zh_CN": "是否使用Ceil函数计算宽高", + "en_US": "Is the Ceil function used to calculate width and height" + }, + "type": "boolean", + "default": false + }, + { + "id": "exclusive", + "type": "boolean", + "label": { + "zh_CN": "忽略填充值", + "en_US": "exclusive" + }, + "default": true + } + ] + }, + { + "id": "MaxPool1D", + "mode": "nn", + "label": { + "en_US": "MaxPool1D", + "zh_CN": "1D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool2D", + "mode": "nn", + "label": { + "en_US": "MaxPool2D", + "zh_CN": "2D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "MaxPool3D", + "mode": "nn", + "label": { + "en_US": "MaxPool3D", + "zh_CN": "3D 最大值池化" + }, + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核的尺寸大小", + "en_US": "kernel_size" + } + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "池化操作步长", + "en_US": "stride" + } + } + ] + }, + { + "id": "BCELoss", + "mode": "nn", + "label": { + "zh_CN": "BCELoss", + "en_US": "BCELoss" + }, + "properties": [] + }, + { + "id": "BCEWithLogitsLoss", + "mode": "nn", + "label": { + "zh_CN": "BCEWithLogitsLoss", + "en_US": "BCEWithLogitsLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "BatchNorm1D", + "mode": "nn", + "label": { + "zh_CN": "", + "en_US": "" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm2D", + "mode": "nn", + "label": { + "zh_CN": "", + "en_US": "" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm3D", + "mode": "nn", + "label": { + "zh_CN": "", + "en_US": "" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "BatchNorm", + "mode": "nn", + "label": { + "zh_CN": "BatchNorm", + "en_US": "BatchNorm" + }, + "properties": [ + { + "id": "num_channels", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "num_channels" + } + }, + { + "id": "is_test", + "type": "boolean", + "label": { + "zh_CN": "是否在测试阶段", + "en_US": "Is test" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "param_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "param attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_layout", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + }, + { + "id": "in_place", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "batch_norm是否可以服用输入内存", + "en_US": "Can batch norm take input memory" + } + }, + { + "id": "do_model_average_for_mean_and_var", + "type": "boolean", + "default": "false", + "label": { + "zh_CN": "是否为 mean 和 variance 做模型均值", + "en_US": "Are we doing model mean for mean and variance" + } + }, + { + "id": "use_global_stats", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用全局均值和方差", + "en_US": "Is global mean and variance used" + } + }, + { + "id": "trainable_statistics", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "eval 模式下是否计算 mean 均值和 var 方差", + "en_US": "Is the mean and variance of var calculated in eval mode" + } + }, + { + "id": "moving_mean_name", + "type": "string", + "label": { + "zh_CN": "moving_mean 的名称", + "en_US": "name of moving_mean" + } + }, + { + "id": "moving_variance_name", + "type": "string", + "label": { + "zh_CN": "moving_var 的名称", + "en_US": "name of moving_var" + } + } + ] + }, + { + "label": { + "zh_CN": "ReLU", + "en_US": "ReLU" + }, + "id": "ReLU", + "mode": "nn", + "properties": [] + }, + { + "label": { + "zh_CN": "1D 卷积神经网络", + "en_US": "Conv 1D" + }, + "id": "Conv1D", + "nnName": "Conv1D", + "desc": "一维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "2D 卷积神经网络", + "en_US": "Conv 2D" + }, + "id": "Conv2D", + "nnName": "Conv2D", + "desc": "二维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "3D 卷积神经网络", + "en_US": "Conv 3D" + }, + "id": "Conv3D", + "nnName": "Conv3D", + "desc": "三维卷积层", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding_mode", + "label": { + "zh_CN": "填充模式", + "en_US": "padding_mode" + }, + "type": "enums", + "enums": [ + { + "id": 1, + "label": "zeros", + "value": "zeros", + "default": true + }, + { + "id": 2, + "label": "reflect", + "value": "reflect" + }, + { + "id": 3, + "label": "replicate", + "value": "replicate" + }, + { + "id": 4, + "label": "circular", + "value": "circular" + } + ], + "required": true + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "线性变换", + "en_US": "Linear" + }, + "id": "Linear", + "nnName": "Linear", + "desc": "线性变换", + "nn": true, + "mode": "nn", + "properties": [ + { + "id": "in_features", + "label": { + "zh_CN": "输入单元的数目", + "en_US": "in_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_features", + "label": { + "zh_CN": "输出单元的数目", + "en_US": "out_features" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "label": { + "zh_CN": "数据格式", + "en_US": "data_format" + }, + "type": "string", + "required": true + } + ] + }, + { + "label": { + "zh_CN": "展开", + "en_US": "Flatten" + }, + "id": "Flatten", + "nnName": "Flatten", + "mode": "nn", + "properties": [ + { + "id": "start_axis", + "label": { + "zh_CN": "起始维度", + "en_US": "start_axis" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "stop_axis", + "label": { + "zh_CN": "结束维度", + "en_US": "stop axis" + }, + "type": "number", + "required": true, + "default": -1 + } + ] + }, + { + "label": { + "zh_CN": "一维转置卷积层", + "en_US": "Conv1DTranspose" + }, + "id": "Conv1DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "二维转置卷积层", + "en_US": "Conv2DTranspose" + }, + "id": "Conv2DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "label": { + "zh_CN": "三维转置卷积层", + "en_US": "Conv3DTranspose" + }, + "id": "Conv3DTranspose", + "mode": "nn", + "properties": [ + { + "id": "in_channels", + "label": { + "zh_CN": "输入通道数", + "en_US": "in_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "out_channels", + "label": { + "zh_CN": "输出通道数", + "en_US": "out_channels" + }, + "type": "number", + "required": true, + "default": 255 + }, + { + "id": "kernel_size", + "label": { + "zh_CN": "卷积核大小", + "en_US": "kernel_size" + }, + "type": "number", + "required": true, + "default": 3 + }, + { + "id": "stride", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "type": "number", + "required": true, + "default": 1 + }, + { + "id": "dilation", + "label": { + "zh_CN": "空洞大小", + "en_US": "dilation" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "groups", + "label": { + "zh_CN": "组数", + "en_US": "groups" + }, + "type": "number", + "required": true, + "default": 0 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "padding" + } + }, + { + "id": "output_padding", + "type": "number", + "label": { + "zh_CN": "输出特征尾部额外添加的大小", + "en_US": "Padding of output feature" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Bilinear", + "mode": "nn", + "label": { + "zh_CN": "双线性Tensor积", + "en_US": "Bilinear" + }, + "properties": [ + { + "id": "in1_features", + "type": "number", + "label": { + "zh_CN": "x1 元素的维度", + "en_US": "" + } + }, + { + "id": "in2_features", + "type": "number", + "label": { + "zh_CN": "x2 元素的维度", + "en_US": "" + } + }, + { + "id": "out_features", + "type": "number", + "label": { + "zh_CN": "输出 Tensor 的维度", + "en_US": "Size of output tensor" + } + }, + { + "id": "weight_attr", + "label": { + "zh_CN": "权重参数", + "en_US": "weight_attr" + }, + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "bias_attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "CELU", + "mode": "nn", + "label": { + "zh_CN": "CELU 激活函数", + "en_US": "CELU" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "CTCLoss", + "mode": "nn", + "label": { + "en_US": "CTC Loss", + "zh_CN": "CTC 损失函数" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "en_US": "Blank", + "zh_CN": "v" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "CosineEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "CosineEmbedding 损失", + "en_US": "CosineEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "ChannelShuffle", + "label": { + "zh_CN": "通道分组", + "en_US": "group by channel" + }, + "mode": "nn", + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "zh_CN": "分组数", + "en_US": "total group" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByGlobalNorm", + "label": { + "zh_CN": "ClipGradByGlobalNorm", + "en_US": "ClipGradByGlobalNorm" + }, + "properties": [ + { + "id": "clip_norm", + "type": "number", + "label": { + "zh_CN": "范数最大值", + "en_US": "clip norm" + } + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByNorm", + "label": { + "zh_CN": "ClipGradByNorm", + "en_US": "ClipGradByNorm" + }, + "properties": [ + { + "id": "clip_norm", + "label": { + "zh_CN": "二范数最大值", + "en_US": "clip_norm" + }, + "type": "number" + } + ] + }, + { + "mode": "nn", + "id": "ClipGradByValue", + "label": { + "en_US": "ClipGradByValue", + "zh_CN": "ClipGradByValue" + }, + "properties": [ + { + "id": "max", + "type": "number", + "label": { + "en_US": "max", + "zh_CN": "修剪的最大值" + } + }, + { + "id": "min", + "type": "number", + "label": { + "en_US": "min", + "zh_CN": "修建的最小值" + } + } + ] + }, + { + "mode": "nn", + "id": "CosineSimilarity", + "label": { + "en_US": "CosineSimilarity", + "zh_CN": "余弦相似度" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": 1 + }, + { + "id": "eps", + "type": "number", + "label": { + "zh_CN": "加在分母上的很小的数值, 防止分母为0的情况", + "en_US": "eps" + }, + "default": 1e-8 + } + ] + }, + { + "mode": "nn", + "id": "CrossEntropyLoss", + "label": { + "en_US": "CrossEntropyLoss", + "zh_CN": "交叉熵损失" + }, + "properties": [ + { + "id": "ignore_index", + "type": "number", + "label": { + "en_US": "ignore index", + "zh_CN": "忽略的标签值" + }, + "default": -100 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "soft_label", + "type": "boolean", + "default": false, + "label": { + "en_US": "soft label", + "zh_CN": "软标签" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "维度", + "en_US": "axis" + }, + "default": -1 + }, + { + "id": "use_softmax", + "type": "boolean", + "default": true, + "label": { + "zh_CN": "softmax 归一化", + "en_US": "use softmax normalization" + } + } + ] + }, + { + "id": "Dropout2D", + "mode": "nn", + "label": { + "zh_CN": "二维概率丢弃", + "en_US": "Dropout2D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout3D", + "mode": "nn", + "label": { + "zh_CN": "三维概率丢弃", + "en_US": "Dropout3D" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + } + ] + }, + { + "id": "Dropout", + "mode": "nn", + "label": { + "zh_CN": "概率丢弃", + "en_US": "Dropout" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 0.5, + "label": { + "zh_CN": "p值", + "en_US": "p" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "zh_CN": "丢弃轴", + "en_US": "axis" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "upscale_in_train", + "label": "upscale_in_train", + "default": true + }, + { + "id": 1, + "value": "downscale_in_infer", + "label": "downscale_in_infer" + } + ] + } + ] + }, + { + "id": "ELU", + "mode": "nn", + "label": { + "zh_CN": "ELU 激活函数", + "en_US": "ELU activation" + }, + "properties": [ + { + "id": "alpha", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Embedding", + "mode": "nn", + "label": { + "zh_CN": "嵌入层", + "en_US": "Embedding" + }, + "properties": [ + { + "id": "num_embeddings", + "type": "number", + "label": { + "zh_CN": "字典大小", + "en_US": "size of embeddings" + } + }, + { + "id": "embedding_dim", + "type": "number", + "label": { + "zh_CN": "嵌入向量的维度", + "en_US": "Dim of every embedding" + } + } + ] + }, + { + "id": "Fold", + "mode": "nn", + "label": { + "zh_CN": "区块合并", + "en_US": "fold" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出大小", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "卷积核大小", + "en_US": "size of kernel" + } + }, + { + "id": "strides", + "type": "number", + "label": { + "zh_CN": "步长大小", + "en_US": "size of stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度扩张大小", + "en_US": "padding" + } + }, + { + "type": "number", + "default": 1, + "id": "dilations", + "label": { + "en_US": "dilations", + "zh_CN": "卷积膨胀" + } + } + ] + }, + { + "id": "FractionalMaxPool2D", + "mode": "nn", + "label": { + "zh_CN": "2维分数阶最大值池化", + "en_US": "FractionalMaxPool2D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "FractionalMaxPool3D", + "mode": "nn", + "label": { + "zh_CN": "3维分数阶最大值池化", + "en_US": "FractionalMaxPool3D" + }, + "properties": [ + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + }, + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "kernel size" + } + }, + { + "id": "random_u", + "type": "number", + "label": { + "zh_CN": "浮点随机数", + "en_US": "random number" + } + }, + { + "id": "return_mask", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否返回索引", + "en_US": "return mask" + } + } + ] + }, + { + "id": "GELU", + "mode": "nn", + "label": { + "zh_CN": "GELU 激活函数", + "en_US": "GELU activation" + }, + "properties": [ + { + "id": "approximate", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否启用近似计算", + "en_US": "approximate" + } + } + ] + }, + { + "id": "GLU", + "mode": "nn", + "label": { + "zh_CN": "GLU 激活层", + "en_US": "GLU Activation Operator" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "en_US": "axis", + "zh_CN": "沿着该轴将输入二等分" + } + } + ] + }, + { + "id": "GRUCell", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元", + "en_US": "GRUCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GRU", + "mode": "nn", + "label": { + "zh_CN": "门控循环单元网络", + "en_US": "GRU" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "GaussianNLLLoss", + "mode": "nn", + "label": { + "zh_CN": "高斯负对数似然损失", + "en_US": "GaussianNLLLoss" + }, + "properties": [ + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "Is the constant term included in the loss calculation", + "zh_CN": "是否在损失计算中包括常数项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 1e-6 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "GroupNorm", + "mode": "nn", + "label": { + "en_US": "Group Normalization", + "zh_CN": "组归一化" + }, + "properties": [ + { + "id": "num_groups", + "type": "number", + "label": { + "en_US": "num groups", + "zh_CN": "从通道中分离出的组数" + } + }, + { + "id": "num_channels", + "type": "number", + "label": { + "en_US": "num channels", + "zh_CN": "输入通道数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "HSigmoidLoss", + "label": { + "en_US": "hierarchical sigmoid", + "zh_CN": "层次Sigmoid" + }, + "mode": "nn", + "properties": [ + { + "id": "feature_size", + "type": "number", + "label": { + "en_US": "input tensor size", + "zh_CN": "输入tensor的特征尺寸" + } + }, + { + "id": "num_classes", + "type": "number", + "label": { + "en_US": "dictionary size", + "zh_CN": "字典大小" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "is_custom", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "自定义二叉树", + "en_US": "custom Binary tree" + } + }, + { + "id": "is_sparse", + "type": "boolean", + "default": false, + "label": { + "zh_CN": "是否使用稀疏更新", + "en_US": "Whether to use the sparse update method" + } + } + ] + }, + { + "id": "Hardshrink", + "mode": "nn", + "label": { + "en_US": "Hardshrink", + "zh_CN": "Hardshrink 激活层" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 0.5, + "label": { + "en_US": "threshold", + "zh_CN": "threshold" + } + } + ] + }, + { + "id": "Hardsigmoid", + "mode": "nn", + "label": { + "en_US": "Hardsigmoid", + "zh_CN": "Hardsigmoid 激活层" + }, + "properties": [] + }, + { + "id": "Hardswish", + "mode": "nn", + "label": { + "zh_CN": "Hardswish 激活函数", + "en_US": "Hardswish" + }, + "properties": [] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh Activation", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "label": { + "en_US": "min value", + "zh_CN": "最小值" + }, + "type": "number", + "default": -1 + }, + { + "id": "max", + "label": { + "en_US": "max value", + "zh_CN": "最大值" + }, + "type": "number", + "default": 1 + } + ] + }, + { + "id": "HingeEmbeddingLoss", + "mode": "nn", + "label": { + "zh_CN": "非线形的铰链嵌入损失", + "en_US": "HingeEmbeddingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "margin", + "en_US": "margin" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Identity", + "mode": "nn", + "label": { + "zh_CN": "等效层", + "en_US": "Identity" + }, + "properties": [] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm2D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm2D", + "en_US": "InstanceNorm2D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "InstanceNorm1D", + "mode": "nn", + "label": { + "zh_CN": "InstanceNorm1D", + "en_US": "InstanceNorm1D" + }, + "properties": [ + { + "id": "num_features", + "type": "number", + "label": { + "zh_CN": "输入通道数量", + "en_US": "input channel size" + } + }, + { + "id": "epsilon", + "type": "number", + "default": 0.00001, + "label": { + "zh_CN": "加在分母上的很小的数值", + "en_US": "epsilon" + } + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "KLDivLoss", + "mode": "nn", + "label": { + "zh_CN": "Kullback-Leibler 散度损失", + "en_US": "Kullback-Leibler loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "L1Loss", + "mode": "nn", + "label": { + "en_US": "L1 loss", + "zh_CN": "L1 loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "LSTMCell", + "mode": "nn", + "label": { + "zh_CN": "长短期记忆网络单元", + "en_US": "LSTMCell" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "type": "number", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden size" + } + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LSTM", + "mode": "nn", + "label": { + "en_US": "LSTM", + "zh_CN": "LSTM" + }, + "properties": [ + { + "id": "input_size", + "label": { + "zh_CN": "输入大小", + "en_US": "input_size" + }, + "type": "number" + }, + { + "id": "hidden_size", + "label": { + "zh_CN": "隐藏状态大小", + "en_US": "hidden_size" + }, + "type": "number" + }, + { + "id": "num_layers", + "type": "number", + "label": { + "zh_CN": "循环网络层数", + "en_US": "rnn layer number" + }, + "default": 1 + }, + { + "id": "direction", + "type": "enums", + "label": { + "zh_CN": "迭代方向", + "en_US": "direction" + }, + "enums": [ + { + "id": 0, + "label": "forward", + "value": "forward", + "default": true + }, + { + "id": 1, + "label": "bidirect", + "value": "bidirect" + } + ] + }, + { + "id": "time_major", + "type": "boolean", + "label": { + "zh_CN": "第一个维度是否是time steps", + "en_US": "Is the first dimension time steps" + }, + "default": false + }, + { + "id": "dropout", + "type": "number", + "label": { + "zh_CN": "dropout 概率", + "en_US": "dropout probability" + }, + "default": 0 + }, + { + "id": "weight_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_ih param attr", + "zh_CN": "weight_ih 权重参数" + } + }, + { + "id": "weight_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "weight_hh_attr", + "zh_CN": "weight_hh 权重参数" + } + }, + { + "id": "bias_ih_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_ih param attr", + "zh_CN": "bias_ih 权重参数" + } + }, + { + "id": "bias_hh_attr", + "type": "ParamAttr", + "label": { + "en_US": "bias_hh_attr", + "zh_CN": "bias_hh 权重参数" + } + } + ] + }, + { + "id": "LeakyReLU", + "mode": "nn", + "label": { + "zh_CN": "LeakyReLU 激活层", + "en_US": "LeakyReLU" + }, + "properties": [ + { + "id": "negative_slope", + "type": "number", + "default": 0.01, + "label": { + "zh_CN": "斜率", + "en_US": "slope" + } + } + ] + }, + { + "id": "LocalResponseNorm", + "mode": "nn", + "label": { + "en_US": "LocalResponseNorm", + "zh_CN": "局部响应正则化" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "zh_CN": "累加通道数", + "en_US": "Accumulated number of channels" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1e-4, + "label": { + "en_US": "Scaling parameters", + "zh_CN": "缩放参数" + } + }, + { + "id": "beta", + "type": "number", + "default": 0.75, + "label": { + "zh_CN": "指数", + "en_US": "exponent" + } + }, + { + "id": "k", + "type": "number", + "default": 1, + "label": { + "zh_CN": "位移", + "en_US": "k" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "LogSigmoid", + "label": { + "zh_CN": "LogSigmoid 激活层", + "en_US": "LogSigmoid" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "LogSoftmax", + "mode": "nn", + "label": { + "zh_CN": "LogSoftmax", + "en_US": "LogSoftmax_cn" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "MSELoss", + "mode": "nn", + "label": { + "zh_CN": "均方误差", + "en_US": "MSELoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MarginRankingLoss", + "mode": "nn", + "label": { + "zh_CN": "MarginRankingLoss", + "en_US": "MarginRankingLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "label": { + "zh_CN": "加和的 margin 值", + "en_US": "The margin value of the sum" + }, + "default": 0 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "MaxUnPool2D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool2D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool3D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool3D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "MaxUnPool1D", + "label": { + "zh_CN": "一维最大值反池化", + "en_US": "MaxUnPool1D" + }, + "mode": "nn", + "properties": [ + { + "id": "kernel_size", + "type": "number", + "label": { + "zh_CN": "池化核大小", + "en_US": "Size of avg pool size" + }, + "default": 3 + }, + { + "id": "stride", + "type": "number", + "label": { + "zh_CN": "步长", + "en_US": "stride" + }, + "default": 1 + }, + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "池化填充", + "en_US": "Padding" + }, + "default": 0 + }, + { + "id": "output_size", + "type": "number", + "label": { + "zh_CN": "输出尺寸", + "en_US": "output size" + } + } + ] + }, + { + "id": "Maxout", + "mode": "nn", + "label": { + "zh_CN": "Maxout 激活层", + "en_US": "Maxout" + }, + "properties": [ + { + "id": "groups", + "type": "number", + "label": { + "en_US": "groups", + "zh_CN": "组数" + } + }, + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "指定通道所在维度的索引" + }, + "default": 1 + } + ] + }, + { + "id": "Mish", + "label": { + "en_US": "Mish", + "zh_CN": "Mish 激活层" + }, + "mode": "nn", + "properties": [] + }, + { + "id": "MultiHeadAttention", + "label": { + "en_US": "MultiHeadAttention", + "zh_CN": "多头注意力" + }, + "mode": "nn", + "properties": [ + { + "id": "embed_dim", + "type": "number", + "label": { + "zh_CN": "输入维度", + "en_US": "embed_dim" + } + }, + { + "id": "num_heads", + "type": "number", + "label": { + "zh_CN": "head数量", + "en_US": "num_heads" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0, + "label": { + "zh_CN": "随机失活率", + "en_US": "dropout" + } + }, + { + "id": "kdim", + "type": "number", + "label": { + "zh_CN": "key的维度", + "en_US": "kdim" + } + }, + { + "id": "vdim", + "type": "number", + "label": { + "zh_CN": "value的维度", + "en_US": "vdim" + } + }, + { + "id": "need_weights", + "type": "boolean", + "label": { + "zh_CN": "是否返回注意力权重", + "en_US": "need_weights" + }, + "default": false + }, + { + "id": "weight_attr", + "type": "ParamAttr" + }, + { + "id": "bias_attr", + "type": "ParamAttr" + } + ] + }, + { + "id": "PReLU", + "mode": "nn", + "label": { + "en_US": "PReLU", + "zh_CN": "PReLU" + }, + "properties": [ + { + "id": "num_parameters", + "type": "number", + "default": 1, + "label": { + "en_US": "num_parameters", + "zh_CN": "可训练 weight 数量" + } + }, + { + "id": "init", + "type": "number", + "default": 0.25, + "label": { + "zh_CN": "初始值", + "en_US": "init" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad1D", + "mode": "nn", + "label": { + "en_US": "Pad1D", + "zh_CN": "Pad1D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad2D", + "mode": "nn", + "label": { + "en_US": "Pad2D", + "zh_CN": "Pad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "Pad3D", + "mode": "nn", + "label": { + "en_US": "Pad3D", + "zh_CN": "Pad3D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "en_US": "padding", + "zh_CN": "填充大小" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": 1, + "label": "reflect", + "value": "reflect" + }, + { + "id": 2, + "label": "replicate", + "value": "replicate" + }, + { + "id": 3, + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "label": { + "en_US": "value", + "zh_CN": "填充值" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NC", + "value": "NC" + }, + { + "id": 1, + "label": "NCL", + "value": "NCL", + "default": true + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PairwiseDistance", + "mode": "nn", + "label": { + "zh_CN": "范数距离", + "en_US": "PairwiseDistance" + }, + "properties": [ + { + "id": "p", + "type": "number", + "default": 2, + "label": { + "en_US": "p", + "zh_CN": "p阶的范数" + } + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "keep_dim", + "type": "boolean", + "label": { + "zh_CN": "是否保留输出 Tensor 减少的维度", + "en_US": "keep_dim" + } + } + ] + }, + { + "id": "PixelShuffle", + "label": { + "zh_CN": "PixelShuffle", + "en_US": "PixelShuffle" + }, + "mode": "nn", + "properties": [ + { + "id": "upscale_factor", + "type": "number", + "label": { + "en_US": "upscale_factor", + "zh_CN": "上采样增大因子" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PixelUnshuffle", + "mode": "nn", + "label": { + "zh_CN": "PixelUnshuffle", + "en_US": "PixelUnshuffle" + }, + "properties": [ + { + "id": "downscale_factor", + "type": "number", + "label": { + "zh_CN": "下采样因子", + "en_US": "downscale_factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "NCHW", + "value": "NCHW", + "default": true + }, + { + "id": 1, + "label": "NHWC", + "value": "NHWC" + } + ], + "label": { + "zh_CN": "数据格式", + "en_US": "Data format" + } + } + ] + }, + { + "id": "PoissonNLLLoss", + "mode": "nn", + "label": { + "en_US": "PoissonNLLLoss", + "zh_CN": "PoissonNLL 损失函数" + }, + "properties": [ + { + "id": "log_input", + "type": "boolean", + "label": { + "zh_CN": "输入是否为对数函数映射后结果", + "en_US": "log_input" + }, + "default": true + }, + { + "id": "full", + "type": "boolean", + "label": { + "en_US": "full", + "zh_CN": "是否在损失计算中包括 Stirling 近似项" + }, + "default": false + }, + { + "id": "epsilon", + "type": "number", + "label": { + "en_US": "epsilon", + "zh_CN": "在 log_input 为 true 时使用的常数小量" + }, + "default": 1e-8 + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RNNTLoss", + "mode": "nn", + "label": { + "zh_CN": "RNNTLoss 损失", + "en_US": "RNNTLoss" + }, + "properties": [ + { + "id": "blank", + "type": "number", + "default": 0, + "label": { + "zh_CN": "空格标记的 ID 值", + "en_US": "blank" + } + }, + { + "id": "fastemit_lambda", + "type": "number", + "default": 0.001, + "label": { + "en_US": "fastemit_lambda", + "zh_CN": "FastEmit 的正则化参数" + } + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "RReLU", + "mode": "nn", + "label": { + "zh_CN": "RReLU 激活层", + "en_US": "RReLU" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "padding", + "en_US": "padding" + } + }, + { + "id": "mode", + "type": "enums", + "enums": [ + { + "id": "constant", + "label": "constant", + "value": "constant", + "default": true + }, + { + "id": "reflect", + "label": "reflect", + "value": "reflect" + }, + { + "id": "replicate", + "label": "replicate", + "value": "replicate" + }, + { + "id": "circular", + "label": "circular", + "value": "circular" + } + ] + }, + { + "id": "value", + "type": "number", + "default": 0.0, + "label": { + "zh_CN": "value", + "en_US": "value" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCL", + "label": "NCL" + }, + { + "id": 1, + "value": "NLC", + "label": "NLC" + } + ] + } + ] + }, + { + "id": "ReLU6", + "mode": "nn", + "label": { + "en_US": "ReLU6", + "zh_CN": "ReLU6" + }, + "properties": [] + }, + { + "id": "SELU", + "mode": "nn", + "label": { + "en_US": "SELU", + "zh_CN": "SELU" + }, + "properties": [ + { + "id": "scale", + "type": "number", + "default": 1.0507009873554804934193349852946, + "label": { + "en_US": "scale", + "zh_CN": "scale" + } + }, + { + "id": "alpha", + "type": "number", + "default": 1.6732632423543772848170429916717, + "label": { + "zh_CN": "alpha", + "en_US": "alpha" + } + } + ] + }, + { + "id": "Sigmoid", + "mode": "nn", + "label": { + "en_US": "Sigmoid", + "zh_CN": "Sigmoid" + }, + "properties": [] + }, + { + "id": "Silu", + "mode": "nn", + "label": { + "en_US": "Silu", + "zh_CN": "Silu" + }, + "properties": [] + }, + { + "id": "SmoothL1Loss", + "mode": "nn", + "label": { + "zh_CN": "SmoothL1Loss", + "en_US": "SmoothL1Loss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + }, + { + "id": "delta", + "label": { + "en_US": "delta", + "zh_CN": "delta" + }, + "default": 1.0, + "type": "number" + } + ] + }, + { + "id": "SoftMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "SoftMarginLoss", + "en_US": "SoftMarginLoss" + }, + "properties": [ + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Softmax2D", + "mode": "nn", + "label": { + "en_US": "Softmax2D", + "zh_CN": "Softmax2D" + }, + "properties": [] + }, + { + "id": "Softmax", + "mode": "nn", + "label": { + "en_US": "Softmax", + "zh_CN": "Softmax 激活层" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "default": -1, + "label": { + "zh_CN": "运算轴", + "en_US": "axis" + } + } + ] + }, + { + "id": "Softplus", + "mode": "nn", + "label": { + "zh_CN": "Softplus 激活层", + "en_US": "Softplus" + }, + "properties": [ + { + "id": "beta", + "type": "number", + "default": 1, + "label": { + "en_US": "beta", + "zh_CN": "beta" + } + }, + { + "id": "threshold", + "type": "number", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "default": 20 + } + ] + }, + { + "id": "Softshrink", + "label": { + "zh_CN": "Softshrink 激活层", + "en_US": "Softshrink" + }, + "properties": [ + { + "id": "threshold", + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + }, + "type": "number", + "default": 0.5 + } + ], + "mode": "nn" + }, + { + "id": "Softsign", + "mode": "nn", + "label": { + "zh_CN": "Softsign 激活层", + "en_US": "Softsign" + }, + "properties": [] + }, + { + "id": "Swish", + "mode": "nn", + "label": { + "zh_CN": "Swish", + "en_US": "Swish" + }, + "properties": [] + }, + { + "id": "SyncBatchNorm", + "mode": "nn", + "label": { + "en_US": "SyncBatchNorm", + "zh_CN": "SyncBatchNorm" + }, + "properties": [ + { + "id": "num_features", + "label": { + "zh_CN": "输入通道数", + "en_US": "Input tensor channel number" + }, + "type": "number" + }, + { + "id": "epsilon", + "type": "number", + "label": { + "zh_CN": "epsilon", + "en_US": "epsilon" + }, + "default": 0.00001 + }, + { + "id": "momentum", + "type": "number", + "default": 0.9, + "label": { + "zh_CN": "momentum", + "en_US": "momentum" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Hardtanh", + "mode": "nn", + "label": { + "en_US": "Hardtanh", + "zh_CN": "Hardtanh 激活层" + }, + "properties": [ + { + "id": "min", + "type": "number", + "default": -1, + "label": { + "en_US": "min", + "zh_CN": "最小值" + } + }, + { + "id": "max", + "type": "number", + "default": 1, + "label": { + "zh_CN": "最大值", + "en_US": "最小值" + } + } + ] + }, + { + "id": "Tanhshrink", + "mode": "nn", + "label": { + "zh_CN": "Tanhshrink 激活层", + "en_US": "Tanhshrink" + }, + "properties": [] + }, + { + "id": "ThresholdedReLU", + "mode": "nn", + "label": { + "zh_CN": "ThresholdedReLU 激活层", + "en_US": "ThresholdedReLU" + }, + "properties": [ + { + "id": "threshold", + "type": "number", + "default": 1.0, + "label": { + "zh_CN": "threshold", + "en_US": "threshold" + } + } + ] + }, + { + "id": "TransformerDecoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 解码器层", + "en_US": "TransformerDecoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + }, + { + "id": "layer_norm_eps", + "type": "number", + "default": 0.0001, + "label": { + "en_US": "layer_norm_eps", + "zh_CN": "transformer decoder 中 layer normalization 层的 eps 参数值" + } + } + ] + }, + { + "id": "TransformerEncoderLayer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 编码器层", + "en_US": "TransformerEncoderLayer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "Transformer", + "mode": "nn", + "label": { + "zh_CN": "Transformer 模型", + "en_US": "Transformer" + }, + "properties": [ + { + "id": "d_model", + "type": "number", + "label": { + "zh_CN": "输入输出维度", + "en_US": "d_model" + } + }, + { + "id": "nhead", + "type": "number", + "label": { + "zh_CN": "多头注意力的head数", + "en_US": "nhead" + } + }, + { + "id": "dim_feedforward", + "type": "number", + "label": { + "en_US": "dim_feedforward", + "zh_CN": "前馈神经网络中的隐藏层大小" + } + }, + { + "id": "dropout", + "type": "number", + "default": 0.1, + "label": { + "en_US": "dropout", + "zh_CN": "三个字层的输出进行处理的dropout值" + } + }, + { + "id": "activation", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "relu", + "label": "relu" + } + ], + "label": { + "zh_CN": "前馈神经网络的激活函数", + "en_US": "activation" + } + }, + { + "id": "attn_dropout", + "type": "number", + "label": { + "en_US": "attn_dropout", + "zh_CN": "随机失活率" + } + }, + { + "id": "act_dropout", + "type": "number", + "label": { + "zh_CN": "前馈神经网络的激活函数后的 dropout", + "en_US": "act_dropout" + } + }, + { + "id": "normalize_before", + "default": false, + "type": "boolean", + "label": { + "zh_CN": "每个子层的输入输出的处理", + "en_US": "normalize_before" + } + }, + { + "id": "weight_attr", + "type": "ParamAttr", + "label": { + "zh_CN": "权重参数", + "en_US": "Weight attr" + } + }, + { + "id": "bias_attr", + "label": { + "zh_CN": "偏置参数", + "en_US": "Bias attr" + }, + "type": "ParamAttr" + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "p", + "label": { + "zh_CN": "范数", + "en_US": "p" + }, + "type": "number", + "default": 2 + }, + { + "id": "epsilon", + "type": "number", + "default": 1e-6, + "label": { + "zh_CN": "防止除数为0", + "en_US": "epsilon" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "TripletMarginLoss", + "mode": "nn", + "label": { + "zh_CN": "TripletMarginLoss", + "en_US": "TripletMarginLoss" + }, + "properties": [ + { + "id": "distance_function", + "type": "number", + "label": { + "zh_CN": "欧氏距离范数", + "en_US": "distance_function" + } + }, + { + "id": "margin", + "type": "number", + "default": 1, + "label": { + "zh_CN": "间距", + "en_US": "margin" + } + }, + { + "id": "swap", + "label": { + "zh_CN": "是否交换", + "en_US": "swap" + }, + "type": "boolean", + "default": false + }, + { + "id": "reduction", + "type": "enums", + "enums": [ + { + "id": 0, + "label": "none", + "value": "none" + }, + { + "id": 1, + "label": "mean", + "value": "mean", + "default": true + }, + { + "id": 2, + "label": "sum", + "value": "sum" + } + ], + "label": { + "en_US": "reduction", + "zh_CN": "计算方式" + } + } + ] + }, + { + "id": "Unfold", + "mode": "nn", + "label": { + "en_US": "Unfold", + "zh_CN": "Unfold" + }, + "properties": [ + { + "id": "kernel_sizes", + "type": "number", + "label": { + "zh_CN": "卷积核的尺寸", + "en_US": "kernel_sizes" + } + }, + { + "id": "dilations", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积膨胀", + "en_US": "dilations" + } + }, + { + "id": "paddings", + "type": "number", + "default": 0, + "label": { + "en_US": "paddings", + "zh_CN": "扩张" + } + }, + { + "id": "strides", + "type": "number", + "default": 1, + "label": { + "zh_CN": "卷积步长", + "en_US": "strides" + } + } + ] + }, + { + "id": "UpsamplingBilinear2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingBilinear2D", + "zh_CN": "UpsamplingBilinear2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "UpsamplingNearest2D", + "mode": "nn", + "label": { + "en_US": "UpsamplingNearest2D", + "zh_CN": "UpsamplingNearest2D" + }, + "properties": [ + { + "id": "size", + "type": "number", + "label": { + "en_US": "size", + "zh_CN": "大小" + } + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "zh_CN": "输入的高度或宽度的乘数因子", + "en_US": "scale factor" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "ZeroPad2D", + "mode": "nn", + "label": { + "zh_CN": "零填充", + "en_US": "ZeroPad2D" + }, + "properties": [ + { + "id": "padding", + "type": "number", + "label": { + "zh_CN": "填充大小", + "en_US": "size of padding" + } + }, + { + "id": "data_format", + "type": "enums", + "enums": [ + { + "id": 0, + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": 1, + "value": "NHWC", + "label": "NHWC" + } + ] + } + ] + }, + { + "id": "Upsample", + "label": { + "en_US": "Upsample", + "zh_CN": "上采样" + }, + "mode": "nn", + "properties": [ + { + "id": "size", + "type": "list", + "label": { + "zh_CN": "大小", + "en_US": "size" + }, + "default": [ + 0, + 0 + ], + "items": "number" + }, + { + "id": "scale_factor", + "type": "number", + "label": { + "en_US": "scale_factor", + "zh_CN": "缩放因子" + } + }, + { + "id": "mode", + "type": "enums", + "label": { + "zh_CN": "采样方法", + "en_US": "mode" + }, + "enums": [ + { + "id": "bilinear", + "value": "bilinear", + "label": "bilinear" + }, + { + "id": "trilinear", + "value": "trilinear", + "label": "trilinear" + }, + { + "id": "nearest", + "value": "nearest", + "label": "nearest", + "default": true + }, + { + "id": "bicubic", + "value": "bicubic", + "label": "bicubic" + }, + { + "id": "linear", + "value": "linear", + "label": "linear" + }, + { + "id": "area", + "value": "area", + "label": "area" + } + ] + }, + { + "id": "align_corners", + "type": "boolean", + "label": { + "en_US": "align_corners", + "zh_CN": "对齐" + }, + "default": false + }, + { + "id": "align_mode", + "type": "number", + "default": 0, + "label": { + "en_US": "align_mode", + "zh_CN": "双线性插值" + } + }, + { + "id": "data_format", + "type": "enums", + "label": { + "en_US": "data format", + "zh_CN": "数据格式" + }, + "enums": [ + { + "id": "NCW", + "value": "NCW", + "label": "NCW" + }, + { + "id": "NWC", + "value": "NWC", + "label": "NWC" + }, + { + "id": "NCHW", + "value": "NCHW", + "label": "NCHW", + "default": true + }, + { + "id": "NHWC", + "value": "NHWC", + "label": "NHWC" + }, + { + "id": "NCDHW", + "value": "NCDHW", + "label": "NCDHW" + }, + { + "id": "NDHWC", + "value": "NDHWC", + "label": "NDHWC" + } + ] + } + ] + }, + { + "id": "SpectralNorm", + "mode": "nn", + "label": { + "en_US": "SpectralNorm", + "zh_CN": "SpectralNorm" + }, + "properties": [ + { + "id": "weight_shape", + "type": "list", + "items": "number", + "label": { + "zh_CN": "权重参数的shape", + "en_US": "shape of weight attr" + } + }, + { + "id": "dim", + "type": "number", + "default": 0, + "label": { + "zh_CN": "维度索引", + "en_US": "dim" + } + }, + { + "id": "power_iters", + "default": 0, + "type": "number", + "label": { + "en_US": "power iters", + "zh_CN": "用于计算的 SpectralNorm 功率迭代次数" + } + }, + { + "id": "eps", + "type": "number", + "default": 1e-12, + "label": { + "zh_CN": "用于保证计算规范中的数值稳定性", + "en_US": "eps" + } + } + ] + }, + { + "id": "Unflatten", + "mode": "nn", + "label": { + "zh_CN": "Unflatten", + "en_US": "Unflatten" + }, + "properties": [ + { + "id": "axis", + "type": "number", + "label": { + "en_US": "axis", + "zh_CN": "要展开维度的轴" + } + }, + { + "id": "shape", + "type": "list", + "items": "number", + "label": { + "en_US": "shape", + "zh_CN": "展开的shape" + } + } + ] + } + ], + "layer": [] + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/public/mock/bundle.schema.json b/dl-flow-frontend/packages/design-core/public/mock/bundle.schema.json new file mode 100644 index 0000000..bc4ea11 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/public/mock/bundle.schema.json @@ -0,0 +1,268 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "bundle", + "type": "object", + "definitions": { + "properties": { + "type": "object", + "properties": { + "order": { + "type": "number" + }, + "id": { + "description": "该设置的唯一ID", + "type": "string" + }, + "label": { + "description": "该设置的label", + "$ref": "#/definitions/label" + }, + "type": { + "description": "该设置的数据类型", + "type": "string", + "enum": ["string", "number", "boolean", "enums", "ParamAttr", "list"] + }, + "required": { + "description": "该设置是否是必选", + "type": "boolean" + }, + "default": { + "description": "该设置的默认值", + "type": ["string", "number", "null", "boolean", "array"] + }, + "enums": { + "description": "该设置是否为select, 如果type为enum, 则该选项为必选", + "$ref": "#/definitions/enums" + }, + "items": { + "type": "string", + "enum": ["string", "number", "boolean"], + "description": "该项用于显式指定list中的数据结构, 如果type不为list, 该项则不是必选" + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "enums" + } + } + }, + "then": { + "required": ["enums"] + } + }, + { + "if": { + "properties": { + "type":{ + "const": "list" + } + } + }, + "then": { + "required": ["items"] + } + } + ] + }, + "enums": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "该选项的id", + "type": ["number", "string"] + }, + "label": { + "description": "该选项的显示名称", + "type": "string" + }, + "value": { + "description": "该选项的数值", + "type": "string" + }, + "default": { + "description": "是否默认选择", + "type": "boolean" + } + } + }, + "required": ["id", "label", "value"] + }, + "label": { + "type": "object", + "properties": { + "zh_CN": { + "type": "string", + "default": "" + }, + "en_US": { + "type": "string", + "default": "" + } + }, + "required": ["zh_CN", "en_US"] + }, + "layer": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": ["string", "number"], + "description": "Layer的全局唯一ID" + }, + "label": { + "$ref": "#/definitions/label", + "description": "Layer的label" + }, + "code": { + "type": "string" + }, + "codeAst": { + "$comment": "记录AST信息, 前端负责, 因为要动态插槽", + "type": "object", + "properties": {} + }, + "clazz": { + "$comment": "一个Layer理论上可以有多个Class,但传入进Seq的时候只能有一个, 这里提供一个clazz的选项, 该选项应该是codeAST中的一个合法的class", + "description": "一个Layer理论上可以有多个Class,但传入进Seq的时候只能有一个, 这里提供一个clazz的选项, 该选项应该是codeAST中的一个合法的class", + "type": "string" + }, + "properties": { + "$comment": "从codeAST中获取的properties信息, 对应的是python中__init__中的参数, 需要有序", + "type": "array", + "items": { + "$ref": "#/definitions/properties" + }, + "description": "转码时会将该properties作为参数带入" + } + }, + "required": ["id", "label", "code"] + } + }, + "Options": { + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/label" + }, + "nnName": { + "type": "string" + }, + "desc": { + "type": "string" + }, + "nn": { + "type": "boolean" + }, + "mode": { + "type": "string", + "enum": ["nn", "layer", "backbone", "fn"] + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/definitions/properties" + } + } + }, + "required": ["*"] + }, + "material": { + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/label" + }, + "id": { + "type": "string" + }, + "nnName": { + "description": "会在日后的版本移除该属性", + "type": "string" + }, + "desc": { + "type": "string", + "description": "该物料的介绍" + }, + "nn":{ + "description": "会在日后的版本移除该属性", + "type": "boolean" + }, + "mode": { + "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/definitions/properties" + } + } + }, + "required": ["id", "label", "mode", "properties"] + }, + "materials": { + "type": "array", + "items": { + "$ref": "#/definitions/material" + } + } + }, + "properties": { + "data": { + "type": "object", + "properties": { + "layer": { + "description": "自定义层信息", + "$ref": "#/definitions/layer" + }, + "materials": { + "description": "物料信息", + "$ref": "#/definitions/materials" + }, + "types": { + "description": "第三方类型", + "type": "object", + "patternProperties": { + ".*": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "label": { + "$ref": "#/definitions/label" + }, + "type": { + "type": "string" + }, + "default": { + "type": ["string", "number", "boolean", "object", "null"] + }, + "enums": { + "$ref": "#/definitions/enums" + } + }, + "if": { + "properties": { + "type": { "const": "enums" } + } + }, + "then": { + "required": ["enums"] + } + } + } + } + } + }, + "required": ["layer", "materials"] + } + } +} diff --git a/dl-flow-frontend/packages/design-core/public/monaco-linter/eslint.worker.js b/dl-flow-frontend/packages/design-core/public/monaco-linter/eslint.worker.js new file mode 100644 index 0000000..05cf20d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/public/monaco-linter/eslint.worker.js @@ -0,0 +1,57 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +// importScripts 不支持 esm, 此处使用 umd, 对外暴露的变量名:linter,需要填写openTiny的cdn地址 +importScripts('') + +// 根据公司的编码规范内置了 config/rules, 可以进一步定制 +const config = { + ...self.linter.config, + rules: { + ...self.linter.config.rules, + // JS 面板中,仅定义 function,但可能不使用该方法 + 'no-unused-vars': 'off', + 'no-alert': 'off', + 'no-console': 'off' + }, + settings: {} +} + +// 错误的等级,ESLint 与 monaco 的存在差异,做一层映射 +const severityMap = { + 2: 'Error', + 1: 'Warning' +} + +self.addEventListener('message', (event) => { + const { code, version } = event.data + + const ruleDefines = self.linter.esLinter.getRules() + const errs = self.linter.esLinter.verify(code, config) + + const markers = errs.map(({ ruleId = '', line, endLine, column, endColumn, message, severity }) => ({ + code: { + value: ruleId, + target: ruleDefines.get(ruleId)?.meta?.docs?.url + }, + startLineNumber: line, + endLineNumber: endLine, + startColumn: column, + endColumn: endColumn, + message: message, + severity: severityMap[severity], + source: 'ESLint' + })) + + // ESLint 静态检查结果,发回主线程 + self.postMessage({ markers, version }) +}) diff --git a/dl-flow-frontend/packages/design-core/public/tiny-vue.css b/dl-flow-frontend/packages/design-core/public/tiny-vue.css new file mode 100644 index 0000000..785372b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/public/tiny-vue.css @@ -0,0 +1,63 @@ +tiny-button { + display: inline-block; +} + +tiny-search{ +display: inline-block; +} + +tiny-switch{ + display: inline-block; +} + +tiny-select{ + display: inline-block; +} + +tiny-input{ + display: inline-table; +} + +tiny-checkbox{ + display: inline-flex; +} + +tiny-checkbox-button{ + display: block; +} + +tiny-checkbox-group{ + display: inline-block; +} + +tiny-dialog-box{ + display: block; +} + +tiny-time-line{ + display: block; +} + +tiny-form{ + display: block; +} + +tiny-form-item{ + display: block; +} + +tiny-tabs{ + display: block; +} + +tiny-pager{ + display: block; +} + +tiny-grid{ + display: block; +} + +tiny-grid-column{ + display: inline-block; +} diff --git a/dl-flow-frontend/packages/design-core/scripts/externalDeps.js b/dl-flow-frontend/packages/design-core/scripts/externalDeps.js new file mode 100644 index 0000000..418fec7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/scripts/externalDeps.js @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +/** + * 嵌入 + + diff --git a/dl-flow-frontend/packages/design-core/src/App.vue b/dl-flow-frontend/packages/design-core/src/App.vue new file mode 100644 index 0000000..cc98f80 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/App.vue @@ -0,0 +1,109 @@ + + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/DesignCanvas.vue b/dl-flow-frontend/packages/design-core/src/DesignCanvas.vue new file mode 100644 index 0000000..1908d9b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/DesignCanvas.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/DesignPlugins.vue b/dl-flow-frontend/packages/design-core/src/DesignPlugins.vue new file mode 100644 index 0000000..0b897c4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/DesignPlugins.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/DesignSettings.vue b/dl-flow-frontend/packages/design-core/src/DesignSettings.vue new file mode 100644 index 0000000..76ca6ed --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/DesignSettings.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/DesignToolbars.vue b/dl-flow-frontend/packages/design-core/src/DesignToolbars.vue new file mode 100644 index 0000000..d6786d4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/DesignToolbars.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/authentication/src/App.vue b/dl-flow-frontend/packages/design-core/src/authentication/src/App.vue new file mode 100644 index 0000000..fa0ad53 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/authentication/src/App.vue @@ -0,0 +1,52 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/authentication/src/components/login.vue b/dl-flow-frontend/packages/design-core/src/authentication/src/components/login.vue new file mode 100644 index 0000000..8f4b19e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/authentication/src/components/login.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/authentication/src/components/register.vue b/dl-flow-frontend/packages/design-core/src/authentication/src/components/register.vue new file mode 100644 index 0000000..58c2af4 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/authentication/src/components/register.vue @@ -0,0 +1,122 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/authentication/src/main.js b/dl-flow-frontend/packages/design-core/src/authentication/src/main.js new file mode 100644 index 0000000..9de6a92 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/authentication/src/main.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { createApp } from 'vue' +import initSvgs from '@opentiny/tiny-engine-svgs' +import App from './App.vue' +import 'virtual:svg-icons-register' + +const app = createApp(App) + +initSvgs(app) + +app.mount('#app') diff --git a/dl-flow-frontend/packages/design-core/src/canvas.js b/dl-flow-frontend/packages/design-core/src/canvas.js new file mode 100644 index 0000000..118254a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/canvas.js @@ -0,0 +1,3 @@ +import { createRender } from '@opentiny/tiny-engine-canvas' + +createRender(window.parent.TinyGlobalConfig) diff --git a/dl-flow-frontend/packages/design-core/src/dashboard/main.js b/dl-flow-frontend/packages/design-core/src/dashboard/main.js new file mode 100644 index 0000000..4feb2e2 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/dashboard/main.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { createApp } from 'vue' +import initSvgs from '@opentiny/tiny-engine-svgs' +import App from './src/App.vue' +import 'virtual:svg-icons-register' + +const app = createApp(App) + +initSvgs(app) + +app.mount('#app') diff --git a/dl-flow-frontend/packages/design-core/src/dashboard/src/App.vue b/dl-flow-frontend/packages/design-core/src/dashboard/src/App.vue new file mode 100644 index 0000000..bbe2d32 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/dashboard/src/App.vue @@ -0,0 +1,185 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/dashboard/src/components/List.vue b/dl-flow-frontend/packages/design-core/src/dashboard/src/components/List.vue new file mode 100644 index 0000000..1c41eb9 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/dashboard/src/components/List.vue @@ -0,0 +1,34 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/dashboard/src/components/ListItem.vue b/dl-flow-frontend/packages/design-core/src/dashboard/src/components/ListItem.vue new file mode 100644 index 0000000..78c2b26 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/dashboard/src/components/ListItem.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/dashboard/src/components/empty.vue b/dl-flow-frontend/packages/design-core/src/dashboard/src/components/empty.vue new file mode 100644 index 0000000..6cfa285 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/dashboard/src/components/empty.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/design-core/src/main.js b/dl-flow-frontend/packages/design-core/src/main.js new file mode 100644 index 0000000..777b547 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/main.js @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { createApp } from 'vue' +import initSvgs from '@opentiny/tiny-engine-svgs' +import { setGlobalConfig } from '@opentiny/tiny-engine-controller' +import i18n from '@opentiny/tiny-engine-common/js/i18n' +import App from './App.vue' +import globalConfig from '../config/lowcode.config' +import { initMonitor } from '@opentiny/tiny-engine-common/js/monitor' +import { isDevelopEnv } from '@opentiny/tiny-engine-common/js/environments' +import 'virtual:svg-icons-register' + +import TinyThemeTool from '@opentiny/vue-theme/theme-tool' +import { tinySmbTheme } from '@opentiny/vue-theme/theme' // SMB 主题 + +// eslint-disable-next-line no-new +new TinyThemeTool(tinySmbTheme, 'smbtheme') // 初始化主题 + +if (!isDevelopEnv) { + initMonitor() +} +window.TinyGlobalConfig = globalConfig +setGlobalConfig(globalConfig) + +const app = createApp(App) + +initSvgs(app) +window.lowcodeI18n = i18n +app.use(i18n).mount('#app') diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/App.vue b/dl-flow-frontend/packages/design-core/src/preview/src/App.vue new file mode 100644 index 0000000..a289d44 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/App.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/Toolbar.vue b/dl-flow-frontend/packages/design-core/src/preview/src/Toolbar.vue new file mode 100644 index 0000000..8f46583 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/Toolbar.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/constant/index.js b/dl-flow-frontend/packages/design-core/src/preview/src/constant/index.js new file mode 100644 index 0000000..6debf42 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/constant/index.js @@ -0,0 +1,23 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const PanelType = { + VUE: 'vue' +} + +const PreviewTips = { + ERROR_WHEN_COMPILE: '预览时,代码解析、预编译报错', + // 为了保持一致的 return,仅用作开发提示,相当于注释 + READY_FOR_PREVIEW: 'schema 生成的代码,装载成功,即将在线编译预览' +} + +export { PanelType, PreviewTips } diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/main.js b/dl-flow-frontend/packages/design-core/src/preview/src/main.js new file mode 100644 index 0000000..df3de70 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/main.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { createApp } from 'vue' +import initSvgs from '@opentiny/tiny-engine-svgs' +import App from './App.vue' +import 'virtual:svg-icons-register' + +const app = createApp(App) + +initSvgs(app) + +app.mount('#app') diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/Preview.vue b/dl-flow-frontend/packages/design-core/src/preview/src/preview/Preview.vue new file mode 100644 index 0000000..facd066 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/Preview.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/generate.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/generate.js new file mode 100644 index 0000000..3a7b3ab --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/generate.js @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +const generateDefaultExport = (data) => + data && typeof data === 'object' ? `export default ${JSON.stringify(data, null, 2)}`.trim() : 'export default {}' + +const generateStores = (globalState) => { + if (!Array.isArray(globalState)) { + return 'export {}' + } + + const result = ["import { defineStore } from 'pinia'\n"] + + const getStoreFunctionStrs = (getters = {}) => + Object.values(getters) + .map(({ value }) => value?.replace(/function /, '')) + .join(',\n') + + globalState.forEach(({ id, state, getters, actions }) => { + const storeCode = `export const ${id} = defineStore({ + id: '${id}', + state: () => (${JSON.stringify(state)}), + getters: { + ${getStoreFunctionStrs(getters)} + }, + actions: { + ${getStoreFunctionStrs(actions)} + } +})` + + result.push(storeCode) + }) + + return result.join('\n') +} + +const generateBridge = () => 'export default {}' + +const checkIsValidFunString = (str) => { + if (!str) { + return false + } + try { + const F = Function + const func = new F(`return ${str}`) + const type = Object.prototype.toString.call(func) + + return type === '[object Function]' || type === '[object AsyncFunction]' + } catch (error) { + return false + } +} + +function generateImportsByType({ item, imports, exportNames, functionStrs }) { + if (item.type === 'npm') { + const importFrom = `${item.content.package || ''}${item.content.main || ''}` + + if (importFrom) { + imports[importFrom] = imports[importFrom] || {} + const importItem = imports[importFrom] + + if (item.content.destructuring) { + importItem.destructurings = importItem.destructurings || [] + importItem.destructurings.push(item.content.exportName) + importItem.aliases = importItem.aliases || [] + importItem.aliases.push(item.name) + } else { + importItem.exportName = item.name + } + + exportNames.push(item.name) + } + } else if (item.type === 'function' && checkIsValidFunString(item.content.value)) { + functionStrs.push(`const ${item.name} = ${item.content.value}`) + exportNames.push(item.name) + } +} + +function generateStrsFromImports({ imports, strs, functionStrs, exportNames }) { + const importStrs = [] + + Object.entries(imports).forEach(([key, value]) => { + const list = [] + + if (value.exportName) { + list.push(value.exportName) + } + + if (Array.isArray(value.destructurings) && value.destructurings.length) { + const destructuringsWithAliases = value.destructurings.map((destructuring, index) => { + const alias = value.aliases[index] + if (destructuring === alias) { + return destructuring + } + return `${destructuring} as ${alias}` + }) + list.push(`{ ${destructuringsWithAliases.join(', ')} }`) + } + + importStrs.push(`import ${list.join(', ')} from '${key}'`) + }) + + strs.push(...importStrs, ...functionStrs) + + if (exportNames.length) { + strs.push(`export { ${exportNames.join(', ')} }`) + } +} + +const generateUtils = (list) => { + const strs = [] + + if (Array.isArray(list)) { + const exportNames = [] + const functionStrs = [] + const imports = {} + + list.forEach((item) => { + generateImportsByType({ item, imports, exportNames, functionStrs }) + }) + + generateStrsFromImports({ imports, strs, functionStrs, exportNames }) + } + + return strs.join('\n') +} + +/** + * 处理css文件依赖 + * @param {*} code 源代码 + * @param {*} cssList css文件 + * @returns + */ +export const processAppJsCode = (code, cssList) => { + return `${code}${cssList.map((css) => `addCss('${css}')`).join('\n')}` +} + +export default (data) => { + const locales = generateDefaultExport(data.i18n) + const dataSource = generateDefaultExport(data.dataSource) + const stores = generateStores(data.globalState) + const bridge = generateBridge(data.bridge) + const utils = generateUtils(data.utils) + + return { + 'locales.js': locales, + 'dataSource.js': dataSource, + 'stores.js': stores, + 'bridge.js': bridge, + 'utils.js': utils + } +} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/http.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/http.js new file mode 100644 index 0000000..8183ba7 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/http.js @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { useHttp } from '@opentiny/tiny-engine-http' +import { atou } from '@opentiny/tiny-engine-common/js/preview' + +const http = useHttp() + +const HEADER_LOWCODE_ORG = 'x-lowcode-org' + +export const getSearchParams = () => { + let params + + try { + params = JSON.parse(atou(location.hash.slice(1))) + } catch (error) { + params = {} + } + + return params +} + +export const fetchCode = async ({ platform, app, type, id, history, pageInfo, tenant } = {}) => + pageInfo + ? http.post( + '/app-center/api/schema2code', + { platform, app, pageInfo }, + { + headers: { [HEADER_LOWCODE_ORG]: tenant } + } + ) + : http.get('/app-center/api/code', { + headers: { [HEADER_LOWCODE_ORG]: tenant }, + params: { platform, app, type, id, history } + }) + +export const fetchMetaData = async ({ platform, app, type, id, history, tenant } = {}) => + id + ? http.get('/app-center/api/preview/metadata', { + headers: { [HEADER_LOWCODE_ORG]: tenant }, + params: { platform, app, type, id, history } + }) + : {} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/importMap.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/importMap.js new file mode 100644 index 0000000..2d7a1aa --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/importMap.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +// import { hyphenate } from '@vue/shared' + +import { getSearchParams } from './http' +import { VITE_CDN_DOMAIN } from '@opentiny/tiny-engine-common/js/environments' + +const importMap = {} + +const opentinyVueVersion = '~3.11' + +const tinyVue3Imports = { + // 推荐之后统一使用@opentiny/vue去引入依赖,兼容后续录入的组件来源于tiny-vue + '@opentiny/vue': `${VITE_CDN_DOMAIN}/@opentiny/vue@${opentinyVueVersion}/runtime/tiny-vue.mjs`, + '@opentiny/vue-icon': `${VITE_CDN_DOMAIN}/@opentiny/vue@${opentinyVueVersion}/runtime/tiny-vue-icon.mjs`, + '@opentiny/vue-common': `${VITE_CDN_DOMAIN}/@opentiny/vue@${opentinyVueVersion}/runtime/tiny-vue-common.mjs`, + '@opentiny/vue-locale': `${VITE_CDN_DOMAIN}/@opentiny/vue@${opentinyVueVersion}/runtime/tiny-vue-locale.mjs`, + '@opentiny/vue-renderless/': `${VITE_CDN_DOMAIN}/@opentiny/vue-renderless@${opentinyVueVersion}/` +} + +importMap.imports = { + vue: `${VITE_CDN_DOMAIN}/vue@3.2.36/dist/vue.runtime.esm-browser.js`, + 'vue/server-renderer': `${VITE_CDN_DOMAIN}/@vue/server-renderer@3.2.36/dist/server-renderer.esm-browser.js`, + 'vue-i18n': `${VITE_CDN_DOMAIN}/vue-i18n@9.2.0-beta.36/dist/vue-i18n.esm-browser.js`, + 'vue-router': `${VITE_CDN_DOMAIN}/vue-router@4.0.16/dist/vue-router.esm-browser.js`, + '@vue/devtools-api': `${VITE_CDN_DOMAIN}/@vue/devtools-api@6.5.1/lib/esm/index.js`, + '@vueuse/core': `${VITE_CDN_DOMAIN}/@vueuse/core@9.6.0/index.mjs`, + '@vueuse/shared': `${VITE_CDN_DOMAIN}/@vueuse/shared@9.6.0/index.mjs`, + axios: `${VITE_CDN_DOMAIN}/axios@1.0.0-alpha.1/dist/esm/axios.js`, + 'axios-mock-adapter': `${VITE_CDN_DOMAIN}/axios-mock-adapter@1.21.1/dist/axios-mock-adapter.js`, + '@opentiny/tiny-engine-webcomponent-core': `${VITE_CDN_DOMAIN}/@opentiny/tiny-engine-webcomponent-core@1/dist/tiny-engine-webcomponent-core.es.js`, + '@opentiny/tiny-engine-i18n-host': `${VITE_CDN_DOMAIN}/@opentiny/tiny-engine-i18n-host@1/dist/tiny-engine-i18n-host.es.js`, + '@opentiny/tiny-engine-builtin-component': `${VITE_CDN_DOMAIN}/@opentiny/tiny-engine-builtin-component@1/dist/index.js`, + 'vue-demi': `${VITE_CDN_DOMAIN}/vue-demi@0.13.11/lib/index.mjs`, + pinia: `${VITE_CDN_DOMAIN}/pinia@2.0.22/dist/pinia.esm-browser.js`, + ...tinyVue3Imports, + ...getSearchParams().scripts +} + +export default importMap diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles.js new file mode 100644 index 0000000..2b10999 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles.js @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import appVue from './srcFiles/App.vue?raw' +import injectGlobalJS from './srcFiles/injectGlobal.js?raw' +import constantJS from './srcFiles/constant/index.js?raw' +import appJS from './srcFiles/app.js?raw' +import mainVue from './srcFiles/Main.vue?raw' +import lowcodeJS from './srcFiles/lowcode.js?raw' +import dataSourceMapJS from './srcFiles/dataSourceMap.js?raw' +import dataSourceJS from './srcFiles/dataSource.js?raw' +import utilsJS from './srcFiles/utils.js?raw' +import bridgeJS from './srcFiles/bridge.js?raw' +import localesJS from './srcFiles/locales.js?raw' +import storesJS from './srcFiles/stores.js?raw' +import storesHelperJS from './srcFiles/storesHelper.js?raw' + +const srcFiles = {} + +srcFiles['App.vue'] = appVue +srcFiles['Main.vue'] = mainVue +srcFiles['constant.js'] = constantJS +srcFiles['app.js'] = appJS.replace(/VITE_CDN_DOMAIN/g, import.meta.env.VITE_CDN_DOMAIN) +srcFiles['injectGlobal.js'] = injectGlobalJS +srcFiles['lowcode.js'] = lowcodeJS +srcFiles['dataSourceMap.js'] = dataSourceMapJS +srcFiles['dataSource.js'] = dataSourceJS +srcFiles['utils.js'] = utilsJS +srcFiles['bridge.js'] = bridgeJS +srcFiles['locales.js'] = localesJS +srcFiles['stores.js'] = storesJS +srcFiles['storesHelper.js'] = storesHelperJS + +export default srcFiles diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/App.vue b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/App.vue new file mode 100644 index 0000000..66a4feb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/App.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/Login.vue b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/Login.vue new file mode 100644 index 0000000..cd64e9b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/Login.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/Main.vue b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/Main.vue new file mode 100644 index 0000000..2d4963b --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/Main.vue @@ -0,0 +1,3 @@ + diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/app.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/app.js new file mode 100644 index 0000000..d01bd1d --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/app.js @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +function addCss(href) { + const link = document.createElement('link') + link.setAttribute('rel', 'stylesheet') + link.setAttribute('href', href) + document.head.appendChild(link) +} +addCss('VITE_CDN_DOMAIN/@opentiny/vue-theme@3.11/index.css') +addCss('VITE_CDN_DOMAIN/@opentiny/vue-theme-mobile@3.11/index.css') diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/bridge.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/bridge.js new file mode 100644 index 0000000..3ee6a55 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/bridge.js @@ -0,0 +1,13 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export default {} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/constant/index.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/constant/index.js new file mode 100644 index 0000000..b166abb --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/constant/index.js @@ -0,0 +1,22 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const BROADCAST_CHANNEL = { + PreviewLang: 'tiny-lowcode-preview-lang' +} + +export const I18N_KEY_MAPS = { + zhCN: 'zh_CN', + enUS: 'en_US' +} + +export { BROADCAST_CHANNEL } diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/dataSource.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/dataSource.js new file mode 100644 index 0000000..547a519 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/dataSource.js @@ -0,0 +1,16 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export default { + list: [], + dataHandler: null +} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js new file mode 100644 index 0000000..ae37f2e --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js @@ -0,0 +1,35 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import dataSources from './dataSource.js' + +const dataSourceMap = {} + +Array.isArray(dataSources.list) && + dataSources.list.forEach((config) => { + const dataSource = { config: config.data } + + const result = { + code: '', + msg: 'success', + data: {} + } + result.data = + dataSource.config.type === 'array' + ? { items: dataSource?.config?.data, total: dataSource?.config?.data?.length } + : dataSource?.config?.data + dataSourceMap[config.name] = dataSource + + dataSource.load = () => Promise.resolve(result) + }) + +export default dataSourceMap diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/injectGlobal.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/injectGlobal.js new file mode 100644 index 0000000..62bc52f --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/injectGlobal.js @@ -0,0 +1,17 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import * as Vue from 'vue' +import * as VueI18n from 'vue-i18n' + +window.Vue = Vue +window.VueI18n = VueI18n diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/locales.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/locales.js new file mode 100644 index 0000000..cec31cf --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/locales.js @@ -0,0 +1,16 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export default { + zh_CN: {}, + en_US: {} +} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/lowcode.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/lowcode.js new file mode 100644 index 0000000..22d96c1 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/lowcode.js @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { getCurrentInstance, nextTick, provide, inject } from 'vue' +import { I18nInjectionKey } from 'vue-i18n' +import dataSourceMap from './dataSourceMap.js' +import * as utils from './utils.js' +import * as bridge from './bridge.js' +import { useStores } from './storesHelper.js' +import { Modal } from '@opentiny/vue' + +export const lowcodeWrap = (props, context) => { + const global = {} + const instance = getCurrentInstance() + const router = new Proxy( + {}, + { + get() { + Modal.alert('页面和区块预览不支持路由操作,请使用应用预览', '提示') + return () => {} + } + } + ) + const { t, locale } = inject(I18nInjectionKey).global + const emit = context.emit + const ref = (ref) => instance.refs[ref] + + const setState = (newState, callback) => { + Object.assign(global.state, newState) + nextTick(() => callback?.apply(global)) + } + + const getLocale = () => locale.value + const setLocale = (val) => { + locale.value = val + } + + const location = () => window.location + const history = () => window.history + + Object.defineProperties(global, { + props: { get: () => props }, + emit: { get: () => emit }, + setState: { get: () => setState }, + router: { get: () => router }, + i18n: { get: () => t }, + getLocale: { get: () => getLocale }, + setLocale: { get: () => setLocale }, + location: { get: location }, + history: { get: history }, + utils: { get: () => utils }, + bridge: { get: () => bridge }, + dataSourceMap: { get: () => dataSourceMap }, + $: { get: () => ref } + }) + + const wrap = (fn) => { + if (typeof fn === 'function') { + return (...args) => fn.apply(global, args) + } + + Object.entries(fn).forEach(([name, value]) => { + Object.defineProperty(global, name, { + get: () => value + }) + }) + + fn.t = t + + return fn + } + + return wrap +} + +export default () => { + const i18n = inject(I18nInjectionKey) + provide(I18nInjectionKey, i18n) + + const stores = useStores() + + return { t: i18n.global.t, stores, lowcodeWrap } +} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/stores.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/stores.js new file mode 100644 index 0000000..ff4ee0a --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/stores.js @@ -0,0 +1,13 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export {} diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/storesHelper.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/storesHelper.js new file mode 100644 index 0000000..f766b54 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/storesHelper.js @@ -0,0 +1,29 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import * as userDefinedStores from './stores.js' + +const validStore = (store) => typeof store === 'function' && store.name === 'useStore' && store.$id + +const useStores = () => { + const stores = {} + + Object.values(userDefinedStores) + .filter(validStore) + .forEach((store) => { + stores[store.$id] = store() + }) + + return stores +} + +export { validStore, useStores } diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/utils.js b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/utils.js new file mode 100644 index 0000000..b511783 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/preview/srcFiles/utils.js @@ -0,0 +1,14 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { Pager, Select, Modal, Input } from '@opentiny/vue' +export { Pager, Select, Modal, Input } diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/previewApp.js b/dl-flow-frontend/packages/design-core/src/preview/src/previewApp.js new file mode 100644 index 0000000..0d7dab5 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/previewApp.js @@ -0,0 +1,17 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { createApp } from 'vue' + +import App from './previewApp.vue' + +createApp(App).mount('#app') diff --git a/dl-flow-frontend/packages/design-core/src/preview/src/previewApp.vue b/dl-flow-frontend/packages/design-core/src/preview/src/previewApp.vue new file mode 100644 index 0000000..5700df0 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/src/preview/src/previewApp.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/dl-flow-frontend/packages/design-core/vite.config.js b/dl-flow-frontend/packages/design-core/vite.config.js new file mode 100644 index 0000000..116dcc3 --- /dev/null +++ b/dl-flow-frontend/packages/design-core/vite.config.js @@ -0,0 +1,296 @@ +import { defineConfig, loadEnv } from 'vite' + +import path from 'path' +import vue from '@vitejs/plugin-vue' +import monacoEditorPlugin from 'vite-plugin-monaco-editor' +import vueJsx from '@vitejs/plugin-vue-jsx' +import nodeGlobalsPolyfillPlugin from '@esbuild-plugins/node-globals-polyfill' +import nodeModulesPolyfillPlugin from '@esbuild-plugins/node-modules-polyfill' +import nodePolyfill from 'rollup-plugin-polyfill-node' +import lowcodeConfig from './config/lowcode.config' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' +import { importmapPlugin } from './scripts/externalDeps' +import visualizer from 'rollup-plugin-visualizer' + +const origin = 'http://localhost:9090/' + +const config = { + base: './', + publicDir: path.resolve(__dirname, './public'), + resolve: { + extensions: ['.js', '.jsx', '.vue'], + alias: {} + }, + server: { + // 这里保证本地启动服务是localhost,支持js多线程和谷歌浏览器读写本地文件api + port: 8080, + open: '/?type=app&id=918&tenant=1', + + proxy: { + '/app-center/v1/api': { + target: origin, + changeOrigin: true + }, + '/app-center/api': { + target: origin, + changeOrigin: true + }, + '/material-center/api': { + target: origin, + changeOrigin: true + }, + '/platform-center/api': { + target: origin, + changeOrigin: true + }, + } + }, + preview: { + host: 'localhost', + port: 8080, + open: false + }, + plugins: [ + visualizer({ + filename: 'tmp/report.html', + title: 'Bundle Analyzer' + }), + vue({ + reactivityTransform: path.resolve(__dirname, 'src'), + template: { + compilerOptions: { + isCustomElement: (tag) => tag.startsWith('tiny-i18n-host') || tag.startsWith('ng') + } + } + }), + vueJsx(), + createSvgIconsPlugin({ + iconDirs: [ + path.resolve(__dirname, './assets/rf-resources/'), // 脚手架执行构建时将图元图片拷贝到此目录 + path.resolve(__dirname, './assets/') + ], + symbolId: 'icon-[name]', + inject: 'body-last' + }) + ], + optimizeDeps: { + esbuildOptions: { + plugins: [ + nodeGlobalsPolyfillPlugin({ + process: true, + buffer: true + }), + nodeModulesPolyfillPlugin() + ] + } + }, + define: { + 'process.env': {} + }, + build: { + commonjsOptions: { + transformMixedEsModules: true, + // monaco-editor 满足 ESM 规范,防止被误转换 + exclude: ['node_modules/*monaco-editor*/**', 'node_modules/lodash-es/**', 'node_modules/@types/lodash-es/**'] + }, + minify: true, + sourcemap: false, + rollupOptions: { + plugins: [nodePolyfill({ include: null })], // 使用@rollup/plugin-inject的默认值{include: null}, 即在所有代码中生效 + input: { + index: path.resolve(__dirname, './index.html'), + canvas: path.resolve(__dirname, './canvas.html'), + preview: path.resolve(__dirname, './preview.html'), + previewApp: path.resolve(__dirname, './previewApp.html'), + authentication: path.resolve(__dirname, './authentication.html'), + dashboard: path.resolve(__dirname, './dashboard.html') + }, + output: { + manualChunks: (id) => { + const chunksMap = { + monaco: ['node_modules/monaco-editor'], + prettier: ['node_modules/prettier'], + vendor: ['node_modules'] + } + for (const [chunkName, sourcePaths] of Object.entries(chunksMap)) { + if (sourcePaths.some((item) => id.indexOf(item) > -1)) { + return chunkName + } + } + return undefined + } + } + } + } +} + +const importMapVersions = { + prettier: '2.7.1', + vue: '3', + tinyVue: '~3.11' +} + +const devAlias = { + '@opentiny/tiny-engine-common/js': path.resolve(__dirname, '../common/js'), + '@opentiny/tiny-engine-common/component': path.resolve(__dirname, '../common/component'), + '@opentiny/tiny-engine-common': path.resolve(__dirname, '../common/index.js'), + '@opentiny/tiny-engine-controller/utils': path.resolve(__dirname, '../controller/utils.js'), + '@opentiny/tiny-engine-controller/adapter': path.resolve(__dirname, '../controller/adapter.js'), + '@opentiny/tiny-engine-controller': path.resolve(__dirname, '../controller/src/index.js'), + '@opentiny/tiny-engine-plugin-materials': path.resolve(__dirname, '../plugins/materials/index.js'), + '@opentiny/tiny-engine-plugin-block': path.resolve(__dirname, '../plugins/block/index.js'), + '@opentiny/tiny-engine-plugin-data': path.resolve(__dirname, '../plugins/data/index.js'), + '@opentiny/tiny-engine-plugin-datasource': path.resolve(__dirname, '../plugins/datasource/index.js'), + '@opentiny/tiny-engine-plugin-script': path.resolve(__dirname, '../plugins/script/index.js'), + '@opentiny/tiny-engine-plugin-tree': path.resolve(__dirname, '../plugins/tree/index.js'), + '@opentiny/tiny-engine-plugin-help': path.resolve(__dirname, '../plugins/help/index.js'), + '@opentiny/tiny-engine-plugin-schema': path.resolve(__dirname, '../plugins/schema/index.js'), + '@opentiny/tiny-engine-plugin-page': path.resolve(__dirname, '../plugins/page/index.js'), + '@opentiny/tiny-engine-plugin-i18n': path.resolve(__dirname, '../plugins/i18n/index.js'), + '@opentiny/tiny-engine-plugin-bridge': path.resolve(__dirname, '../plugins/bridge/index.js'), + '@opentiny/tiny-engine-plugin-tutorial': path.resolve(__dirname, '../plugins/tutorial/index.js'), + '@opentiny/tiny-engine-plugin-robot': path.resolve(__dirname, '../plugins/robot/index.js'), + '@opentiny/tiny-engine-setting-events': path.resolve(__dirname, '../settings/events/index.js'), + '@opentiny/tiny-engine-setting-props': path.resolve(__dirname, '../settings/props/index.js'), + '@opentiny/tiny-engine-setting-styles': path.resolve(__dirname, '../settings/styles/index.js'), + '@opentiny/tiny-engine-toolbar-breadcrumb': path.resolve(__dirname, '../toolbars/breadcrumb/index.js'), + '@opentiny/tiny-engine-toolbar-fullscreen': path.resolve(__dirname, '../toolbars/fullscreen/index.js'), + '@opentiny/tiny-engine-toolbar-lang': path.resolve(__dirname, '../toolbars/lang/index.js'), + '@opentiny/tiny-engine-toolbar-layout': path.resolve(__dirname, '../toolbars/layout/index.js'), + '@opentiny/tiny-engine-toolbar-checkinout': path.resolve(__dirname, '../toolbars/lock/index.js'), + '@opentiny/tiny-engine-toolbar-logo': path.resolve(__dirname, '../toolbars/logo/index.js'), + '@opentiny/tiny-engine-toolbar-logout': path.resolve(__dirname, '../toolbars/logout/index.js'), + '@opentiny/tiny-engine-toolbar-media': path.resolve(__dirname, '../toolbars/media/index.js'), + '@opentiny/tiny-engine-toolbar-preview': path.resolve(__dirname, '../toolbars/preview/index.js'), + '@opentiny/tiny-engine-toolbar-generate-vue': path.resolve(__dirname, '../toolbars/generate-vue/index.js'), + '@opentiny/tiny-engine-toolbar-refresh': path.resolve(__dirname, '../toolbars/refresh/index.js'), + '@opentiny/tiny-engine-toolbar-redoundo': path.resolve(__dirname, '../toolbars/redoundo/index.js'), + '@opentiny/tiny-engine-toolbar-clean': path.resolve(__dirname, '../toolbars/clean/index.js'), + '@opentiny/tiny-engine-toolbar-save': path.resolve(__dirname, '../toolbars/save/index.js'), + '@opentiny/tiny-engine-toolbar-setting': path.resolve(__dirname, '../toolbars/setting/index.js'), + '@opentiny/tiny-engine-toolbar-collaboration': path.resolve(__dirname, '../toolbars/collaboration/index.js'), + '@opentiny/tiny-engine-theme-dark': path.resolve(__dirname, '../theme/dark/index.less'), + '@opentiny/tiny-engine-theme-light': path.resolve(__dirname, '../theme/light/index.less'), + '@opentiny/tiny-engine-svgs': path.resolve(__dirname, '../svgs/index.js'), + '@opentiny/tiny-engine-http': path.resolve(__dirname, '../http/src/index.js'), + '@opentiny/tiny-engine-canvas': path.resolve(__dirname, '../canvas/src/index.js'), + '@opentiny/tiny-engine-theme': path.resolve(__dirname, `../theme/${lowcodeConfig.theme}/index.less`), + '@opentiny/tiny-engine-utils': path.resolve(__dirname, '../utils/src/index.js'), + '@opentiny/tiny-engine-webcomponent-core': path.resolve(__dirname, '../webcomponent/src/lib.js'), + '@opentiny/tiny-engine-i18n-host': path.resolve(__dirname, '../i18n/src/lib.js'), + '@opentiny/tiny-engine-builtin-component': path.resolve(__dirname, '../builtinComponent/index.js'), + 'dl-flow-toolbar-export': path.resolve(__dirname, '../toolbars/export/index.js'), + 'dl-flow-toolbar-save': path.resolve(__dirname, '../toolbars/save/index.js'), + 'dl-flow-toolbar-rename': path.resolve(__dirname, '../toolbars/rename/index.js'), + 'dl-flow-toolbar-menu': path.resolve(__dirname, '../toolbars/menu/index.js') +} + +const prodAlias = { + '@opentiny/tiny-engine-theme': path.resolve( + __dirname, + `node_modules/@opentiny/tiny-engine-theme-${lowcodeConfig.theme}/dist/style.css` + ) +} + +const commonAlias = { + '@opentiny/tiny-engine-app-addons': path.resolve(__dirname, './config/addons.js') +} + +export default defineConfig(({ command, mode }) => { + const { VITE_CDN_DOMAIN, VITE_ENDPOINT_URL, VITE_ENDPOINT_WS_URL} = loadEnv(mode, process.cwd(), '') + const monacoPublicPath = { + local: 'editor/monaco-workers', + alpha: 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets', + prod: 'https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/monaco-assets' + } + + let monacoEditorPluginInstance = monacoEditorPlugin({ publicPath: monacoPublicPath.local }) + const htmlPlugin = (mode) => { + const upgradeHttpsMetaTags = [] + const includeHtmls = ['index.html', 'preview.html', 'previewApp.html'] + + if (mode === 'alpha' || mode === 'prod') { + upgradeHttpsMetaTags.push({ + tag: 'meta', + injectTo: 'head-prepend', + attrs: { + 'http-equiv': 'Content-Security-Policy', + content: 'upgrade-insecure-requests' + } + }) + } + + return { + name: 'html-transform', + transformIndexHtml: { + enforce: 'pre', + transform(html, { filename }) { + return { + html, + tags: includeHtmls.includes(path.basename(filename)) ? upgradeHttpsMetaTags : [] + } + } + } + } + } + + if (command === 'serve') { + const devVueAlias = { + find: /^vue$/, + replacement: `${VITE_CDN_DOMAIN}/vue@${importMapVersions.vue}/dist/vue.runtime.esm-browser.js` + } + + config.resolve.alias = [ + devVueAlias, + ...Object.entries({ ...commonAlias, ...devAlias }).map(([find, replacement]) => ({ + find, + replacement + })) + ] + } else { + // command === 'build' + config.resolve.alias = { ...commonAlias, ...prodAlias } + + monacoEditorPluginInstance = monacoEditorPlugin({ publicPath: monacoPublicPath[mode] }) + + if (mode === 'prod') { + config.build.minify = true + config.build.sourcemap = false + } + } + + const importmap = { + imports: { + // prettier: `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/standalone.mjs`, + // 'prettier/': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/`, + // 'prettier/parser-typescript': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-typescript.mjs`, + // 'prettier/parser-html': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-html.mjs`, + // 'prettier/parser-postcss': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-postcss.mjs`, + // 'prettier/parser-babel': `${VITE_CDN_DOMAIN}/prettier@${importMapVersions.prettier}/esm/parser-babel.mjs`, + + vue: `${VITE_CDN_DOMAIN}/vue@${importMapVersions.vue}/dist/vue.runtime.esm-browser.prod.js`, + '@opentiny/vue': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue.mjs`, + '@opentiny/vue-icon': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue-icon.mjs`, + '@opentiny/vue-common': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue-common.mjs`, + '@opentiny/vue-locale': `${VITE_CDN_DOMAIN}/@opentiny/vue@${importMapVersions.tinyVue}/runtime/tiny-vue-locale.mjs`, + '@opentiny/vue-design-smb': `${VITE_CDN_DOMAIN}/@opentiny/vue-design-smb@${importMapVersions.tinyVue}/index.js`, + '@opentiny/vue-theme/theme-tool': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${importMapVersions.tinyVue}/theme-tool`, + '@opentiny/vue-theme/theme': `${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${importMapVersions.tinyVue}/theme` + } + } + const importMapStyles = [`${VITE_CDN_DOMAIN}/@opentiny/vue-theme@${importMapVersions.tinyVue}/index.css`] + + config.plugins.push(monacoEditorPluginInstance, htmlPlugin(mode), importmapPlugin(importmap, importMapStyles)) + + config.server.proxy['/socket.io']={ + target: VITE_ENDPOINT_WS_URL, + changeOrigin: true, + ws: true + } + config.server.proxy['/endpoint'] = { + target: VITE_ENDPOINT_URL, + changeOrigin: true, + rewrite: path => path.replace(/^\/endpoint/, ''), + } + return config +}) diff --git a/dl-flow-frontend/packages/http/package.json b/dl-flow-frontend/packages/http/package.json new file mode 100644 index 0000000..45bf365 --- /dev/null +++ b/dl-flow-frontend/packages/http/package.json @@ -0,0 +1,44 @@ +{ + "name": "@opentiny/tiny-engine-http", + "version": "1.0.1", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "exports": { + ".": "./dist/index.js" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/http" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@vueuse/core": "^9.13.0", + "axios": "^0.27.2", + "axios-cache-adapter": "^2.7.3", + "axios-mock-adapter": "^1.21.5", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/http/src/Login.vue b/dl-flow-frontend/packages/http/src/Login.vue new file mode 100644 index 0000000..6c5c8b0 --- /dev/null +++ b/dl-flow-frontend/packages/http/src/Login.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/dl-flow-frontend/packages/http/src/axios.js b/dl-flow-frontend/packages/http/src/axios.js new file mode 100644 index 0000000..8795621 --- /dev/null +++ b/dl-flow-frontend/packages/http/src/axios.js @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import axios from 'axios' +import MockAdapter from 'axios-mock-adapter' +export default (config) => { + const instance = axios.create({ + ...config + }) + const defaults = {} + let mock + + if (typeof MockAdapter.prototype.proxy === 'undefined') { + MockAdapter.prototype.proxy = function ({ url, config = {}, proxy, response, handleData } = {}) { + let stream = this + const request = (proxy, any) => { + return (setting) => { + return new Promise((resolve) => { + config.responseType = 'json' + axios + .get(any ? proxy + setting.url + '.json' : proxy, config) + .then(({ data }) => { + typeof handleData === 'function' && (data = handleData(data, setting)) + resolve([200, data]) + }) + .catch((error) => { + resolve([error.response.status, error.response.data]) + }) + }) + } + } + + if (url === '*' && proxy && typeof proxy === 'string') { + stream = proxy === '*' ? this.onAny().passThrough() : this.onAny().reply(request(proxy, true)) + } else { + if (proxy && typeof proxy === 'string') { + stream = this.onAny(url).reply(request(proxy)) + } else if (typeof response === 'function') { + stream = this.onAny(url).reply(response) + } + } + + return stream + } + } + + return { + request(config) { + return instance(config) + }, + get(url, config) { + return instance.get(url, config) + }, + delete(url, config) { + return instance.delete(url, config) + }, + head(url, config) { + return instance.head(url, config) + }, + post(url, data, config) { + return instance.post(url, data, config) + }, + put(url, data, config) { + return instance.put(url, data, config) + }, + patch(url, data, config) { + return instance.patch(url, data, config) + }, + all(iterable) { + return axios.all(iterable) + }, + spread(callback) { + return axios.spread(callback) + }, + defaults(key, value) { + if (key && typeof key === 'string') { + if (typeof value === 'undefined') { + return instance.defaults[key] + } + instance.defaults[key] = value + defaults[key] = value + return undefined + } + + return instance.defaults + }, + defaultSettings() { + return defaults + }, + interceptors: { + request: { + use(fnHandle, fnError) { + return instance.interceptors.request.use(fnHandle, fnError) + }, + eject(id) { + return instance.interceptors.request.eject(id) + } + }, + response: { + use(fnHandle, fnError) { + return instance.interceptors.response.use(fnHandle, fnError) + }, + eject(id) { + return instance.interceptors.response.eject(id) + } + } + }, + mock(config) { + if (!mock) { + mock = new MockAdapter(instance) + } + + if (Array.isArray(config)) { + config.forEach((item) => { + mock.proxy(item) + }) + } + + return mock + }, + disableMock() { + mock && mock.restore() + mock = undefined + }, + isMock() { + return typeof mock !== 'undefined' + }, + CancelToken: axios.CancelToken, + isCancel: axios.isCancel + } +} diff --git a/dl-flow-frontend/packages/http/src/config.js b/dl-flow-frontend/packages/http/src/config.js new file mode 100644 index 0000000..23d05f7 --- /dev/null +++ b/dl-flow-frontend/packages/http/src/config.js @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { VITE_ORIGIN, isDevelopEnv } from '@opentiny/tiny-engine-common/js/environments' + +const baseURL = VITE_ORIGIN + +// 仅在本地开发时,启用 withCredentials +const dev = isDevelopEnv + +// 获取租户 id +const getTenant = () => new URLSearchParams(location.search).get('tenant') + +export default { + baseURL, + withCredentials: false, + headers: { + 'x-lowcode-mode': dev ? 'develop' : null, + 'x-lowcode-org': getTenant() + } +} diff --git a/dl-flow-frontend/packages/http/src/index.js b/dl-flow-frontend/packages/http/src/index.js new file mode 100644 index 0000000..8612ee7 --- /dev/null +++ b/dl-flow-frontend/packages/http/src/index.js @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +/* eslint-disable no-undef */ +import axios from './axios' +import { createApp } from 'vue' +import { isMock, isVsCodeEnv, isDevelopEnv } from '@opentiny/tiny-engine-common/js/environments' +import { useBroadcastChannel, useSessionStorage } from '@vueuse/core' +import Login from './Login.vue' +import config from './config' +import mockData from './mock' +import { constants } from '@opentiny/tiny-engine-utils' + +const { BROADCAST_CHANNEL } = constants + +const { post: globalNotify } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) + +const procession = { + promiseLogin: null, + mePromise: {} +} + +const LOGIN_EXPIRED_CODE = 401 +const BAD_REQUEST = 400; + +const loginDom = document.createElement('div') +document.body.appendChild(loginDom) +const loginVM = createApp(Login).mount(loginDom) + +const showError = (url, message) => { + globalNotify({ + type: 'error', + title: `接口 ${url} 请求报错`, + message: `报错信息: ${message}` + }) +} + +window.lowcode = { + platformCenter: { + Session: { + rebuiltCallback: function () { + loginVM.closeLogin() + + procession.mePromise.resolve('login ok') + procession.promiseLogin = null + procession.mePromise = {} + } + } + } +} + +export const createHttp = (options, extendsConfig) => { + const http = axios({ + ...config, + ...extendsConfig + }) + + // 如果未指定是否启用 mock,则本地开发时默认启用,模拟数据在 public/mock 目录下 + const { enableMock = isDevelopEnv } = options + enableMock && http.mock(mockData) + + /** + * + * @param {import('axios').AxiosRequestConfig} config + * @returns + */ + const preRequest = (config) => { + if (isDevelopEnv && config.url.match(/\/generate\//)) { + config.baseURL = '' + } + + if (isVsCodeEnv) { + config.baseURL = '' + } + const token = useSessionStorage('token', ''); + config.headers.Authorization = `Bearer ${token.value}`; + return config + } + + // 请求拦截器 + http.interceptors.request.use(preRequest) + + const preResponse = (res) => { + if (res.data?.error) { + showError(res.config?.url, res?.data?.error?.message) + + return Promise.reject(res.data.error) + } + if (res.data.data){ + return res.data.data; + } + return res.data; + } + + const errorResponse = (error) => { + // 用户信息失效时,弹窗提示登录 + const { response } = error + if (response.status === LOGIN_EXPIRED_CODE){ + window.location.href = '/authentication.html' + return Promise.reject('登录过期'); + } + if (response.status === BAD_REQUEST){ + return Promise.reject(typeof response.data.message === 'string' ? response.data.message : response.data.message[0]); + } + return Promise.reject(response.data.message); + } + + // 响应拦截器 + http.interceptors.response.use(preResponse, errorResponse) + + return http +} + +export const useHttp = () => createHttp({ enableMock: isMock }, {}) +export const useEndpoint = () => createHttp({enableMock: false}) diff --git a/dl-flow-frontend/packages/http/src/mock.js b/dl-flow-frontend/packages/http/src/mock.js new file mode 100644 index 0000000..9b33d94 --- /dev/null +++ b/dl-flow-frontend/packages/http/src/mock.js @@ -0,0 +1,939 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const arrData = [] +const blockList = [] +let tempObj = null +let blockCount = 0 +let blockProgress = 0 + +export default [ + // 获取app的详细信息 + { + url: /\/app-center\/api\/apps\/detail/, + response: async () => { + const getAppInfo = async () => { + const response = await fetch('/mock/appInfo.json') + return response.json() + } + + const appInfoRes = await getAppInfo() + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, appInfoRes]) + }, 1000) + }) + } + }, + { + url: /api\/apps\/i18n\/entries/, + response: async () => { + const getAppInfo = async () => { + const response = await fetch('/mock/i18n.json') + return response.json() + } + + const appInfoRes = await getAppInfo() + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, appInfoRes]) + }, 1000) + }) + } + }, + // 获取应用列表信息 + { + url: /\/app-center\/api\/apps\/list/, + response: async () => { + const getAppList = async () => { + const response = await fetch('/mock/appList.json') + return response.json() + } + + const appListRes = await getAppList() + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, appListRes]) + }, 1000) + }) + } + }, + // 页面管理 - 获取页面详情 + { + url: /\/app-center\/api\/pages\/detail/, + response: async (config) => { + const url = config.url + const pageId = url.substr(url.lastIndexOf('/') + 1) + + // 根据pageId加载不同的页面详情 + const pageDetail = async (pageId) => { + const response = await fetch(`/mock/pageDetail/${pageId}.json`) + return response.json() + } + + const pageInfo = await pageDetail(pageId) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, pageInfo]) + }, 1000) + }) + } + }, + // 页面管理 - 获取页面列表 + { + url: /\/app-center\/api\/pages\/list\/\d+/, + response: async () => { + const getPageList = async () => { + const response = await fetch('/mock/pageLists.json') + return response.json() + } + + const pageListRes = await getPageList() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, pageListRes]) + }, 1000) + }) + } + }, + // 页面管理 - 获取文件夹列表列表 + { + url: /\/app-center\/api\/folders\/list/, + response: async () => { + const getPageList = async () => { + const response = await fetch('/mock/pageFolder.json') + return response.json() + } + + const pageListRes = await getPageList() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, pageListRes]) + }, 1000) + }) + } + }, + // 页面管理 -- 新建页面 + { + url: /\/app-center\/api\/pages\/create/, + response: async (config) => { + const createPage = async () => { + const response = await fetch('/mock/createPage.json') + return response.json() + } + + const createPageRes = await createPage() + const data = JSON.parse(config.data) + const pageId = data.app + + if (pageId % 2) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, createPageRes]) + }, 500) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '服务出错' } }]) + }, 500) + }) + } + }, + // 页面管理 -- 保存页面,同时创建页面备份记录 + { + url: /\/app-center\/api\/pages\/update/, + response: async (config) => { + const savePage = async () => { + const response = await fetch('/mock/savePage.json') + return response.json() + } + + const savePageRes = await savePage() + + const url = config.url + const pageId = url.substr(url.lastIndexOf('/') + 1) + + if (pageId === '1') { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, savePageRes]) + }, 1000) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '服务出错' } }]) + }, 500) + }) + } + }, + // 页面管理 -- 复制页面 + /** + * params + * { + * name:'', + * route:'', + * parent:'', + * groupId:'' + * } + * res + * { + * pages:[{},{}], + * pageInfo:{} + * } + **/ + { + url: /\/app-center\/api\/pages\/copy/, + response: async (config) => { + const newPage = JSON.parse(config.data) + + const pageList = async () => { + const response = await fetch('/mock/pageList.json') + + return response.json() + } + + const list = await pageList(newPage) + list.data[0].data.push(newPage) + + const res = { + data: { + pages: list, + newPage: newPage + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, res]) + }, 1000) + }) + } + }, + // 根据页面ID获取页面历史备份列表 + { + url: /\/app-center\/api\/pageHistory\/list/, + response: async (config) => { + /** + * 数据格式 + * [ + * { + * "id": 1, + * "pageId": 1, // 页面ID,根据id获取页面详情 + * "message": "修改文本内容", + * "time": "2022-02-06 18:00:00" + * } + * ] + */ + const pageId = config.url.substr(config.url.lastIndexOf('/') + 1) + + const pageHistory = async (pageId) => { + const response = await fetch(`/mock/pageHistory/${pageId}.json`) + return response.json() + } + + const historyData = await pageHistory(pageId) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, historyData]) + }, 1000) + }) + } + }, + // 删除页面备份记录 + { + url: /\/app-center\/api\/pageHistory\/delete/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 根据页面备份记录还原页面信息 + { + url: /\/app-center\/api\/pageHistory\/restore/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 创建区块分组信息 + { + url: /\/material-center\/api\/block-groups\/create/, + response: (config) => { + const data = JSON.parse(config.data) + const name = data.name + + const id = blockList.length + 1 + const group = { + id, + name, + blocks: [] + } + + blockList.push(group) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: group }]) + }, 500) + }) + } + }, + // 更新分组:修改分组名字/向分组里添加、删除区块 + { + url: /\/material-center\/api\/block-groups\/update/, + response: async (config) => { + const url = config.url + const groupId = url.substr(url.lastIndexOf('/') + 1) + const { name, blocks } = JSON.parse(config.data) + const getAvailable = async (groupId) => { + const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) + return response.json() + } + + const avaliableBlocks = await getAvailable(groupId) + let result = [] + + for (let i = 0; i < blockList.length; i++) { + if (String(blockList[i].id) === groupId) { + if (name) blockList[i].name = name + if (blocks) { + blockList[i].blocks = [] + avaliableBlocks.forEach((item) => { + if (blocks.indexOf(item.id) > -1) { + blockList[i].blocks.push(item) + } + }) + } + result = blockList[i] + + break + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: result }]) + }, 500) + }) + } + }, + // 根据区块分组ID删除区块分组信息 + { + url: /\/material-center\/api\/block-groups\/delete/, + response: async (config) => { + const url = config.url + const groupId = url.substr(url.lastIndexOf('/') + 1) + + const group = blockList.splice( + blockList.findIndex((item) => item.id === groupId), + 1 + ) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: group }]) + }, 500) + }) + } + }, + // 获取区块分组列表 + { + url: /\/material-center\/api\/block-groups/, + response() { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: blockList }]) + }, 500) + }) + } + }, + // 创建区块 + { + url: /\/material-center\/api\/block\/create/, + response: async (config) => { + const data = JSON.parse(config.data) + + // 创建需往数据库里插入信息 + data.id = String(++blockCount) + arrData.push(data) + + const blockId = data.id + if (blockId % 2) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data }]) + }, 2000) // 耗时较长 + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '新建区块失败' } }]) + }, 500) + }) + } + }, + // 发布区块 + { + url: /\/material-center\/api\/block\/deploy/, + /* + 请求参数: + { + block, + deploy_info: "修改button信息" + } + */ + response: async (config) => { + const data = JSON.parse(config.data) + const blockId = data.block?.id + if (blockId % 2) { + const deploy = async () => { + const response = await fetch(`/mock/block/deploy.json`) + return response.json() + } + const deployData = await deploy() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: deployData.data }]) + }, 500) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '发布区块失败' } }]) + }, 500) + }) + } + }, + // 获取发布区块的进度信息 + { + url: /\/material-center\/api\/tasks/, + response: async (config) => { + const url = config.url + const taskId = url.substr(url.lastIndexOf('/') + 1) + const deployProgress = async () => { + const response = await fetch(`/mock/block/deployProgress.json`) + return response.json() + } + const deployProgressRes = await deployProgress() + + // 区块Id不相等直接返回 + if (Number(taskId) !== deployProgressRes.data.id) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '查询区块进度失败' } }]) + }, 500) + }) + } + + const FINISHED_PROGRESS = 100 + const INTERVAL_PROGRESS = 20 + + // 判断发布状态 + const deployStatus = deployProgressRes.data.taskStatus + + // 如果构建状态为运行中:1, 返回构建进度条 + if (deployStatus === 1) { + // 模拟后台进度更新, 每次查询进度更新增加20% + deployProgressRes.data.progress_percent = blockProgress + blockProgress += INTERVAL_PROGRESS + + if (blockProgress >= FINISHED_PROGRESS) { + deployProgressRes.data.progress_percent = FINISHED_PROGRESS + blockProgress = 0 + } + } + + // 其它状态直接返回结果 + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, deployProgressRes]) + }, 1000) + }) + } + }, + // 修改区块,同时创建区块备份记录/还原到某一历史备份 + { + url: /\/material-center\/api\/block\/update/, + response: async (config) => { + const url = config.url + const blockId = url.substr(url.lastIndexOf('/') + 1) + const { current_history } = JSON.parse(config.data) + + // 消费侧-还原到某一历史备份 + if (current_history) { + let block = null + + for (let i = 0; i < blockList.length; i++) { + const blocks = blockList[i].blocks + + for (let i = 0; i < blocks.length; i++) { + block = blocks[i] + + if (String(block.id) === blockId && block.current_history) { + block.current_history.id = current_history + + break + } + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: block }]) + }, 500) + }) + } + + // 只有奇数区块可以保存成功 + if (blockId % 2) { + const block = JSON.parse(config.data) + let blockData = null + + for (let i = 0; i < arrData.length; i++) { + if (Number(arrData[i].id) === Number(blockId)) { + blockData = arrData[i] + + Object.entries(block).forEach(([key, value]) => { + blockData[key] = value + }) + + break + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: blockData }]) + }, 1000) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '保存区块失败' } }]) + }, 500) + }) + } + }, + // 区块管理 -- 获取区块列表 + { + url: /\/material-center\/api\/block\/list/, + proxy: '/mock/block/blockList.json', + handleData({ data }) { + if (arrData.length === 0) { + arrData.push(...data) + blockCount = arrData.length + } + + return { data: arrData } + } + }, + // 区块管理 -- 删除区块 + { + url: /\/material-center\/api\/block\/delete/, + response(config) { + const url = config.url + const blockId = url.substr(url.lastIndexOf('/') + 1) + let data = [] + + // 只有 ID 为奇数的区块才能删除,否则抛出错误信息 + if (blockId % 2) { + arrData.some((item, index) => { + if (String(item.id) === blockId) { + data = item + arrData.splice(index, 1) + return true + } + return false + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data }]) + }, 500) // 耗时较短 + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '删除区块失败' } }]) + }, 500) // 耗时较短 + }) + } + }, + // 根据区块ID获取区块历史备份列表 + { + url: /\/material-center\/api\/block-history/, + response: async (config) => { + const url = config.url + const query = url.substr(url.indexOf('?')) + const params = new URLSearchParams(query) + const block = params.get('block') + + if (!block) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: [] }]) + }, 1000) + }) + } + + const historyList = async () => { + const response = await fetch(`/mock/block/history.json`) + return response.json() + } + + const blockInfo = await historyList(block) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: blockInfo }]) + }, 1000) + }) + } + }, + // 删除区块备份记录 + { + url: /\/app-center\/api\/blockHistory\/delete/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 根据区块备份记录还原区块信息 + { + url: /\/app-center\/api\/blockHistory\/restore/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 根据分组ID获取当前分组可以添加的区块 + { + url: /\/material-center\/api\/block\/notgroup/, + response: async (config) => { + const url = config.url + const groupId = + url.indexOf('?') > -1 + ? url.substring(url.lastIndexOf('/') + 1, url.indexOf('?')) + : url.substr(url.lastIndexOf('/') + 1) + const query = url.substr(url.indexOf('?')) + const params = new URLSearchParams(query) + const value = params.get('label_contains') + const author = params.getAll('author') + const tenant = params.getAll('tenant') + const tag = params.getAll('tag') + + if (!groupId) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: [] }]) + }, 500) + }) + } + + const getAvailable = async (groupId) => { + const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) + return response.json() + } + + const blocks = await getAvailable(groupId) + + // 搜索结果 + const searchResult = value ? blocks.filter((item) => item.label.indexOf(value) > -1) : blocks + // 标签过滤结果 + const tagResult = + tag && tag.length ? searchResult.filter((item) => item.tags?.some((i) => tag.includes(i))) : searchResult + // 组织过滤结果 + const tenantResult = + tenant && tenant.length ? tagResult.filter((item) => tenant.includes(String(item.tenant?.id))) : tagResult + // 作者过滤结果 + const authorResult = + author && author.length ? tenantResult.filter((item) => author.includes(String(item.author?.id))) : tenantResult + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: authorResult }]) + }, 500) + }) + } + }, + // 获取区块所有标签 + { + url: /\/material-center\/api\/block\/tags/, + response: async () => { + const getAvailable = async () => { + const response = await fetch(`/mock/block/available/1.json`) + return response.json() + } + + const blocks = await getAvailable() + const tags = [] + + blocks && + blocks.forEach((block) => { + block.tags && tags.push(...block.tags) + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: Array.from(new Set(tags)) }]) + }, 500) + }) + } + }, + // 获取区块所有作者 + { + url: /\/material-center\/api\/block\/users/, + response: async () => { + const getAvailable = async () => { + const response = await fetch(`/mock/block/available/1.json`) + return response.json() + } + + const blocks = await getAvailable() + const users = [] + + blocks && + blocks.forEach((block) => { + users.push(block.author) + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: users }]) + }, 500) + }) + } + }, + // 获取区块所有组织 + { + url: /\/material-center\/api\/block\/tenants/, + response: async () => { + const getAvailable = async () => { + const response = await fetch(`/mock/block/available/1.json`) + return response.json() + } + + const blocks = await getAvailable() + const tenants = [] + + blocks && + blocks.forEach((block) => { + block.tenant && tenants.push(block.tenant) + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tenants }]) + }, 500) + }) + } + }, + // 根据区块分组ID获取该分组下的区块列表 + { + url: /\/material-center\/api\/block/, + response(config) { + const url = config.url + const query = url.substr(url.indexOf('?')) + const params = new URLSearchParams(query) + const groupId = params.get('groups') + const value = params.get('label_contains') + let groupData = [] + + for (let i = 0; i < blockList.length; i++) { + if (String(blockList[i].id) === groupId) { + groupData = blockList[i].blocks + + break + } + } + + groupData = value ? groupData.filter((item) => item.label.indexOf(value) > -1) : groupData + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: groupData }]) + }, 500) + }) + } + }, + // 数据源管理 -- 获取数据源列表 + { + url: /api\/sources\/list/, + response: async () => { + const getDatasourceList = async () => { + const response = await fetch('/mock/datasource.json') + return response.json() + } + + let { data } = await getDatasourceList() + const index = data.findIndex((data) => data.id === tempObj?.id) + + if (index > -1) { + data[index] = tempObj + + if (tempObj.status === 'delete') { + data.splice(index, 1) + } + } else { + if (tempObj) { + tempObj.id = data.length + 1 + data = [...data, tempObj] + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: data }]) + }, 1000) + }) + } + }, + // 数据源管理 -- 新增数据源 + { + url: /\/app-center\/api\/sources\/create/, + response: async (config) => { + tempObj = JSON.parse(config.data) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tempObj }]) + }, 1000) + }) + } + }, + // 数据源管理 -- 删除数据源 + { + url: /\/app-center\/api\/sources\/delete/, + response: async (config) => { + const url = config.url + const dataSourceId = url.substr(url.lastIndexOf('/') + 1) + tempObj = { id: dataSourceId, status: 'delete' } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tempObj }]) + }, 500) + }) + } + }, + // 数据源管理 -- 更新数据源 + { + url: /\/app-center\/api\/sources\/update/, + response: async (config) => { + const addres = config.url.split('/') + const id = Number(addres[addres.length - 1]) + + // 提交需要更新的内容 + tempObj = JSON.parse(config.data) + tempObj.id = id + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tempObj }]) + }, 500) + }) + } + }, + // 数据源管理 -- 查询数据源详情 + { + url: /api\/sources\/detail/, + response: async (config) => { + const addres = config.url.split('/') + const id = addres[addres.length - 1] + + const getDataSourceDetail = async () => { + const response = await fetch('/mock/datasource.json') + return response.json() + } + + const { data } = await getDataSourceDetail() + let result = data.filter((item) => item.id === id)[0] + + if (tempObj && tempObj.id === id) { + result = tempObj + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: result }]) + }, 500) + }) + } + }, + // 数据源管理 -- 获取数据源模板列表 + { + url: /\/app-center\/api\/source_tpl/, + response: async () => { + const getDataSourceTemplate = async () => { + const response = await fetch('/mock/dataSourceTemplate.json') + return response.json() + } + const templateData = await getDataSourceTemplate() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, templateData]) + }, 500) + }) + } + }, + // 数据源管理 -- mock 用户输入的远程服务 + { + url: /\.*api.*\/mock/, + response: async () => { + const getDataSourceTemplate = async () => { + const response = await fetch('/mock/userService.json') + return response.json() + } + const templateData = await getDataSourceTemplate() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, templateData]) + }, 500) + }) + } + }, + { + url: /ng-bundle\.json$/, + proxy: 'mock/ng-bundle.json' + }, + { + url: '*', + proxy: '*' + } +] diff --git a/dl-flow-frontend/packages/http/vite.config.js b/dl-flow-frontend/packages/http/vite.config.js new file mode 100644 index 0000000..6b29354 --- /dev/null +++ b/dl-flow-frontend/packages/http/vite.config.js @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + cssCodeSplit: false, + lib: { + entry: path.resolve(__dirname, './src/index.js'), + name: 'http', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/i18n/README.md b/dl-flow-frontend/packages/i18n/README.md new file mode 100644 index 0000000..4f6b9df --- /dev/null +++ b/dl-flow-frontend/packages/i18n/README.md @@ -0,0 +1,2 @@ +# lowcode-webcomponent + diff --git a/dl-flow-frontend/packages/i18n/index.html b/dl-flow-frontend/packages/i18n/index.html new file mode 100644 index 0000000..7ea1dea --- /dev/null +++ b/dl-flow-frontend/packages/i18n/index.html @@ -0,0 +1,13 @@ + + + + + + Tiny Vue WebComponent + + + +
+ + + diff --git a/dl-flow-frontend/packages/i18n/package.json b/dl-flow-frontend/packages/i18n/package.json new file mode 100644 index 0000000..6500134 --- /dev/null +++ b/dl-flow-frontend/packages/i18n/package.json @@ -0,0 +1,48 @@ +{ + "name": "@opentiny/tiny-engine-i18n-host", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "description": "webcomponent vue i18n host", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext .js,.vue --fix", + "format": "prettier --write **/*{.vue,.js,.ts,.html,.json}", + "publish:npm": "npm run build && npm publish --verbose" + }, + "files": [ + "dist" + ], + "main": "dist/lowcode-design-i18n-host.umd.js", + "module": "dist/lowcode-design-i18n-host.es.js", + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/i18n" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-webcomponent-core": "workspace:*", + "vue": "^3.2.1", + "vue-i18n": "^9.2.0-beta.32" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^2.2.0", + "babel-eslint": "^10.1.0", + "eslint": "^7.32.0", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-vue": "^7.17.0", + "prettier": "^2.4.0", + "vite": "^2.9.1" + } +} diff --git a/dl-flow-frontend/packages/i18n/src/App.vue b/dl-flow-frontend/packages/i18n/src/App.vue new file mode 100644 index 0000000..c794863 --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/App.vue @@ -0,0 +1,44 @@ + + + diff --git a/dl-flow-frontend/packages/i18n/src/I18nHost.vue b/dl-flow-frontend/packages/i18n/src/I18nHost.vue new file mode 100644 index 0000000..7d1544e --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/I18nHost.vue @@ -0,0 +1,45 @@ + + + diff --git a/dl-flow-frontend/packages/i18n/src/i18n.js b/dl-flow-frontend/packages/i18n/src/i18n.js new file mode 100644 index 0000000..8c72e7e --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/i18n.js @@ -0,0 +1,28 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { createI18n } from 'vue-i18n' + +// 这里需要展开才能再下面进行合并操作,要不然会报错 +const i18n = { + ...createI18n({ + locale: 'zh_CN', + messages: {}, + legacy: false + }) +} + +export const defineCustomI18n = (customI18n) => { + Object.assign(i18n, customI18n) +} + +export default i18n diff --git a/dl-flow-frontend/packages/i18n/src/lib.js b/dl-flow-frontend/packages/i18n/src/lib.js new file mode 100644 index 0000000..3474225 --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/lib.js @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineCustomElement } from '@opentiny/tiny-engine-webcomponent-core' +import I18nHost from './I18nHost.vue' +import i18n, { defineCustomI18n } from './i18n' + +const name = 'tiny-i18n-host' + +if (!customElements.get(name)) { + customElements.define(name, defineCustomElement(I18nHost)) +} + +export { defineCustomI18n } + +export default i18n diff --git a/dl-flow-frontend/packages/i18n/src/main.js b/dl-flow-frontend/packages/i18n/src/main.js new file mode 100644 index 0000000..afcf8cd --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/main.js @@ -0,0 +1,21 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { createApp } from 'vue' +import App from './App.vue' +import i18n from './lib' + +i18n.global.mergeLocaleMessage('en_US', { hello: 'Hello!' }) +i18n.global.mergeLocaleMessage('zh_CN', { hello: '你好!' }) + +// use(i18n) 可以让 app 内的 vue 组件使用 useI18n +createApp(App).use(i18n).mount('#app') diff --git a/dl-flow-frontend/packages/i18n/src/test/TestVueInject.vue b/dl-flow-frontend/packages/i18n/src/test/TestVueInject.vue new file mode 100644 index 0000000..c07f8f7 --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/test/TestVueInject.vue @@ -0,0 +1,20 @@ + + + diff --git a/dl-flow-frontend/packages/i18n/src/test/TestVueUse.vue b/dl-flow-frontend/packages/i18n/src/test/TestVueUse.vue new file mode 100644 index 0000000..335467c --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/test/TestVueUse.vue @@ -0,0 +1,17 @@ + + + diff --git a/dl-flow-frontend/packages/i18n/src/test/TestWebcomponent.vue b/dl-flow-frontend/packages/i18n/src/test/TestWebcomponent.vue new file mode 100644 index 0000000..e5575c9 --- /dev/null +++ b/dl-flow-frontend/packages/i18n/src/test/TestWebcomponent.vue @@ -0,0 +1,20 @@ + + + diff --git a/dl-flow-frontend/packages/i18n/vite.config.js b/dl-flow-frontend/packages/i18n/vite.config.js new file mode 100644 index 0000000..ad86963 --- /dev/null +++ b/dl-flow-frontend/packages/i18n/vite.config.js @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import vue from '@vitejs/plugin-vue' +import path from 'path' + +export default { + plugins: [ + vue({ + template: { + compilerOptions: { + // 将所有包含短横线的标签作为自定义元素处理 + isCustomElement: (tag) => tag.includes('-') + } + } + }) + ], + build: { + minify: false, + emptyOutDir: false, + lib: { + entry: path.resolve(__dirname, './src/lib.js'), + name: 'LowcodeDesignI18nHost', + formats: ['es', 'umd'], + fileName: (format) => `lowcode-design-i18n-host.${format}.js` + }, + commonjsOptions: { + transformMixedEsModules: true + }, + rollupOptions: { + // 确保外部化处理那些你不想打包进库的依赖 + external: ['vue', 'vue-i18n', '@opentiny/tiny-engine-webcomponent-core'], + output: { + // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 + globals: { + vue: 'Vue', + 'vue-i18n': 'VueI18n', + '@opentiny/tiny-engine-webcomponent-core': 'LowcodeDesignWebcomponentCore' + } + } + } + } +} diff --git a/dl-flow-frontend/packages/plugins/materials/assets/test.png b/dl-flow-frontend/packages/plugins/materials/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/plugins/materials/index.js b/dl-flow-frontend/packages/plugins/materials/index.js new file mode 100644 index 0000000..93659ab --- /dev/null +++ b/dl-flow-frontend/packages/plugins/materials/index.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import component, { api } from './src/Main.vue' + +export default { + id: 'Materials', + title: '物料', + icon: 'plugin-icon-materials', + align: 'top', + component, + api +} + +export { component } diff --git a/dl-flow-frontend/packages/plugins/materials/mock/test.js b/dl-flow-frontend/packages/plugins/materials/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/plugins/materials/package.json b/dl-flow-frontend/packages/plugins/materials/package.json new file mode 100644 index 0000000..37588db --- /dev/null +++ b/dl-flow-frontend/packages/plugins/materials/package.json @@ -0,0 +1,40 @@ +{ + "name": "@opentiny/tiny-engine-plugin-materials", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/plugins/materials" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:^", + "@opentiny/vue": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/plugins/materials/src/Main.vue b/dl-flow-frontend/packages/plugins/materials/src/Main.vue new file mode 100644 index 0000000..1e2cc0e --- /dev/null +++ b/dl-flow-frontend/packages/plugins/materials/src/Main.vue @@ -0,0 +1,74 @@ + + + + + + + diff --git a/dl-flow-frontend/packages/plugins/materials/src/layer/main.vue b/dl-flow-frontend/packages/plugins/materials/src/layer/main.vue new file mode 100644 index 0000000..28dbae3 --- /dev/null +++ b/dl-flow-frontend/packages/plugins/materials/src/layer/main.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/dl-flow-frontend/packages/plugins/materials/src/networks/main.vue b/dl-flow-frontend/packages/plugins/materials/src/networks/main.vue new file mode 100644 index 0000000..96e5481 --- /dev/null +++ b/dl-flow-frontend/packages/plugins/materials/src/networks/main.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/dl-flow-frontend/packages/plugins/materials/test/test.js b/dl-flow-frontend/packages/plugins/materials/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/plugins/materials/vite.config.js b/dl-flow-frontend/packages/plugins/materials/vite.config.js new file mode 100644 index 0000000..6df3a05 --- /dev/null +++ b/dl-flow-frontend/packages/plugins/materials/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + resolve: {}, + publicDir: false, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'plugin-materials', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/plugins/schema/assets/test.png b/dl-flow-frontend/packages/plugins/schema/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/plugins/schema/index.js b/dl-flow-frontend/packages/plugins/schema/index.js new file mode 100644 index 0000000..63b1189 --- /dev/null +++ b/dl-flow-frontend/packages/plugins/schema/index.js @@ -0,0 +1,21 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import component from './src/Main.vue' + +export default { + id: 'Schema', + title: '页面 Schema', + icon: 'plugin-icon-page-schema', + align: 'bottom', + component +} diff --git a/dl-flow-frontend/packages/plugins/schema/mock/test.js b/dl-flow-frontend/packages/plugins/schema/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/plugins/schema/package.json b/dl-flow-frontend/packages/plugins/schema/package.json new file mode 100644 index 0000000..0658e3f --- /dev/null +++ b/dl-flow-frontend/packages/plugins/schema/package.json @@ -0,0 +1,39 @@ +{ + "name": "@opentiny/tiny-engine-plugin-schema", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/plugins/schema" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/vue": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/plugins/schema/src/Main.vue b/dl-flow-frontend/packages/plugins/schema/src/Main.vue new file mode 100644 index 0000000..f9c09bb --- /dev/null +++ b/dl-flow-frontend/packages/plugins/schema/src/Main.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/plugins/schema/test/test.js b/dl-flow-frontend/packages/plugins/schema/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/plugins/schema/vite.config.js b/dl-flow-frontend/packages/plugins/schema/vite.config.js new file mode 100644 index 0000000..0205767 --- /dev/null +++ b/dl-flow-frontend/packages/plugins/schema/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'plugin-schema', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/settings/code/index.js b/dl-flow-frontend/packages/settings/code/index.js new file mode 100644 index 0000000..9b1330f --- /dev/null +++ b/dl-flow-frontend/packages/settings/code/index.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import component from './src/Main.vue' + +export default { + id: 'LayerCode', + name: 'Code', + title: '代码', + icon: '', + align: 'left', + component +} diff --git a/dl-flow-frontend/packages/settings/code/package.json b/dl-flow-frontend/packages/settings/code/package.json new file mode 100644 index 0000000..e6c0b27 --- /dev/null +++ b/dl-flow-frontend/packages/settings/code/package.json @@ -0,0 +1,18 @@ +{ + "name": "dl-flow-setting-code", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:^", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/settings/code/src/Main.vue b/dl-flow-frontend/packages/settings/code/src/Main.vue new file mode 100644 index 0000000..96e9ada --- /dev/null +++ b/dl-flow-frontend/packages/settings/code/src/Main.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/dl-flow-frontend/packages/settings/code/vite.config.js b/dl-flow-frontend/packages/settings/code/vite.config.js new file mode 100644 index 0000000..afad9f8 --- /dev/null +++ b/dl-flow-frontend/packages/settings/code/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'setting-code', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/settings/props/index.js b/dl-flow-frontend/packages/settings/props/index.js new file mode 100644 index 0000000..ffc6441 --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/index.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import component from './src/Main.vue' + +export default { + id: 'SettingProps', + name: 'props', + title: '属性', + icon: '', + align: 'left', + component +} diff --git a/dl-flow-frontend/packages/settings/props/package.json b/dl-flow-frontend/packages/settings/props/package.json new file mode 100644 index 0000000..6aadb59 --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/package.json @@ -0,0 +1,41 @@ +{ + "name": "@opentiny/tiny-engine-setting-props", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/settings/props" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:^", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "@vueuse/core": "^9.6.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/settings/props/src/Main.vue b/dl-flow-frontend/packages/settings/props/src/Main.vue new file mode 100644 index 0000000..3a48f6d --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/src/Main.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/dl-flow-frontend/packages/settings/props/src/components/Empty.vue b/dl-flow-frontend/packages/settings/props/src/components/Empty.vue new file mode 100644 index 0000000..fe97987 --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/src/components/Empty.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/dl-flow-frontend/packages/settings/props/src/components/ParamAttr.vue b/dl-flow-frontend/packages/settings/props/src/components/ParamAttr.vue new file mode 100644 index 0000000..43f6516 --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/src/components/ParamAttr.vue @@ -0,0 +1,35 @@ + + + diff --git a/dl-flow-frontend/packages/settings/props/src/components/enums.vue b/dl-flow-frontend/packages/settings/props/src/components/enums.vue new file mode 100644 index 0000000..5d70379 --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/src/components/enums.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/settings/props/src/components/list.vue b/dl-flow-frontend/packages/settings/props/src/components/list.vue new file mode 100644 index 0000000..4486ded --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/src/components/list.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/settings/props/src/components/property-setting.vue b/dl-flow-frontend/packages/settings/props/src/components/property-setting.vue new file mode 100644 index 0000000..de482bf --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/src/components/property-setting.vue @@ -0,0 +1,83 @@ + + + + diff --git a/dl-flow-frontend/packages/settings/props/vite.config.js b/dl-flow-frontend/packages/settings/props/vite.config.js new file mode 100644 index 0000000..45e96db --- /dev/null +++ b/dl-flow-frontend/packages/settings/props/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'setting-props', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/svgs/index.js b/dl-flow-frontend/packages/svgs/index.js new file mode 100644 index 0000000..3e2f262 --- /dev/null +++ b/dl-flow-frontend/packages/svgs/index.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import SvgIcon from './src/Main.vue' + +export default (app) => { + app.component('SvgIcon', SvgIcon) +} diff --git a/dl-flow-frontend/packages/svgs/mock/test.js b/dl-flow-frontend/packages/svgs/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/svgs/package.json b/dl-flow-frontend/packages/svgs/package.json new file mode 100644 index 0000000..804537f --- /dev/null +++ b/dl-flow-frontend/packages/svgs/package.json @@ -0,0 +1,36 @@ +{ + "name": "@opentiny/tiny-engine-svgs", + "version": "1.0.3", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/svgs" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/svgs/src/Main.vue b/dl-flow-frontend/packages/svgs/src/Main.vue new file mode 100644 index 0000000..e13a264 --- /dev/null +++ b/dl-flow-frontend/packages/svgs/src/Main.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/dl-flow-frontend/packages/svgs/test/test.js b/dl-flow-frontend/packages/svgs/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/svgs/vite.config.js b/dl-flow-frontend/packages/svgs/vite.config.js new file mode 100644 index 0000000..1e52df3 --- /dev/null +++ b/dl-flow-frontend/packages/svgs/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'svgs', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/theme/common/base.less b/dl-flow-frontend/packages/theme/common/base.less new file mode 100644 index 0000000..015271f --- /dev/null +++ b/dl-flow-frontend/packages/theme/common/base.less @@ -0,0 +1,74 @@ +html { + font-size: 14px; +} + +body { + padding: 0; + margin: 0; + font-family: Microsoft YaHei, Microsoft YaHei-Normal; +} + +body { + --base-left-panel-width: 280px; + --base-right-panel-width: 280px; + --base-top-panel-height: 48px; + --base-bottom-panel-height: 30px; + --base-nav-panel-width: 40px; + --base-collection-panel-width: calc( + (100vw - (var(--base-left-panel-width) + var(--base-right-panel-width) + var(--base-nav-panel-width) - 1px)) / 2 + ); + --base-collection-panel-full-screen-width: calc( + (100vw - (var(--base-left-panel-width) + var(--base-right-panel-width) + var(--base-nav-panel-width) - 1px)) + ); + -webkit-font-smoothing: subpixel-antialiased; + background: #f9f9f9; +} + +ol, +ul { + list-style: none; +} + +a { + cursor: pointer; + background-image: none; + text-decoration: none; + outline: none; + + &:focus, + &:active, + &:hover { + outline: none; + text-decoration: none; + } +} + +dl, +dt, +dd, +ul, +ol, +li, +th, +td { + margin: 0; + padding: 0; +} + +#tiny-engine * { + box-sizing: border-box; +} + +.tiny-svg, +#tiny-engine .tiny-svg { + fill: currentColor !important; + outline: none; +} + +.text-ellipsis-multiple { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: var(--ellipsis-line, 2); + -webkit-box-orient: vertical; +} diff --git a/dl-flow-frontend/packages/theme/common/global.less b/dl-flow-frontend/packages/theme/common/global.less new file mode 100644 index 0000000..3955aef --- /dev/null +++ b/dl-flow-frontend/packages/theme/common/global.less @@ -0,0 +1,1975 @@ +:root { + --ti-lowcode-property-active-color: #4f77ff; // 属性被激活的颜色 + --ti-lowcode-property-hover-color: #4f77ff; // 属性被hover的颜色 + --ti-lowcode-block-video-tip-color: rgb(80, 212, 171); // 区块播放视频提示颜色 +} + +// tiny-vue popover 弹框样式 +.tiny-popover.tiny-popper { + color: var(--ti-lowcode-popover-color); + background: var(--ti-lowcode-popover-bg-color); + border: none; + padding: 6px; + border-radius: 6px; + line-height: 16px; + box-shadow: rgb(0 0 0 / 15%) 0 5px 10px; + + &[x-placement^='bottom'] { + .popper__arrow { + top: -6px; + + &, + &::after { + border-bottom-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &[x-placement^='right'] { + margin-left: 16px; + + .popper__arrow { + left: -7px; + border-color: transparent; + + &::after { + border-right-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &[x-placement^='top'] { + .popper__arrow { + &, + &::after { + border-top-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + right: -7px; + + &, + &::after { + border-left-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &.data-source-popper { + background: var(--ti-lowcode-tabs-bg); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + border: 1px solid var(--ti-lowcode-tabs-border-color); + padding: 6px 0; + border-radius: 4px; + + &[x-placement^='bottom'] { + .popper__arrow { + &, + &::after { + border-bottom-color: var(--ti-lowcode-tabs-bg); + } + } + } + + &[x-placement^='right'] { + margin-left: 16px; + + .popper__arrow { + left: -7px; + border-color: transparent; + + &::after { + border-right-color: var(--ti-lowcode-tabs-bg); + } + } + } + + &[x-placement^='top'] { + .popper__arrow { + bottom: -7px; + + &, + &::after { + border-top-color: var(--ti-lowcode-tabs-bg); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + right: -7px; + + &, + &::after { + border-left-color: var(--ti-lowcode-tabs-bg); + } + } + } + + &.data-remote-popper { + background: var(--ti-lowcode-toolbar-view-hover-bg); + border-color: var(--ti-lowcode-toolbar-border-color); + + &[x-placement^='bottom'] { + .popper__arrow { + &, + &::after { + border-bottom-color: var(--ti-lowcode-toolbar-view-hover-bg); + } + } + } + + &[x-placement^='right'] { + margin-left: 16px; + + .popper__arrow { + left: -7px; + border-color: transparent; + + &::after { + border-right-color: var(--ti-lowcode-toolbar-view-hover-bg); + } + } + } + + &[x-placement^='top'] { + .popper__arrow { + bottom: -7px; + + &, + &::after { + border-top-color: var(--ti-lowcode-toolbar-view-hover-bg); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + right: -7px; + + &, + &::after { + border-left-color: var(--ti-lowcode-toolbar-view-hover-bg); + } + } + } + + li { + padding: 4px 10px; + font-size: 12px; + + &:hover { + background: var(--ti-lowcode-canvas-wrap-bg); + cursor: pointer; + } + } + } + + li { + cursor: pointer; + color: var(--ti-lowcode-toolbar-breadcrumb-color); + padding: 4px 8px; + transition: 0.3s; + + &:hover { + color: var(--ti-lowcode-tootip-input-color); + background: var(--ti-lowcode-toolbar-active-bg); + } + } + } + + &.lowcode { + background: var(--ti-lowcode-custom-popover-bg-color); + border: 1px solid var(--ti-lowcode-custom-popover-border-color); + color: var(--ti-lowcode-custom-popover-text-color); + + .popper__arrow, + .popper__arrow::after { + border-bottom-color: var(--ti-lowcode-custom-popover-bg-color); + } + + .languageContent { + width: 100%; + } + } + + &.option-popper { + background: var(--ti-lowcode-popover-bg-color); + border: 1px solid var(--ti-lowcode-popover-option-popper-border-color); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + &[x-placement^='bottom'] { + .popper__arrow { + &, + &::after { + border-bottom-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &[x-placement^='right'] { + margin-left: 16px; + + .popper__arrow { + left: -7px; + border-color: transparent; + + &::after { + border-right-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &[x-placement^='top'] { + .popper__arrow { + &, + &::after { + border-top-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + right: -7px; + + &, + &::after { + border-left-color: var(--ti-lowcode-popover-bg-color); + } + } + } + + .add-options { + &.top { + border-bottom: 1px solid var(--ti-lowcode-tabs-border-color); + margin-bottom: 15px; + overflow: hidden; + display: flex; + height: 26px; + justify-content: space-between; + align-items: center; + padding: 6px; + + .title { + font-weight: 600; + } + + .icon-close { + margin-bottom: 4px; + margin-right: 0px; + } + } + + .demo-form { + padding: 6px; + + .tiny-form-item { + margin-bottom: 4px; + + :deep(.tiny-form-item__label) { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + + :deep(.tiny-input__inner) { + color: var(--ti-lowcode-tootip-input-color); + background: var(--ti-lowcode-tootip-input-background-color); + border-color: var(--ti-lowcode-tootip-input-border-color); + + &:focus { + border-color: var(--ti-lowcode-canvas-handle-hover-bg); + } + } + } + + :deep(.btn) { + .tiny-form-item__content { + display: flex; + + .tiny-button { + min-width: auto; + flex: 1; + } + } + } + } + + .tiny-svg { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + font-size: 14px; + + &.icon-close { + margin: 10px; + } + + &:hover { + cursor: pointer; + } + + &.header-icon { + margin-right: 0; + } + + &.isBind { + color: var(--ti-lowcode-icon-bind-color); + } + } + } + } + + &.option-popper { + padding: 2px 0; + min-width: 6%; + width: auto; + + .list { + li { + text-align: center; + + &:hover { + background: var(--ti-lowcode-canvas-wrap-bg); + } + } + } + + &.collaborator { + padding: 0; + } + + &.fixed-left { + top: 24px !important; + transform: translateX(calc(4px - var(--base-right-panel-width))); + height: calc(100% - 36px); + } + } + + &.media-icon-popover { + color: var(--ti-lowcode-media-popover-color); + font-size: 12px; + font-weight: 400; + padding: 20px; + + &[x-placement^='bottom'] { + margin-top: 16px; + } + + .tiny-popover__title { + color: var(--ti-lowcode-media-popover-title-color); + font-size: 14px; + line-height: 18px; + font-weight: 600; + margin-bottom: 0; + } + + .media-title { + color: var(--ti-lowcode-media-popover-title-color); + display: flex; + align-items: center; + font-size: 14px; + .sub-title { + color: var(--ti-lowcode-media-popover-color); + } + .icon-stars { + font-size: 16px; + margin-right: 4px; + } + } + + .content { + margin-top: 6px; + } + } + + &.toolbar-right-popover { + color: var(--ti-lowcode-toolbar-hover-popper); + font-size: 14px; + padding: 10px 16px; + border-radius: 6px; + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, + 'Helvetica Neue', Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif; + &[x-placement^='bottom'] { + margin-top: 8px; + } + + &.collaboration-popover[x-placement^='bottom'] { + margin-top: 14px; + } + &.collaborator { + padding: 10px 0; + } + } + + &.block-add-transfer-popover { + background: var(--ti-lowcode-toolbar-bg); + border: 1px solid var(--ti-lowcode-tabs-border-color); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + padding: 0; + + .popper__arrow { + display: none; + } + + &[x-placement^='top'] { + margin-bottom: 0; + } + + .sort-item { + padding: 6px 10px 6px 24px; + transition: 0.3s; + position: relative; + + &:hover { + background: var(--ti-lowcode-button-hover-bg); + } + + &.selected { + &::before { + content: '\2714'; + display: block; + position: absolute; + left: 10px; + } + } + } + } + + &.data-remote-popper { + width: 12%; + } + + &.toolbar-media-popper { + padding: 0; + font-size: 12px; + border-color: var(--ti-lowcode-tabs-border-color); + + &[x-placement^='bottom'] { + margin-top: 6px; + } + + &[x-placement^='right'] { + .popper__arrow { + border-color: transparent; + + &::after { + border-right-color: var(--ti-lowcode-toolbar-media-bg); + } + } + } + + &[x-placement^='top'] { + .popper__arrow { + &, + &::after { + border-top-color: var(--ti-lowcode-toolbar-media-bg); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + &, + &::after { + border-left-color: var(--ti-lowcode-toolbar-media-bg); + } + } + } + + .content-wrap { + padding: 20px; + .title { + width: 100%; + color: var(--ti-lowcode-media-popover-title-color); + background: var(--ti-lowcode-tabs-active-bg); + display: inline-block; + box-sizing: border-box; + font-size: 14px; + &.text-title { + background: transparent; + } + } + + .list { + border-bottom: 1px solid var(--ti-lowcode-tabs-border-color); + + li { + padding: 4px 8px; + transition: 0.3s; + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + .tiny-svg { + margin-right: 6px; + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + + &:hover { + background: var(--ti-lowcode-canvas-wrap-bg); + } + } + } + + .more-setting { + li { + display: flex; + align-items: center; + gap: 8px; + color: var(--ti-lowcode-toolbar-sub-title-color); + padding-top: 12px; + } + } + + .tips { + padding: 8px; + + span { + display: inline-block; + padding: 4px 8px; + color: var(--ti-lowcode-dialog-font-color); + background: var(--ti-lowcode-canvas-wrap-bg); + border-left: 2px solid var(--ti-lowcode-dialog-tip-border-color); + } + } + + .setting { + display: flex; + align-items: center; + color: var(--ti-lowcode-toolbar-sub-title-color); + padding-top: 12px; + & > div { + display: flex; + align-items: center; + + & + div { + margin-left: 12px; + } + + label { + flex-shrink: 0; + margin-right: 8px; + } + } + + & > span { + width: 24px; + height: 24px; + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + margin-left: 12px; + border-radius: 2px; + transition: 0.3s; + + &:hover { + background: var(--ti-lowcode-icon-hover-bg); + cursor: pointer; + } + + .icon-canvas-fit { + font-size: 16px; + color: var(--ti-lowcode-description-minor-color); + } + } + + .tiny-input__suffix { + right: 4px; + + .tiny-input__suffix-inner { + font-size: 12px; + color: var(--ti-lowcode-description-minor-color); + } + } + + .tiny-input-suffix .tiny-input__inner { + padding-right: 20px; + padding-left: 4px; + + &[readonly] { + cursor: not-allowed; + + &:focus { + border-color: var(--ti-lowcode-tabs-border-color); + } + } + } + } + } + } + + &.tiny-pager__selector { + background-color: var(--ti-lowcode-common-hover-bg-1); + + .tiny-pager__selector-poplist { + background: var(--ti-lowcode-toolbar-view-hover-bg); + border: 1px solid var(--ti-lowcode-toolbar-border-color); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + .list-item { + &.select-pre.is-selected { + background: var(--ti-lowcode-canvas-wrap-bg); + } + + &:hover { + color: var(--ti-lowcode-dialog-font-color); + background-color: var(--ti-lowcode-canvas-wrap-bg); + } + } + } + } + + &.fit-popper { + .fit-content { + display: grid; + gap: 8px 4px; + grid-template-columns: 48px 1fr; + padding: 8px; + align-items: center; + } + + .fit-content-label { + color: var(--ti-lowcode-fit-label-color); + padding: 2px; + } + + .fit-content-main { + place-items: start center; + height: 64px; + display: grid; + gap: 4px 8px; + grid-template-columns: auto auto; + grid-template-rows: 1fr 3fr; + } + + .coordinate { + grid-column-start: 1; + grid-row: 1 / span 3; + width: 64px; + height: 64px; + background: var(--ti-lowcode-fit-coordinate-bg); + display: inline-grid; + overflow: hidden; + justify-items: center; + border-width: 1px; + box-sizing: border-box; + border-style: solid; + border-color: var(--ti-lowcode-fit-coordinate-border-color); + border-radius: 2px; + gap: 0px; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr 1fr; + } + + .coordinate-origin { + background-color: var(--ti-lowcode-fit-coordinate-bg); + transition: color 0.1s ease 0s; + color: var(--ti-lowcode-fit-coordinate-origin-color); + font-size: 19px; + + &:hover, + &.selected { + color: var(--ti-lowcode-fit-label-color); + } + } + + .input-wrap { + grid-column-end: span 1; + grid-row-start: 2; + align-items: center; + box-sizing: border-box; + display: grid; + gap: 4px 8px; + grid-template-columns: auto auto; + + .left-input { + grid-column-start: 1; + } + + .top-input { + grid-column-start: 2; + } + + .left { + color: var(--ti-lowcode-fit-label-color); + justify-self: center; + grid-column-start: 1; + } + + .top { + color: var(--ti-lowcode-fit-label-color); + justify-self: center; + grid-column-start: 2; + } + + .tiny-input__inner { + padding: 0 20px 0 4px; + } + + .tiny-input__suffix { + right: 4px; + } + } + } + + &.grid-edit-popper { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + .grid-edit-spacing { + display: grid; + gap: 8px 4px; + grid-template-columns: 44px 1fr 24px 1fr; + align-items: center; + padding: 8px; + + .gap, + .direction { + grid-column: 1 / -1; + display: grid; + gap: 4px; + grid-template-columns: 48px 1fr; + } + + .direction { + align-items: center; + + .radio-button { + width: 50%; + } + } + + .gap-label { + display: inline-block; + height: 28px; + line-height: 28px; + } + + .gap-input { + display: grid; + gap: 4px; + grid-template-columns: 1fr 24px 1fr; + + .svg-icon { + place-self: center; + grid-area: 1 / 2 / auto / auto; + font-family: inherit; + font-size: inherit; + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: 24px; + font-size: 18px; + } + + .col { + place-self: center; + } + + .row { + place-self: center; + grid-column: 3 / -1; + } + + .suffix { + min-width: 18px; + } + } + + .dense { + grid-column: 2 / -1; + display: flex; + align-items: center; + + input[type='checkbox'] { + accent-color: var(--ti-lowcode-tootip-arrow-border-color); + } + + label { + margin-right: 4px; + } + } + } + + .grid-edit-layout { + padding: 8px; + + .top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 4px; + padding-right: 4px; + + .tiny-svg { + font-size: 16px; + } + } + + .text { + margin-left: 4px; + } + + .item-icon { + display: none; + color: var(--ti-lowcode-input-icon-color); + + &:hover { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + + & + .item-icon { + margin-left: 8px; + } + } + + .option-input { + &:hover .item-icon { + display: inline-block; + } + } + + .layout-item { + .tiny-svg { + margin-right: 0; + } + + & + .layout-item { + margin-top: 8px; + } + } + } + + .is-setting { + color: var(--ti-lowcode-style-setting-label-color); + background-color: var(--ti-lowcode-style-setting-label-bg); + } + } + + &.icon-popover { + background-color: var(--ti-lowcode-icon-popover-bg); + filter: drop-shadow(rgba(0, 0, 0, 0.5) 0px 0px 1px) drop-shadow(rgba(0, 0, 0, 0.5) 0px 2px 4px) + drop-shadow(rgba(0, 0, 0, 0.5) 0px 4px 12px); + + &[x-placement^='left'] { + .popper__arrow { + right: -6px; + + &, + &::after { + border-left-color: var(--ti-lowcode-icon-popover-bg); + } + } + } + } +} + +// tiny-vue dialogBox 弹框样式 +.tiny-dialog-box__wrapper { + .tiny-dialog-box { + background-color: var(--ti-lowcode-dialog-box-bg-color); + .tiny-dialog-box__header { + color: var(--ti-lowcode-dialog-header-color); + background-color: var(--ti-lowcode-dialog-box-bg-color); + .tiny-dialog-box__headerbtn { + color: var(--ti-lowcode-dialog-close-btn-color); + + &:hover { + color: var(--ti-lowcode-dialog-close-btn-hover-color); + } + } + } + + .tiny-dialog-box__body { + color: var(--ti-lowcode-dialog-box-body-color); + + .tiny-collapse { + margin: 16px 0; + } + + .tiny-collapse-item__header { + padding: 0 8px; + color: var(--ti-lowcode-toolbar-breadcrumb-color); + background-color: var(--ti-lowcode-toolbar-active-bg); + + svg { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + } + + .tiny-collapse-item { + border: none; + margin-top: 0; + padding-top: 0; + padding-bottom: 0; + background: var(--ti-lowcode-toolbar-bg); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + + .tiny-collapse-item__wrap { + background-color: var(--ti-lowcode-toolbar-view-hover-bg); + } + + .tiny-collapse-item__content { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + border: 1px solid var(--ti-lowcode-dialog-demo-border-color); + border-top: none; + } + } + } + + .switch-tip { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + .icon { + font-size: 28px; + margin-right: 12px; + } + } + + &.update-page { + .tiny-dialog-box__body { + .tiny-input { + margin-bottom: 10px; + background-color: -internal-light-dark(rgb(255, 255, 255), rgb(59, 59, 59)); + + input { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + } + } + } +} + +// tiny-vue modal 模态框 +.tiny-modal__wrapper { + .tiny-modal__box { + .tiny-modal__status-wrapper { + display: none; + } + + .tiny-modal__close-btn { + color: var(--ti-lowcode-modal-close-btn-color); + + &:hover { + background-color: unset; + color: var(--ti-lowcode-modal-close-btn-hover-color); + } + } + + .tiny-modal__body { + .modal-content { + color: var(--ti-lowcode-modal-content-color); + } + } + + .tiny-modal__footer { + display: flex; + justify-content: center; + + .tiny-button--primary { + margin-left: 8px; + } + } + } + + &.status__custom { + .tiny-modal__footer { + .tiny-button--default { + display: none; + } + } + } +} + +// tiny-vue tooltip 提示框 +.tiny-tooltip.tiny-tooltip__popper { + &.is-dark { + color: var(--ti-lowcode-tooltip-text-color); + background: var(--ti-lowcode-tooltip-bg-color); + padding: 6px; + border-radius: 2px; + box-shadow: rgb(0 0 0 / 15%) 0px 5px 10px; + font-size: 14px; + } + + &.is-error { + background-color: var(--ti-lowcode-tooltip-error-bg-color); + + &[x-placement^='top'] { + .popper__arrow { + &, + &::after { + border-top-color: var(--ti-lowcode-tooltip-error-bg-color); + } + } + } + + &[x-placement^='bottom'] { + .popper__arrow { + &, + &::after { + border-bottom-color: var(--ti-lowcode-tooltip-error-bg-color); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + &, + &::after { + border-left-color: var(--ti-lowcode-tooltip-error-bg-color); + } + } + } + + &[x-placement^='right'] { + .popper__arrow { + &, + &::after { + border-right-color: var(--ti-lowcode-tooltip-error-bg-color); + } + } + } + } + + &.tiny-form__valid.is-error { + &[x-placement^='top'] { + .popper__arrow { + bottom: -6px; + } + } + } + + &[x-placement^='top'] { + .popper__arrow { + &, + &::after { + border-top-color: var(--ti-lowcode-tooltip-bg-color); + } + } + } + + &[x-placement^='bottom'] { + .popper__arrow { + &, + &::after { + border-bottom-color: var(--ti-lowcode-tooltip-bg-color); + } + } + } + + &[x-placement^='left'] { + .popper__arrow { + &, + &::after { + border-left-color: var(--ti-lowcode-tooltip-bg-color); + } + } + } + + &[x-placement^='right'] { + .popper__arrow { + &, + &::after { + border-right-color: var(--ti-lowcode-tooltip-bg-color); + } + } + } + + &.background-type-tooltip { + z-index: 9999999 !important; + } +} + +.tiny-popper { + &.tiny-picker-panel { + color: var(--ti-lowcode-dialog-font-color); + background: var(--ti-lowcode-toolbar-view-hover-bg); + border-color: var(--ti-lowcode-tabs-border-color); + box-shadow: rgb(0 0 0 / 15%) 0px 5px 10px; + + .tiny-date-picker__header-label { + color: var(--ti-lowcode-dialog-font-color); + } + + .tiny-date-picker__time-header { + border-color: var(--ti-lowcode-tabs-border-color); + } + + .tiny-picker-panel__icon-btn { + color: var(--ti-lowcode-description-minor-color); + + &:hover { + color: var(--ti-lowcode-toolbar-icon-color); + } + } + + .tiny-picker-panel__footer { + background-color: var(--ti-lowcode-toolbar-view-hover-bg); + border-color: var(--ti-lowcode-tabs-border-color); + + .tiny-button--text { + color: var(--ti-lowcode-dialog-font-color); + + &:hover { + color: var(--ti-lowcode-toolbar-icon-color); + } + } + + .tiny-button--primary { + color: var(--ti-lowcode-toolbar-icon-color); + border-color: var(--ti-lowcode-toolbar-border-color); + background-color: var(--ti-lowcode-button-info-bg-color); + + &:hover { + color: var(--ti-lowcode-toolbar-icon-color); + border-color: var(--ti-lowcode-toolbar-border-color); + background-color: var(--ti-lowcode-button-info-hover-bg); + } + } + } + + .tiny-date-table { + td.next-month, + td.pre-month { + color: var(--ti-lowcode-description-minor-color); + + span:hover { + color: var(--ti-lowcode-toolbar-icon-color); + background: var(--ti-lowcode-canvas-wrap-bg); + } + } + + th { + color: var(--ti-lowcode-dialog-font-color); + } + + td.current:not(.disabled) span { + background-color: var(--ti-lowcode-canvas-wrap-bg); + } + + td.available:hover span { + color: var(--ti-lowcode-toolbar-icon-color); + background-color: var(--ti-lowcode-canvas-wrap-bg); + } + } + + .tiny-time-panel { + background: var(--ti-lowcode-toolbar-view-hover-bg); + border-color: var(--ti-lowcode-tabs-border-color); + box-shadow: rgb(0 0 0 / 15%) 0px 5px 10px; + } + + .tiny-time-spinner__item { + color: var(--ti-lowcode-description-minor-color); + + &.active:not(.disabled) { + color: var(--ti-lowcode-toolbar-icon-color); + } + + &:hover:not(.disabled):not(.active) { + color: var(--ti-lowcode-toolbar-icon-color); + background: var(--ti-lowcode-canvas-wrap-bg); + } + } + + .tiny-time-panel__footer { + border-color: var(--ti-lowcode-tabs-border-color); + + .cancel { + color: var(--ti-lowcode-dialog-font-color); + } + + .confirm { + color: var(--ti-lowcode-button-info-bg); + } + } + + .tiny-time-panel__content { + &::after, + &::before { + border-color: var(--ti-lowcode-toolbar-border-color); + } + } + } +} + +.tiny-grid { + svg { + color: var(--ti-grid-primary-color); + width: 16px; + height: 16px; + } + .tiny-grid__body-wrapper { + .tiny-grid-body__column { + border-bottom: 0; + cursor: pointer; + color: var(--ti-lowcode-base-text-color); + + .tree-box { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + + .node-icon { + margin-right: 5px; + } + } + } + + .tiny-grid-body__row { + .tiny-grid-default-input { + background: var(--ti-lowcode-input-bg); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + + &, + &:not(.row__hover):nth-child(2n) { + background: var(--ti-lowcode-tiny-grid-row-hover-bg); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + &:hover { + background: var(--ti-lowcode-toolbar-bg); + } + + &.row__current { + background: var(--ti-lowcode-node-current-bg); + + span { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + + svg { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } + } + + &.sortable-chosen { + background: var(--ti-lowcode-node-current-bg); + + &.nodrag { + background: var(--ti-lowcode-node-nodrag-bg); + } + } + } + + &.nav-tree { + .tiny-grid-body__column { + height: 32px; + } + + .tiny-grid-cell { + display: flex; + } + } + } + + .tiny-grid-tree-wrapper { + width: 14px; + + .tiny-grid-tree__node-btn { + font-size: 8px; + color: var(--ti-lowcode-tree-icon-color); + + &:hover { + color: var(--ti-lowcode-toolbar-icon-color); + } + } + } + } + + .tiny-grid__fixed-right-wrapper, + .tiny-grid__fixed-left-wrapper { + background-color: var(--ti-lowcode-common-bg-1); + } + + .tiny-grid-checkbox { + input { + & + .tiny-grid-checkbox__icon { + border: 1px solid var(--ti-lowcode-tiny-grid-checkbox-checked-border-color); + background-color: transparent; + svg { + color: var(--ti-lowcode-tiny-grid-checkbox-svg-color); + } + } + + &:checked + .tiny-grid-checkbox__icon { + border: 1px solid var(--ti-lowcode-tiny-grid-checkbox-checked-border-color); + + svg { + color: var(--ti-lowcode-common-primary-color); + width: 100%; + height: 100%; + } + } + + &[type='checkbox']:checked + .tiny-grid-checkbox__icon { + background-color: var(--ti-lowcode-tiny-grid-checkbox-checked-bg-color); + border-color: var(--ti-lowcode-tiny-grid-checkbox-checked-border-color); + } + } + &.is__indeterminate { + .tiny-grid-checkbox__icon svg { + color: var(--ti-lowcode-common-primary-color); + } + } + } + .tiny-grid-radio { + input + .tiny-grid-radio__icon > svg.icon-radio-selected { + color: var(--ti-lowcode-tiny-radio-selected-svg-color); + } + } +} + +.stripe-tiny-grid.tiny-grid { + background-color: var(--ti-lowcode-common-component-bg); + .tiny-grid { + background-color: var(--ti-lowcode-common-component-bg); + } + + .tiny-grid__header-wrapper { + background-color: var(--ti-lowcode-tabs-bg); + + .tiny-grid-header__column { + color: var(--ti-lowcode-stripe-grid-header-text-color); + height: 39px; + } + + .tiny-grid__repair { + border-color: var(--ti-lowcode-tabs-border-color); + } + + .tiny-grid-resizable.is__line:before { + background-color: var(--ti-lowcode-toolbar-active-bg); + } + } + + .tiny-grid__body-wrapper { + .tiny-grid-body__column { + height: 44px; + } + + .tiny-grid-body__row, + .tiny-grid-body__row:not(.row__hover):nth-child(2n) { + background-color: var(--ti-lowcode-stripe-grid-list-2n-bg-color); + + &:hover { + background-color: var(--ti-lowcode-stripe-grid-list-item-hover-bg); + } + + &.row__current { + background-color: var(--ti-lowcode-toolbar-view-hover-bg); + } + } + + .tiny-grid-body__row:not(.row__hover):nth-child(2n) { + background-color: var(--ti-lowcode-stripe-grid-list-n-bg-color); + } + } + + .tiny-grid__empty-text { + color: var(--ti-lowcode-toolbar-breadcrumb-color); + } +} + +.tiny-search { + div.tiny-search__line { + &:hover { + background-color: var(--ti-lowcode-search-hover-bg); + } + &.focus { + .tiny-search__input-btn { + color: var(--ti-lowcode-search-hover-icon-color); + } + .tiny-search__prefix svg { + color: var(--ti-lowcode-search-hover-icon-color); + } + } + + .tiny-search__input-btn { + color: var(--ti-lowcode-search-icon-color); + &:hover { + color: var(--ti-lowcode-search-hover-icon-color); + } + } + .tiny-search__prefix svg { + color: var(--ti-lowcode-search-icon-color); + &:hover { + color: var(--ti-lowcode-search-hover-icon-color); + cursor: pointer; + } + } + .tiny-search__input { + color: var(--ti-lowcode-search-input-color); + &::placeholder { + color: var(--ti-lowcode-search-input-placeholder-color); + } + } + } +} + +.tiny-input { + .tiny-input__inner { + border-color: var(--ti-lowcode-input-border-color); + background-color: var(--ti-lowcode-input-bg-color); + color: var(--ti-lowcode-input-color); + + &:focus { + border-color: var(--ti-lowcode-input-focus-border-color); + } + &::placeholder { + color: var(--ti-lowcode-input-placeholder-color); + } + &:hover { + border-color: var(--ti-lowcode-input-hover-border-color); + } + } + + &.is-disabled { + .tiny-input__inner { + border-color: var(--ti-lowcode-input-disabled-border-color); + background: var(--ti-lowcode-input-disabled-bg-color); + } + } + + // 全局自定义的错误样式状态,tinyvue 那边要有错误样式必须要包一层 form、form-item + // 所以我们这里自定义了一个类,添加这个类,就可以有错误的样式,无需包一层 form、form-item + &.status-error { + .tiny-input__inner { + border-color: var(--ti-lowcode-input-error-border-color); + background-color: var(--ti-lowcode-input-error-bg-color); + } + } +} + +.tiny-textarea { + border-color: var(--ti-lowcode-textarea-border-color); + + &:hover, + &:has(.tiny-textarea__inner:focus) { + border-color: var(--ti-lowcode-textarea-hover-border-color); + } + + .tiny-textarea__inner { + background-color: var(--ti-lowcode-textarea-input-bg-color); + color: var(--ti-lowcode-textarea-input-color); + } +} + +.tiny-numeric { + .tiny-numeric__decrease, + .tiny-numeric__increase { + color: var(--ti-lowcode-tiny-numeric-icon-color); + + &:hover { + color: var(--ti-lowcode-tiny-numeric-icon-hover-color); + } + } +} + +span.tiny-switch { + background-color: var(--ti-lowcode-tiny-switch-bg-color); + + &.tiny-switch-checked { + background-color: var(--ti-lowcode-tiny-switch-checked-bg-color); + } + + &::after { + background-color: var(--ti-lowcode-tiny-switch-dot-bg); + } +} + +.tiny-select { + div.tiny-input { + &.is-focus { + .tiny-input__inner { + border-color: var(--ti-lowcode-select-focus-border-color); + } + } + } + + .tiny-select__tags { + .tiny-tag { + color: var(--ti-lowcode-select-tags-text-color); + background-color: var(--ti-lowcode-select-tags-bg-color); + + .tiny-tag__close { + color: var(--ti-lowcode-select-tags-text-color); + &:hover { + color: var(--ti-lowcode-select-suffix-icon-color-hover); + } + } + } + } + + .tiny-input { + .tiny-input__inner { + padding: 8px; + } + + .tiny-select__caret { + color: var(--ti-lowcode-select-tags-text-color); + } + + .tiny-input__suffix-inner { + &:hover { + .tiny-select__caret { + color: var(--ti-lowcode-select-suffix-icon-color-hover); + } + } + } + } +} + +.tiny-select-dropdown { + &.tiny-popper { + background-color: var(--ti-lowcode-dropdown-bg-color); + border: 1px solid var(--ti-lowcode-dropdown-border-color); + + &.select-popper { + margin-top: 3px; + + .tiny-select-dropdown__item.tiny-option { + width: 79px; + height: 24px; + line-height: 24px; + padding: 4px 8px; + display: flex; + align-items: center; + } + + .tiny-select-dropdown__list { + padding: 4px 0; + } + + .tiny-select-dropdown__wrap { + min-height: 50px; + margin-bottom: -8px !important; + margin-right: -8px !important; + } + } + + .cursor-option { + padding: 0 4px 0 12px; + + .item-icon { + font-size: 16px; + } + + .item-label { + font-size: 14px; + margin-left: 4px; + } + } + } + + .tiny-select-dropdown__item { + &.tiny-option { + color: var(--ti-lowcode-dropdown-item-text-color); + background-color: var(--ti-lowcode-dropdown-bg-color); + + &.hover, + &:hover { + background-color: var(--ti-lowcode-dropdown-item-hover-bg-color); + color: var(--ti-lowcode-dropdown-item-hover-text-color); + } + + &.selected { + color: var(--ti-lowcode-dropdown-item-selected-color); + background-color: var(--ti-lowcode-dropdown-item-selected-bg); + + & > span { + position: relative; + + &::before { + content: '\2714'; + position: absolute; + left: 0; + } + } + } + + & > span { + padding-left: 16px; + } + + &.is-disabled > a { + cursor: not-allowed; + } + } + } + + &.is-multiple { + .tiny-select-dropdown__item.tiny-option { + &:not(.is-disabled).hover, + &:not(.is-disabled):hover { + color: var(--ti-lowcode-dropdown-item-hover-text-color); + background-color: var(--ti-lowcode-dropdown-item-hover-bg-color); + + .tiny-svg { + color: var(--ti-lowcode-dropdown-item-hover-text-color); + } + } + + &.is-disabled:hover { + background-color: transparent; + } + + &.selected { + color: var(--ti-lowcode-dropdown-item-hover-text-color); + background-color: transparent; + font-weight: 600; + + .tiny-svg { + color: var(--ti-lowcode-dropdown-item-hover-text-color); + } + + & > span { + padding-left: 0; + + &::before { + content: ''; + } + } + } + + & > span { + padding-left: 0; + } + } + } + + .tiny-select-group__wrap { + &:not(:last-of-type)::after { + left: 0; + right: 0; + background: var(--ti-lowcode-toolbar-border-color); + } + + .tiny-select-group__title { + font-size: 14px; + font-weight: 500; + color: var(--ti-lowcode-dialog-font-color); + background: var(--ti-lowcode-toolbar-bg); + padding: 2px 0 2px 8px; + margin-bottom: 2px; + } + } + + .tiny-tree { + color: var(--ti-lowcode-dialog-font-color); + background: var(--ti-lowcode-toolbar-view-hover-bg); + + .tiny-tree-node__expand-icon { + &, + &.expanded { + color: var(--ti-lowcode-dialog-font-color); + } + + &:not(.is-leaf) { + margin-left: 12px; + margin-right: 6px; + } + } + + .tiny-tree-node__content { + &:hover { + background-color: var(--ti-lowcode-canvas-wrap-bg); + } + } + + .tiny-tree-node { + &.is-current, + &:focus { + & > .tiny-tree-node__content { + background-color: var(--ti-lowcode-canvas-wrap-bg); + } + } + } + } + + &.position-origin-select { + min-width: 72px !important; + z-index: 9999999 !important; + } +} + +.tiny-tree { + .tiny-tree-node__label { + font-size: 12px; + } +} + +button { + &.tiny-button { + &.tiny-button--default { + color: var(--ti-lowcode-button-default-color); + border-color: var(--ti-lowcode-button-default-border-color); + background-color: var(--ti-lowcode-button-default-bg); + + &:hover { + color: var(--ti-lowcode-button-default-hover-color); + border-color: var(--ti-lowcode-button-default-hover-border-color); + background-color: var(--ti-lowcode-button-default-hover-bg); + } + + &.is-disabled { + color: var(--ti-lowcode-button-default-disabled-color); + border-color: var(--ti-lowcode-button-default-disabled-border-color); + background-color: var(--ti-lowcode-button-default-disabled-bg); + } + } + + &.tiny-button--info { + color: var(--ti-lowcode-button-info-color); + border-color: var(--ti-lowcode-button-info-border-color); + background-color: var(--ti-lowcode-button-info-bg-color); + + &:hover { + color: var(--ti-lowcode-button-info-hover-color); + border-color: var(--ti-lowcode-button-info-hover-border-color); + background-color: var(--ti-lowcode-button-info-hover-bg-color); + } + } + &.tiny-button--primary { + color: var(--ti-lowcode-button-primary-color); + border-color: var(--ti-lowcode-button-primary-border-color); + background-color: var(--ti-lowcode-button-primary-bg-color); + + &:hover { + color: var(--ti-lowcode-button-primary-hover-color); + border-color: var(--ti-lowcode-button-primary-hover-border-color); + background-color: var(--ti-lowcode-button-primary-hover-bg-color); + } + } + } +} + +.tiny-button-group { + ul.tiny-group-item { + border: 1px solid var(--ti-lowcode-tabs-border-color); + border-radius: 2px; + + li { + background-color: var(--ti-lowcode-canvas-wrap-bg); + + &.active { + &:hover button:not(.disabled), + button:not(.disabled) { + background: var(--ti-lowcode-tabs-bg); + border-color: var(--ti-lowcode-tabs-bg); + color: var(--ti-lowcode-toolbar-icon-color); + } + } + + &:hover { + button:not(.disabled) { + color: var(--ti-lowcode-dropdown-item-hover-text-color); + background-color: var(--ti-lowcode-common-component-bg); + } + } + + &:not(:last-child) { + margin-right: 0; + } + } + + button { + background-color: var(--ti-lowcode-canvas-wrap-bg); + color: var(--ti-lowcode-toolbar-breadcrumb-color); + + &::before { + background: var(--ti-lowcode-tabs-border-color); + } + } + } +} + +.tiny-form { + .tiny-form-item__label { + padding-right: 8px; + color: var(--ti-lowcode-input-label-color); + } + + .tiny-form-item { + &.is-error { + margin-bottom: 20px; + } + } +} + +.tiny-collapse { + .tiny-collapse-item { + border: none; + // 第一项的外边距会与其他元素外边距相加形成最终外边距,因此第一项外边距不调整 + + .tiny-collapse-item { + margin-top: 4px; + } + .tiny-collapse-item__header { + padding-left: 16px; + } + .components-items { + .item { + cursor: pointer; + } + } + } + + .tiny-collapse-item__header { + color: var(--ti-lowcode-collapse-item-header-color); + background: var(--ti-lowcode-collapse-item-header-bg-color); + position: relative; + min-height: 32px; + padding-top: 5px; + padding-bottom: 5px; + + &:hover, + &.is-active { + color: var(--ti-lowcode-collapse-item-header-active-color); + } + + .tiny-collapse-item__arrow { + line-height: 14px; + } + } + + .tiny-collapse-item, + .tiny-collapse-item__wrap { + background-color: var(--ti-lowcode-collapse-item-bg-color); + } + + .tiny-collapse-item__content { + color: var(--ti-lowcode-collapse-item-content-color); + padding: 0; + border: none; + } + + .tiny-collapse-item__wrap { + overflow: inherit; + } +} + +.canvas-slot-choose { + div { + line-height: 30px; + text-align: center; + color: var(--ti-lowcode-button-info-color); + + &:hover { + background-color: var(--ti-lowcode-component-item-hover-bg); + } + } +} + +.tiny-notify { + .tiny-notify__close-zone { + color: var(--ti-lowcode-notify-close-color); + &:hover { + color: var(--ti-lowcode-notify-close-hover-color); + } + } + + &.tiny-notify--error { + .tiny-notify__icon-status { + color: var(--ti-lowcode-base-error-color); + } + } + + &.tiny-notify--info { + .tiny-notify__icon-status { + color: var(--ti-lowcode-base-prompt-color); + } + } + + &.tiny-notify--success { + .tiny-notify__icon-status { + color: var(--ti-lowcode-base-success-color); + } + } + + &.tiny-notify--warning { + .tiny-notify__icon-status { + color: var(--ti-lowcode-base-warn-color); + } + } +} + +.tiny-tabs { + // tiny-tabs button-card模式宽度默认无法铺满父容器,添加此类名修改成铺满父容器 + &.full-width-tabs { + .tiny-tabs__nav { + float: none; + display: flex; + .tiny-tabs__item { + flex: 1 1 auto; + } + } + } + &__item__title { + text-align: center; + } +} + +.tiny-dropdown { + &__trigger { + color: var(--ti-lowcode-trigger-color); + &:not(&__caret-button):hover { + color: var(--ti-lowcode-trigger-hover-color); + } + } +} + +.empty-wrap { + text-align: center; + margin-top: 20px; + + .empty-icon { + width: 64px; + height: 64px; + color: var(--ti-lowcode-empty-icon-color); + } + + .empty-text { + margin-top: 6px; + margin-bottom: 0; + font-size: 12px; + color: var(--ti-lowcode-common-text-color-5); + } +} + +.tiny-radio-group { + .tiny-radio-button { + &:first-child { + .tiny-radio-button__inner { + border-color: var(--ti-lowcode-radio-button-border-color); + } + } + .tiny-radio-button__orig-radio:checked { + & + .tiny-radio-button__inner { + background-color: var(--ti-lowcode-tiny-radio-button-checked-bg); + border-color: var(--ti-lowcode-radio-button-border-color); + &:hover { + box-shadow: none; + } + } + } + &__inner { + background-color: var(--ti-lowcode-tiny-radio-button-bg); + color: var(--ti-lowcode-radio-button-color); + border-color: var(--ti-lowcode-radio-button-border-color); + } + } +} + +.tiny-loading { + .tiny-loading__spinner { + margin-top: 0; + transform: translateY(-50%); + } +} + +.global-desc-info { + color: var(--ti-lowcode-common-text-desc-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/base.less b/dl-flow-frontend/packages/theme/dark/base.less new file mode 100644 index 0000000..2713eff --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/base.less @@ -0,0 +1,273 @@ +:root { + // 灰阶 + --ti-lowcode-base-gray-0: #fff; + --ti-lowcode-base-gray-10: #e6e6e6; + --ti-lowcode-base-gray-20: #d9d9d9; + --ti-lowcode-base-gray-30: #ccc; + --ti-lowcode-base-gray-40: #a6a6a6; + --ti-lowcode-base-gray-50: #808080; + --ti-lowcode-base-gray-60: #595959; + --ti-lowcode-base-gray-70: #333; + --ti-lowcode-base-gray-80: #292929; + --ti-lowcode-base-gray-90: #1f1f1f; + --ti-lowcode-base-gray-95: #141414; + --ti-lowcode-base-gray-100: #000; + + // expand-red + --ti-lowcode-base-red-1: #ffeae8; + --ti-lowcode-base-red-2: #fccdca; + --ti-lowcode-base-red-3: #faa9a5; + --ti-lowcode-base-red-4: #fa8682; + --ti-lowcode-base-red-5: #f76360; + --ti-lowcode-base-red-6: #f23030; + --ti-lowcode-base-red-7: #cc272a; + --ti-lowcode-base-red-8: #a3171c; + --ti-lowcode-base-red-9: #78080e; + --ti-lowcode-base-red-10: #4d0005; + --ti-lowcode-base-red-11: #a64242; + --ti-lowcode-base-red-12: #d4827f; + --ti-lowcode-base-red-13: #f2c5c2; + + // expand-orange + --ti-lowcode-base-orange-1: #fff5e8; + --ti-lowcode-base-orange-2: #fcdfb8; + --ti-lowcode-base-orange-3: #fcc98b; + --ti-lowcode-base-orange-4: #fcb25c; + --ti-lowcode-base-orange-5: #ff9a2e; + --ti-lowcode-base-orange-6: #ff8800; + --ti-lowcode-base-orange-7: #d96900; + --ti-lowcode-base-orange-8: #a64d00; + --ti-lowcode-base-orange-9: #733400; + --ti-lowcode-base-orange-10: #4d2201; + --ti-lowcode-base-orange-11: #9e6d3f; + --ti-lowcode-base-orange-12: #d6a981; + --ti-lowcode-base-orange-13: #f2d8c2; + + // expand-yellow + --ti-lowcode-base-yellow-1: #fcf9eb; + --ti-lowcode-base-yellow-2: #fcf0c2; + --ti-lowcode-base-yellow-3: #fae396; + --ti-lowcode-base-yellow-4: #f7d56d; + --ti-lowcode-base-yellow-5: #f7c845; + --ti-lowcode-base-yellow-6: #fcbe1e; + --ti-lowcode-base-yellow-7: #d99b0b; + --ti-lowcode-base-yellow-8: #a67711; + --ti-lowcode-base-yellow-9: #7a5202; + --ti-lowcode-base-yellow-10: #4d3200; + --ti-lowcode-base-yellow-11: #9e7e3f; + --ti-lowcode-base-yellow-12: #d4b57f; + --ti-lowcode-base-yellow-13: #e6d3b8; + + // expand-lemon + --ti-lowcode-base-lemon-1: #fcfae8; + --ti-lowcode-base-lemon-2: #fcf6c2; + --ti-lowcode-base-lemon-3: #fcf092; + --ti-lowcode-base-lemon-4: #fae969; + --ti-lowcode-base-lemon-5: #f7e04a; + --ti-lowcode-base-lemon-6: #f7d916; + --ti-lowcode-base-lemon-7: #d9bb16; + --ti-lowcode-base-lemon-8: #a38708; + --ti-lowcode-base-lemon-9: #756002; + --ti-lowcode-base-lemon-10: #4d3d00; + --ti-lowcode-base-lemon-11: #9e8f46; + --ti-lowcode-base-lemon-12: #d6c581; + --ti-lowcode-base-lemon-13: #eddfb2; + + // expand-lime + --ti-lowcode-base-lime-1: #f8fae3; + --ti-lowcode-base-lime-2: #eff5bf; + --ti-lowcode-base-lime-3: #e2ed8e; + --ti-lowcode-base-lime-4: #d5e667; + --ti-lowcode-base-lime-5: #c6de3e; + --ti-lowcode-base-lime-6: #b2d119; + --ti-lowcode-base-lime-7: #95b312; + --ti-lowcode-base-lime-8: #728c0a; + --ti-lowcode-base-lime-9: #576e05; + --ti-lowcode-base-lime-10: #3b4d00; + --ti-lowcode-base-lime-11: #808c46; + --ti-lowcode-base-lime-12: #c1cc7a; + --ti-lowcode-base-lime-13: #3b4d00; + + // expand-kelly + --ti-lowcode-base-kelly-1: #f2fae6; + --ti-lowcode-base-kelly-2: #daf2bb; + --ti-lowcode-base-kelly-3: #b9e683; + --ti-lowcode-base-kelly-4: #9edb58; + --ti-lowcode-base-kelly-5: #7dcc29; + --ti-lowcode-base-kelly-6: #5cb300; + --ti-lowcode-base-kelly-7: #4b9902; + --ti-lowcode-base-kelly-8: #3c8001; + --ti-lowcode-base-kelly-9: #2e6600; + --ti-lowcode-base-kelly-10: #1f4700; + --ti-lowcode-base-kelly-11: #628c38; + --ti-lowcode-base-kelly-12: #a2c777; + --ti-lowcode-base-kelly-13: #d2e6bb; + + // expand-green + --ti-lowcode-base-green-1: #e8fced; + --ti-lowcode-base-green-2: #bbf2c8; + --ti-lowcode-base-green-3: #82e09a; + --ti-lowcode-base-green-4: #51d675; + --ti-lowcode-base-green-5: #25c251; + --ti-lowcode-base-green-6: #00b336; + --ti-lowcode-base-green-7: #029931; + --ti-lowcode-base-green-8: #01802b; + --ti-lowcode-base-green-9: #006624; + --ti-lowcode-base-green-10: #004a1b; + --ti-lowcode-base-green-11: #3d995c; + --ti-lowcode-base-green-12: #77c78f; + --ti-lowcode-base-green-13: #b8e6c7; + + // expand-mint + --ti-lowcode-base-mint-1: #e8fcfa; + --ti-lowcode-base-mint-2: #bff5ef; + --ti-lowcode-base-mint-3: #8be8e0; + --ti-lowcode-base-mint-4: #5dded5; + --ti-lowcode-base-mint-5: #38d6ce; + --ti-lowcode-base-mint-6: #10c7c1; + --ti-lowcode-base-mint-7: #0aaba8; + --ti-lowcode-base-mint-8: #048c8c; + --ti-lowcode-base-mint-9: #046466; + --ti-lowcode-base-mint-10: #004547; + --ti-lowcode-base-mint-11: #3d9996; + --ti-lowcode-base-mint-12: #77c7c2; + --ti-lowcode-base-mint-13: #b8e6e1; + + // expand-sky + --ti-lowcode-base-sky-1: #e8f8fc; + --ti-lowcode-base-sky-2: #c4f2ff; + --ti-lowcode-base-sky-3: #9de4fa; + --ti-lowcode-base-sky-4: #79d8f7; + --ti-lowcode-base-sky-5: #58cbf5; + --ti-lowcode-base-sky-6: #33bcf2; + --ti-lowcode-base-sky-7: #1f9acf; + --ti-lowcode-base-sky-8: #1075a3; + --ti-lowcode-base-sky-9: #065278; + --ti-lowcode-base-sky-10: #00304a; + --ti-lowcode-base-sky-11: #3d7f99; + --ti-lowcode-base-sky-12: #7ab8cc; + --ti-lowcode-base-sky-13: #b6e5f2; + + // expand-blue + --ti-lowcode-base-blue-1: #e3effa; + --ti-lowcode-base-blue-2: #c4e1ff; + --ti-lowcode-base-blue-3: #99c9ff; + --ti-lowcode-base-blue-4: #68abfc; + --ti-lowcode-base-blue-5: #4191fa; + --ti-lowcode-base-blue-6: #1476ff; + --ti-lowcode-base-blue-7: #0f5ed4; + --ti-lowcode-base-blue-8: #0845a6; + --ti-lowcode-base-blue-9: #022e7a; + --ti-lowcode-base-blue-10: #001a4a; + --ti-lowcode-base-blue-11: #3d6899; + --ti-lowcode-base-blue-12: #7fa6d4; + --ti-lowcode-base-blue-13: #b6d4f2; + + // expand-indigo + --ti-lowcode-base-indigo-1: #eee8ff; + --ti-lowcode-base-indigo-2: #ddd7fa; + --ti-lowcode-base-indigo-3: #b19cf7; + --ti-lowcode-base-indigo-4: #957af5; + --ti-lowcode-base-indigo-5: #6e51e0; + --ti-lowcode-base-indigo-6: #512fd6; + --ti-lowcode-base-indigo-7: #391eb0; + --ti-lowcode-base-indigo-8: #27108f; + --ti-lowcode-base-indigo-9: #19056e; + --ti-lowcode-base-indigo-10: #0e004d; + --ti-lowcode-base-indigo-11: #584d99; + --ti-lowcode-base-indigo-12: #847acc; + --ti-lowcode-base-indigo-13: #bbb8e6; + + // expand-purple + --ti-lowcode-base-purple-1: #f5e8ff; + --ti-lowcode-base-purple-2: #e4c5fc; + --ti-lowcode-base-purple-3: #d0a1f7; + --ti-lowcode-base-purple-4: #b878f0; + --ti-lowcode-base-purple-5: #9f53e6; + --ti-lowcode-base-purple-6: #832fd6; + --ti-lowcode-base-purple-7: #641eb0; + --ti-lowcode-base-purple-8: #4c1091; + --ti-lowcode-base-purple-9: #370673; + --ti-lowcode-base-purple-10: #20004d; + --ti-lowcode-base-purple-11: #683d99; + --ti-lowcode-base-purple-12: #a07acc; + --ti-lowcode-base-purple-13: #cbb8e6; + + // expand-pink + --ti-lowcode-base-pink-1: #fce6fb; + --ti-lowcode-base-pink-2: #fcc2f9; + --ti-lowcode-base-pink-3: #f794f2; + --ti-lowcode-base-pink-4: #eb67e6; + --ti-lowcode-base-pink-5: #e841e5; + --ti-lowcode-base-pink-6: #d91ad9; + --ti-lowcode-base-pink-7: #b50fb8; + --ti-lowcode-base-pink-8: #8f0a94; + --ti-lowcode-base-pink-9: #6b0370; + --ti-lowcode-base-pink-10: #47004d; + --ti-lowcode-base-pink-11: #993d99; + --ti-lowcode-base-pink-12: #c97acc; + --ti-lowcode-base-pink-13: #e2b8e6; + + // expand-rose + --ti-lowcode-base-rose-1: #fce6ef; + --ti-lowcode-base-rose-2: #ffc4de; + --ti-lowcode-base-rose-3: #fa9bc9; + --ti-lowcode-base-rose-4: #f56cac; + --ti-lowcode-base-rose-5: #eb4696; + --ti-lowcode-base-rose-6: #e61c81; + --ti-lowcode-base-rose-7: #b50e65; + --ti-lowcode-base-rose-8: #940a54; + --ti-lowcode-base-rose-9: #70033f; + --ti-lowcode-base-rose-10: #4d002b; + --ti-lowcode-base-rose-11: #993d6e; + --ti-lowcode-base-rose-12: #cc7aa6; + --ti-lowcode-base-rose-13: #e6b8d2; + + // 公司品牌色 + --ti-lowcode-base-brand-color: #c7000b; + + // 主色 + --ti-lowcode-base-primary-color-1: #e6e6e6; + --ti-lowcode-base-primary-color-2: #1476ff; + + // 背景色 + --ti-lowcode-base-bg: #141414; + --ti-lowcode-base-bg-1: rgba(0, 0, 0, 0.05); + --ti-lowcode-base-bg-2: #333; + --ti-lowcode-base-bg-3: #e6e6e6; + --ti-lowcode-base-bg-4: #a6a6a6; + --ti-lowcode-base-bg-5: #000; + --ti-lowcode-base-bg-6: #a6a6a61a; + + // 文本色 + --ti-lowcode-base-text-color: #e6e6e6; + --ti-lowcode-base-text-color-1: #a6a6a6; + --ti-lowcode-base-text-color-2: #1476ff; + --ti-lowcode-base-text-color-3: #808080; + --ti-lowcode-base-text-color-4: #595959; + + // 文本链接色 + --ti-lowcode-base-text-link-color: #e6e6e6; + --ti-lowcode-base-text-link-color-1: #a6a6a6; + --ti-lowcode-base-text-link-color-2: #595959; + --ti-lowcode-base-text-link-color-3: #fff; + + // 按钮边框色 + --ti-lowcode-base-secondary-button-border-color: #a6a6a6; + --ti-lowcode-base-secondary-button-border-hover-color: #3d3d3d; + --ti-lowcode-base-default-button-border-color: #595959; + --ti-lowcode-base-default-button-border-hover-color: #e6e6e6; + --ti-lowcode-base-default-button-border-disable-color: #dbdbdb; + + // 分割线 + --ti-lowcode-base-split-color-1: rgba(255, 255, 255, 0.08); // 白色背景分割线 + --ti-lowcode-base-split-color-2: rgba(255, 255, 255, 0.15); // 灰色背景分割线 + + // 状态色 + --ti-lowcode-base-error-color: #f23030; + --ti-lowcode-base-warn-color: #ff8800; + --ti-lowcode-base-warn-color-1: #f7d916; + --ti-lowcode-base-success-color: #5cb300; + --ti-lowcode-base-prompt-color: #1476ff; + --ti-lowcode-base-invalidate-color: #ebebeb; +} diff --git a/dl-flow-frontend/packages/theme/dark/block.less b/dl-flow-frontend/packages/theme/dark/block.less new file mode 100644 index 0000000..2b43fe9 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/block.less @@ -0,0 +1,57 @@ +:root { + // 历史备份列表 + --ti-lowcode-component-block-history-list-item-border-color: var(--ti-lowcode-common-border-color-1); // 组件边框色 + // 组件 hover 背景 色 + --ti-lowcode-component-block-history-list-item-hover-bg: var(--ti-lowcode-common-component-hover-bg); + // 组件默认颜色 + --ti-lowcode-component-block-history-list-item-text-color: var(--ti-lowcode-common-secondary-text-color); + // 预览还原 hover 颜色 + --ti-lowcode-component-block-history-list-item-btn-hover-color: var(--ti-lowcode-common-primary-text-color); + --ti-lowcode-component-block-history-list-item-btn-hover-bg: var(--ti-lowcode-common-hover-bg-1); // 预览还原背景色 + // 预览还原边框色 + --ti-lowcode-component-block-history-list-item-btn-border-color: var(--ti-lowcode-common-border-color-3); + --ti-lowcode-component-block-history-list-item-title-color: var(--ti-lowcode-common-text-color-2); // 组件title颜色 + --ti-lowcode-component-block-history-list-item-time-color: rgba(173, 176, 184, 0.6); // 组件时间颜色 + + // 区块列表 + --ti-lowcode-component-block-list-item-color: var(--ti-lowcode-common-secondary-text-color); // 区块列表颜色 + --ti-lowcode-component-block-list-shortcut-title-color: var(--ti-lowcode-common-primary-text-color); // 快照标题颜色 + --ti-lowcode-component-block-list-shortcut-bg: var(--ti-lowcode-common-component-bg); // 快照标题颜色 + --ti-lowcode-component-block-list-border-color: var(--ti-lowcode-common-border-color-4); // 快照标题颜色 + --ti-lowcode-component-block-list-item-active-bg: var(--ti-lowcode-common-component-hover-bg); // 区块 active 背景色 + --ti-lowcode-component-block-list-item-tag-bg: #8d5421; + --ti-lowcode-component-block-version-list-item-border-color: #202020; + --ti-lowcode-component-block-version-list-item-bg: #292929; + --ti-lowcode-component-block-version-list-version-bg: #323644; + --ti-lowcode-component-block-version-list-version-color: #476be5; + --ti-lowcode-component-block-version-list-panel-title-color: var(--ti-lowcode-common-primary-text-color); + --ti-lowcode-component-block-version-list-time-color: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-component-block-version-list-desc-color: #63666c; + --ti-lowcode-component-block-version-list-current-version-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-component-block-setting-popover-bg: #202020; + --ti-lowcode-component-block-setting-item-hover-bg: #202020; + --ti-lowcode-component-block-setting-item-text-color: var(--ti-lowcode-common-secondary-text-color); + // 区块管理 - 添加分类 + --ti-lowcode-component-block-list-add-group-btn-bg: var(--ti-lowcode-common-header-bg); + --ti-lowcode-component-block-list-add-group-btn-border: none; + --ti-lowcode-component-block-list-setting-btn-color: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-component-block-list-setting-btn-hover-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-component-block-list-add-group-btn-border-radius: none; +} + +.block-setting-content { + --ti-lowcode-block-config-form-item-color: var(--ti-lowcode-toolbar-breadcrumb-color); + + .tiny-form-item.is-error .tiny-input__inner { + background-color: var(--ti-lowcode-tabs-bg); + } +} + +// 区块设置 - 标签 +.block-tag-create { + --ti-lowcode-block-config-tag-color: var(--ti-lowcode-toolbar-breadcrumb-color); + --ti-lowcode-block-config-tag-bg: var(--ti-lowcode-input-bg); + --ti-lowcode-block-config-tag-hover-color: var(--ti-lowcode-toolbar-icon-color); + --ti-lowcode-block-config-tag-hover-bg: transparent; + --ti-lowcode-block-config-tag-close-color: var(--ti-lowcode-toolbar-icon-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/bridge.less b/dl-flow-frontend/packages/theme/dark/bridge.less new file mode 100644 index 0000000..44dea9e --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/bridge.less @@ -0,0 +1,11 @@ +.plugin-panel { + // 资源管理 + --ti-lowcode-bridge-list-color: #adb0b8; + --ti-lowcode-bridge-list-bg: #3c3c3c; + --ti-lowcode-birdge-editor-border-color: #262626; + --ti-lowcode-birdge-input-label-color: #adb0b8; + + // npm工具类中代码预览的主题 + --ti-lowcode-birdge-code-preview-color: var(--ti-lowcode-base-gray-20); + --ti-lowcode-birdge-code-preview-bg-color: #262626; +} diff --git a/dl-flow-frontend/packages/theme/dark/button.less b/dl-flow-frontend/packages/theme/dark/button.less new file mode 100644 index 0000000..d2c9da9 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/button.less @@ -0,0 +1,34 @@ +button { + --ti-lowcode-button-primary-color: #fff; + --ti-lowcode-button-primary-border-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-button-primary-bg-color: var(--ti-lowcode-common-primary-color); + + --ti-lowcode-button-primary-hover-color: #fff; + --ti-lowcode-button-primary-hover-border-color: var(--ti-lowcode-common-primary-hover-color); + --ti-lowcode-button-primary-hover-bg-color: var(--ti-lowcode-common-primary-hover-color); + + // button info 字体颜色 + --ti-lowcode-button-info-color: #fff; + --ti-lowcode-button-info-border-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-button-info-bg-color: var(--ti-lowcode-common-primary-color); + + // info 保存按钮 hover 背景色 + --ti-lowcode-button-info-hover-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-button-info-hover-border-color: var(--ti-lowcode-common-primary-hover-color); + --ti-lowcode-button-info-hover-bg-color: var(--ti-lowcode-common-primary-hover-color); + + // 默认按钮颜色 + --ti-lowcode-button-default-color: var(--ti-lowcode-toolbar-breadcrumb-color); + --ti-lowcode-button-default-border-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-button-default-bg: transparent; + + // 默认按钮 hover 颜色 + --ti-lowcode-button-default-hover-color: #fff; + --ti-lowcode-button-default-hover-border-color: #6b6b6b; + --ti-lowcode-button-default-hover-bg: #6b6b6b; + + // 默认按钮禁用颜色 + --ti-lowcode-button-default-disabled-color: #4a4b4e; + --ti-lowcode-button-default-disabled-border-color: transparent; + --ti-lowcode-button-default-disabled-bg: var(--ti-lowcode-base-bg-1); +} diff --git a/dl-flow-frontend/packages/theme/dark/canvas.less b/dl-flow-frontend/packages/theme/dark/canvas.less new file mode 100644 index 0000000..d3f83fe --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/canvas.less @@ -0,0 +1,27 @@ +#canvas-wrap { + --ti-lowcode-canvas-rect-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-canvas-hover-line-in-bg-color: rgba(0, 255, 0, 0.1); + --ti-lowcode-canvas-hover-line-forbid-bg-color: rgb(255, 66, 77); + --ti-lowcode-canvas-choose-slot-border-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-canvas-choose-slot-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-canvas-corner-mark-left-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-canvas-corner-mark-bottom-right-color: var(--ti-lowcode-base-text-color-3); + --ti-lowcode-canvas-corner-mark-bottom-right-border-color: #c2c2c2; + --ti-lowcode-canvas-corner-mark-bottom-right-bg-color: #f5f5f5; + --ti-lowcode-canvas-corner-mark-right-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-canvas-corner-mark-right-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-canvas-select-corner-mark-left-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-canvas-select-corner-mark-left-bg-color: var(--ti-lowcode-base-primary-color-2); + + --ti-lowcode-canvas-footer-border-top-color: transparent; // canvas 底部面包屑 边框色 + --ti-lowcode-canvas-tab-handle-bg: var(--ti-lowcode-common-component-bg); // canvas 宽度拖动手柄 背景色 + --ti-lowcode-canvas-tab-handle-hover-bg: var(--ti-lowcode-common-primary-color); // canvas 宽度拖动手柄 hover 背景色 + --ti-lowcode-canvas-tab-handle-color: var( + --ti-lowcode-common-secondary-text-color + ); // canvas 宽度拖动手柄 两条竖线颜色 + --ti-lowcode-canvas-menu-bg: var(--ti-lowcode-common-component-hover-bg); // canvas 右键菜单背景 + --ti-lowcode-canvas-menu-item-color: #adb0b8; // 右键菜单文字颜色 + --ti-lowcode-canvas-menu-item-hover-bg-color: #5e5e5e; + --ti-lowcode-canvas-menu-border-color: var(--ti-lowcode-common-border-color-2); + --ti-lowcode-canvas-menu-item-disabled-color: var(--ti-lowcode-base-text-color-3); +} diff --git a/dl-flow-frontend/packages/theme/dark/datasource.less b/dl-flow-frontend/packages/theme/dark/datasource.less new file mode 100644 index 0000000..2ad563e --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/datasource.less @@ -0,0 +1,44 @@ +:root { + --ti-lowcode-datasource-toolbar-icon-color: var(--ti-lowcode-common-primary-text-color); + --ti-lowcode-datasource-tabs-border-color: #313131; + --ti-lowcode-datasource-toolbar-breadcrumb-color: var(--ti-lowcode-base-gray-20); + --ti-lowcode-datasource-json-border-colorr: var(--ti-lowcode-common-primary-color); + --ti-lowcode-datasource-tree-border-color: #2ad986; + --ti-lowcode-datasource-common-primary-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-datasource-success-border-color: #2ad986; + --ti-lowcode-datasource-input-icon-color: #737373; + --ti-lowcode-datasource-dialog-demo-border-color: #5e5e5e; + --ti-lowcode-datasource-canvas-wrap-bg: #5e5e5e; + --ti-lowcode-datasource-dialog-font-color: var(--ti-lowcode-base-invalidate-color); + --ti-lowcode-datasource-toolbar-bg: #404040; + --ti-lowcode-datasource-description-error-color: #ff0000; + --ti-lowcode-datasource-common-text-main-color: var(--ti-lowcode-base-invalidate-color); + --ti-lowcode-datasource-toolbar-more-hover-color: var(--ti-lowcode-base-invalidate-color); + --ti-lowcode-datasource-delete-button-hover-bg: #c92c3f; + --ti-lowcode-datasource-common-text-color-5: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-datasource-common-empty-color: var(--ti-lowcode-common-empty-color); + --ti-lowcode-datasource-toolbar-view-hover-bg: #4d4d4d; + --ti-lowcode-datasource-common-hover-bg-1: var(--ti-lowcode-common-hover-bg-1); + --ti-lowcode-datasource-common-primary-text-color: var(--ti-lowcode-base-gray-10); + --ti-lowcode-datasource-icon-hover-bg: #e5e5e5; + --ti-lowcode-datasource-tabs-bg: #2b2b2b; + --ti-lowcode-datasource-canvas-handle-hover-bg: var(--ti-lowcode-common-primary-color); + --ti-lowcode-datasource-tabs-active-bg: #2b2b2b; + --ti-lowcode-datasource-common-error-color: var(--ti-lowcode-common-error-color); + --ti-lowcode-datasource-description-minor-color: #ababab; + --ti-lowcode-datasource-description-warning-color: #facb4b; + --ti-lowcode-datasource-error-tip-color: #de504e; + --ti-lowcode-datasource-label-color: var(--ti-lowcode-common-secondary-text-color); // light + --ti-lowcode-datasource-list-hover-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-datasource-btn-click-color: var(--ti-lowcode-common-bg-7); + --ti-lowcode-datasource-btn-border-color: var(--ti-lowcode-base-gray-10); + --ti-lowcode-datasource-tabs-bottom-border-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-datasource-list-bottom-border-color: var(--ti-lowcode-common-header-bg); + --ti-lowcode-datasource-switch-off-bg-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-datasource-switch-on-bg-color: var(--ti-lowcode-base-blue-6); + --ti-lowcode-datasource-respones-select-color-bg: var(--ti-lowcode-common-bg-4); + --ti-lowcode-datasource-respones-color-bg: var(--ti-lowcode-base-blue-6); + --ti-lowcode-datasource-respones-border-color-bg: var(--ti-lowcode-base-text-link-color-3); + --ti-lowcode-datasource-select-border-right-color-bg: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-datasource-select-border-color: #2b2b2b; +} diff --git a/dl-flow-frontend/packages/theme/dark/events.less b/dl-flow-frontend/packages/theme/dark/events.less new file mode 100644 index 0000000..db31330 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/events.less @@ -0,0 +1,36 @@ +.setting-advanced-add-custom-event-tip { + --ti-lowcode-events-add-custom-event-tips-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-event-add-custom-event-tips-highlight-color: var(--ti-lowcode-base-warn-color); +} +.setting-advanced-bind-event-list { + --ti-lowcode-events-bind-event-list-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-events-bind-event-list-item-disabled-color: var(--ti-lowcode-base-text-color-4); + --lowcode-events-bind-event-list-item-hover-bg-color: var(--ti-lowcode-base-bg-1); +} +.bind-action-list { + --ti-lowcode-events-bind-action-item-border-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-events-event-bind-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-events-bind-action-item-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-events-bind-action-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-events-bind-action-item-linked-bg-color: var(--ti-lowcode-base-success-color); + --ti-lowcode-events-bind-action-item-linked-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-events-empty-action-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-events-empty-action-tips-strong-color: var(--ti-lowcode-base-warn-color); +} + +.advanced-config-container { + --ti-lowcode-events-advanced-config-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-events-advanced-label-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-events-advanced-binding-state-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-events-advanced-binding-state-color: var(--ti-lowcode-base-gray-0); +} + +.bind-event-dialog-content { + --ti-lowcode-bind-event-dialog-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-bind-event-dialog-content-left-border-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-bind-event-dialog-content-right-monaco-border-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-bind-event-dialog-content-left-list-item-active-bg-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-bind-event-dialog-new-action-tip-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-bind-event-dialog-action-selected-icon-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-bind-event-dialog-mark-bg-color: var(--ti-lowcode-base-bg-6); +} diff --git a/dl-flow-frontend/packages/theme/dark/gpt-dialog.less b/dl-flow-frontend/packages/theme/dark/gpt-dialog.less new file mode 100644 index 0000000..74fce60 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/gpt-dialog.less @@ -0,0 +1,51 @@ +.bind-chatgpt { + // chatGPT聊天窗问题模板文字颜色 + --ti-lowcode-chat-model-text: #dfe1e6; + // chatGPT聊天窗问题模板文字边框颜色 + --ti-lowcode-chat-model-text-border: #8a8e99; + // chatGPT聊天窗提问框图标 + --ti-lowcode-chat-model-input-icon: #8a8e99; + // chatGPT聊天窗用户头像边框色 + --ti-lowcode-chat-model-avatar-border: #8a8e99; + // chatGPT聊天窗AI聊天文字背景 + --ti-lowcode-chat-model-ai-text-bg: #262626; + // chatGPT聊天窗AI聊天文字背景边框 + --ti-lowcode-chat-model-ai-text-border: #262626; + // chatGPT聊天窗AI聊天文字 + --ti-lowcode-chat-model-ai-text: #dfe1e6; + // chatGPT聊天窗AI连接失败文字背景 + --ti-lowcode-chat-model-ai-fail-text-bg: rgba(246, 111, 106, 0.1); + // chatGPT聊天窗AI连接失败文字背景边框 + --ti-lowcode-chat-model-ai-fail-text-border: #f66f6a; + // chatGPT聊天窗AI连接失败文字 + --ti-lowcode-chat-model-ai-fail-text: #dfe1e6; + // chatGPT聊天窗用户聊天文字背景 + --ti-lowcode-chat-model-user-text-bg: #4f77ff; + // chatGPT聊天窗用户聊天文字边框 + --ti-lowcode-chat-model-user-text-border: #4f77ff; + // chatGPT聊天窗用户聊天文字 + --ti-lowcode-chat-model-user-text: #ffffff; + // chatGPT聊天窗标题文字 + --ti-lowcode-chat-model-title: #dfe1e6; + // chatGPT聊天窗基础图标 + --ti-lowcode-chat-model-common-icon: #8a887b; + // chatGPT聊天窗输入框背景 + --ti-lowcode-chat-model-input-bg: #1e1e1e; + // chatGPT聊天窗发送按钮背景 + --ti-lowcode-chat-model-button-bg: #2f2f2f; + // chatGPT聊天窗发送按钮边框 + --ti-lowcode-chat-model-button-border: #8a8e99; + // chatGPT聊天窗发送按钮文字 + --ti-lowcode-chat-model-button-text: #dfe1e6; + + // chatGPT加载 + --ti-lowcode-chat-loading-svg-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-chat-loading-text-color: #fff; +} + +.chat-model-popover { + --ti-lowcode-chat-model-popover-bg: #262626; + --ti-lowcode-chat-model-popover-color: #adb0b8; + --ti-lowcode-chat-model-popover-active-bg: #2f2f2f; + --ti-lowcode-chat-model-popover-active-color: #adb0b8; +} diff --git a/dl-flow-frontend/packages/theme/dark/help.less b/dl-flow-frontend/packages/theme/dark/help.less new file mode 100644 index 0000000..e3457c2 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/help.less @@ -0,0 +1,15 @@ +.shepherd-modal-overlay-container, +.tiny-guide { + --ti-lowcode-help-guide-content-text-color: var(--ti-lowcode-base-text-color-4); + --ti-lowcode-help-guide-title-text-color: var(--ti-lowcode-base-text-color-4); + --ti-lowcode-help-guide-progress-style-text-color: var(--ti-lowcode-base-text-color-4); + --ti-lowcode-help-guide-mask-bg-color: var(--ti-lowcode-base-bg-3); +} +.help-plugin-box { + --ti-lowcode-help-box-bg-color: #3c3c3c; + --ti-lowcode-help-box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.5); + --ti-lowcode-help-box-title-text-color: #ffffff; + --ti-lowcode-help-box-item-text-color: #adb0b8; + --ti-lowcode-help-box-question-border-top: rgba(255, 255, 255, 0.1); + --ti-lowcode-help-box-question-item-text-color: #4f77ff; +} diff --git a/dl-flow-frontend/packages/theme/dark/i18n.less b/dl-flow-frontend/packages/theme/dark/i18n.less new file mode 100644 index 0000000..c6a7258 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/i18n.less @@ -0,0 +1,8 @@ +:root { + // 国际化表格操作图标颜色 + --ti-lowcode-i18n-operate-svg-color: var(--ti-lowcode-base-text-color); + // 国际化表格加载中字体颜色 + --ti-lowcode-i18n-loading-text-color: #d9d9d9; + // 国际化表格加载中图标颜色 + --ti-lowcode-i18n-loading-svg-color: #d9d9d9; +} diff --git a/dl-flow-frontend/packages/theme/dark/index.less b/dl-flow-frontend/packages/theme/dark/index.less new file mode 100644 index 0000000..3ee1f92 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/index.less @@ -0,0 +1,38 @@ +@import '../common/base.less'; +@import '../common/global.less'; +@import './base.less'; +@import './scrollbar.less'; +// 主题配置优先于公共配置 +@import './variable.less'; +@import './block.less'; +@import './life-cycles.less'; +@import './tutorial.less'; +@import './help.less'; +@import './settings.less'; +@import './metaComponent.less'; +@import './button.less'; +@import './tiny-collapse.less'; +@import './tiny-modal.less'; +@import './tiny-tabs.less'; +@import './tiny-search.less'; +@import './tiny-grid.less'; +@import './events.less'; +@import './radio.less'; +@import './i18n.less'; +@import './pageManage.less'; +@import './materials.less'; +@import './tree.less'; +@import './canvas.less'; +@import './tiny-dialog-box.less'; +@import './tiny-input.less'; +@import './tiny-switch.less'; +@import './tiny-search.less'; +@import './tiny-numeric.less'; +@import './tiny-checkbox.less'; +@import './tiny-notify.less'; +@import './bridge.less'; +@import './toolbar.less'; +@import './datasource.less'; +@import './plugin-js.less'; +@import './gpt-dialog.less'; +@import './setting-style'; diff --git a/dl-flow-frontend/packages/theme/dark/life-cycles.less b/dl-flow-frontend/packages/theme/dark/life-cycles.less new file mode 100644 index 0000000..69a2bce --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/life-cycles.less @@ -0,0 +1,7 @@ +:root { + // 生命周期 + --ti-lowcode-life-cycle-alert-color: #fff; + --ti-lowcode-life-cycle-item-hover-bg: #202020; + --ti-lowcode-life-cycle-item-disable-color: #9d9d9d; + --ti-lowcode-life-cycle-editor-border: var(--ti-lowcode-base-default-button-border-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/materials.less b/dl-flow-frontend/packages/theme/dark/materials.less new file mode 100644 index 0000000..971e385 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/materials.less @@ -0,0 +1,30 @@ +:root { + // 带边框的图标按钮边框颜色 + --ti-lowcode-materials-border-icon-border-color: transparent; + // 带边框的图标按钮图标颜色 + --ti-lowcode-materials-border-icon-svg-color: #d9d9d9; + // 带边框的图标按钮悬浮边框颜色 + --ti-lowcode-materials-border-icon-border-color-hover: transparent; + // 带边框的图标按钮背景颜色 + --ti-lowcode-materials-border-icon-bg-color: #202020; + // 区块分组下拉选项下边框颜色 + --ti-lowcode-materials-block-group-item-border-color: var(--ti-lowcode-common-primary-color); + // 添加区块筛选模块字体颜色 + --ti-lowcode-materials-block-filter-text-color: var(--ti-lowcode-common-secondary-text-color); + // 添加区块筛选模块选中字体颜色 + --ti-lowcode-materials-block-filter-selected-text-color: var(--ti-lowcode-common-primary-color); + // 添加区块穿梭框面板背景颜色 + --ti-lowcode-materials-block-transfer-bg-color: var(--ti-lowcode-common-component-bg); + // 添加区块穿梭框面板头部字体颜色 + --ti-lowcode-materials-block-transfer-header-text-color: #d9d9d9; + // 添加区块穿梭框面板头部背景颜色 + --ti-lowcode-materials-block-transfer-header-bg-color: var(--ti-lowcode-common-header-bg); + // 区块分组添加区块筛选项 hover 颜色 + --ti-lowcode-materials-block-filter-hover-color: var(--ti-lowcode-common-text-color-2); + // 组件列表 组件名称颜色 + --ti-lowcode-materials-component-list-color: var(--ti-lowcode-toolbar-title-color); + // 删除区块分组气泡弹窗背景色 + --ti-lowcode-materials-block-group-delete-popover-bg-color: var(--ti-lowcode-common-component-hover-bg); + // 删除区块分组气泡弹窗标题色 + --ti-lowcode-materials-block-group-delete-popover-title-color: var(--ti-lowcode-common-secondary-text-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/metaComponent.less b/dl-flow-frontend/packages/theme/dark/metaComponent.less new file mode 100644 index 0000000..cea6734 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/metaComponent.less @@ -0,0 +1,65 @@ +:root { + // MetaListItem + --ti-lowcode-meta-list-item-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-meta-list-item-border-color: transparent; + + --ti-lowcode-meta-list-top-color: var(--ti-lowcode-base-text-color-1); + // MetaJsSlot + --lowcode-meta-js-slot-color: var(--ti-lowcode-base-text-color-1); + + // MetaCodeEditor + --ti-lowcode-meta-codeEditor-color: #d9d9d9; + --ti-lowcode-meta-codeEditor-border-color: var(--ti-lowcode-button-default-border-color); + --ti-lowcode-meta-codeEditor-hover-color: #fff; + --ti-lowcode-meta-codeEditor-border-hover-color: #6b6b6b; +} + +// config-item label popover tips +.prop-label-tips-container { + --ti-lowcode-meta-config-item-label-tips-desc-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-meta-config-item-label-tips-title-color: #fff; +} + +// configItem +.properties-item { + --ti-lowcode-meta-config-item-error-tips-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-meta-config-item-label-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-meta-config-item-bind-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-meta-config-item-bind-bg: var(--ti-lowcode-common-primary-color); + --ti-lowcode-meta-config-item-bind-bg: var(--ti-lowcode-common-primary-color); + --ti-lowcode-meta-config-item-active-bg: #fff; + --ti-lowcode-meta-config-item-link-color: var(--ti-lowcode-description-color); +} + +// MetaBindVariable +.meta-bind-variable-dialog-box { + --ti-lowcode-meta-bind-variable-icon-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-icon-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-content-left-title-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-content-right-title-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-list-wrap-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-meta-bind-variable-content-left-list-border-right-color: var( + --ti-lowcode-base-default-button-border-color + ); + --ti-lowcode-meta-bind-variable-list-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-item-selected-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-bottom-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-meta-bind-variable-top-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-meta-bind-variable-bottom-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-meta-bind-variable-content-left-list-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-item-text-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-header-alert-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-meta-bind-variable-top-color: var(--ti-lowcode-base-text-color); +} + +// MetaCodeEditor +.meta-code-editor-dialog-box { + --ti-lowcode-meta-code-editor-header-tips-container-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-code-editor-header-collapse-icon-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-meta-code-editor-header-collapse-icon-hover-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-meta-code-editor-header-tips-demo-bg-color: var(--ti-lowcode-base-gray-5); + --ti-lowcode-meta-code-editor-header-tips-demo-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-code-editor-source-code-content-border-color: transparent; + --ti-lowcode-meta-code-editor-err-msg-color: var(--ti-lowcode-base-error-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/package.json b/dl-flow-frontend/packages/theme/dark/package.json new file mode 100644 index 0000000..3b0663d --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/package.json @@ -0,0 +1,29 @@ +{ + "name": "@opentiny/tiny-engine-theme-dark", + "version": "1.0.3", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build && rimraf dist/index.js" + }, + "main": "dist/style.css", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/theme/dark" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "devDependencies": { + "rimraf": "^3.0.2", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/theme/dark/pageManage.less b/dl-flow-frontend/packages/theme/dark/pageManage.less new file mode 100644 index 0000000..4311afa --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/pageManage.less @@ -0,0 +1,29 @@ +:root { + --ti-lowcode-page-manage-title-background-text-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-page-manage-tip-background-text-color: var(--ti-lowcode-common-bg-2); + --ti-lowcode-page-manage-tip-text-color: var(--ti-lowcode-common-bg-2); + --ti-lowcode-page-manage-tip-border-color: var(--ti-lowcode-base-gray-70); + --ti-lowcode-page-manage-icon-text-color: var(--ti-lowcode-common-text-color-2); + --ti-lowcode-page-manage-tree-text-background-color: var(--ti-lowcode-common-bg-8); + --ti-lowcode-page-manage-tree-node-background-color: var(--ti-lowcode-common-component-bg); + --ti-lowcode-page-manage-tip-color: var(--ti-lowcode-base-gray-10); + --ti-lowcode-page-manage-input-background-color: var(--ti-lowcode-common-bg-9); + --ti-lowcode-page-manage-input-border-color: var(--ti-lowcode-common-text-color-4); + --ti-lowcode-page-manage-tips-icon-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-page-manage-content-tips-color: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-page-manage-search-border-color: var(--ti-lowcode-common-border-color-2); + --ti-lowcode-page-manage-tree-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-page-manage-page-tree-background-active-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-page-manage-page-tree-background-hover-color: var(--ti-lowcode-common-primary-hover-color); + --ti-lowcode-page-manage-svg-hover-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-page-manage-text-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-page-manage-input-head-text-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-page-manage-btn-text-color: #999; + --ti-lowcode-page-manage-btn-text-color-2: var(--ti-lowcode-common-bg-7); + --ti-lowcode-page-manage-error-color: var(--ti-lowcode-common-error-color); + --ti-lowcode-page-manage-input-group-color: var(--ti-lowcode-common-bg-4); + --ti-lowcode-page-manage-input-group-border-color: var(--ti-lowcode-common-bg-4); + --ti-lowcode-page-manage-input-group-border-right-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-page-manage-input-output-text-color: var(--ti-lowcode-common-text-color-3); + --ti-lowcode-page-manage-input-output-text-bg-color: var(--ti-lowcode-base-blue-6); +} diff --git a/dl-flow-frontend/packages/theme/dark/plugin-js.less b/dl-flow-frontend/packages/theme/dark/plugin-js.less new file mode 100644 index 0000000..c07a1a2 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/plugin-js.less @@ -0,0 +1,7 @@ +// 页面JS 插件面板 +.plugin-page-js-container { + --ti-lowcode-plugin-js-bg: var(--ti-lowcode-common-component-bg); + --ti-lowcode-plugin-js-head-border-bottom-color: var(--ti-lowcode-common-bg-4); + --ti-lowcode-code-edit-content-border-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-plugin-js-help-link-color: var(--ti-lowcode-base-primary-color-2); +} diff --git a/dl-flow-frontend/packages/theme/dark/radio.less b/dl-flow-frontend/packages/theme/dark/radio.less new file mode 100644 index 0000000..50ff79b --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/radio.less @@ -0,0 +1,19 @@ +// 对 tinyvue 主题进行变量覆盖 +#app .tiny-radio[class*='tiny'] { + --ti-radio-bordered-checked-background-color: transparent; + --ti-radio-inner-bg-color: transparent; + --ti-radio-inner-checked-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-radio-bordered-checked-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-radio-bordered-hover-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-radio-inner-checked-hover-bg-color: var(--ti-lowcode-base-blue-5); + --ti-radio-bordered-checked-hover-border-color: var(--ti-lowcode-base-blue-5); + --ti-radio-text-color: var(--ti-lowcode-base-text-color); + --ti-radio-bordered-active-border-color: var(--ti-lowcode-base-primary-color-2); +} + +.tiny-radio-group { + --ti-lowcode-tiny-radio-button-bg: #262626; + --ti-lowcode-tiny-radio-button-checked-bg: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-radio-button-color: #fff; + --ti-lowcode-radio-button-border-color: transparent; +} diff --git a/dl-flow-frontend/packages/theme/dark/scrollbar.less b/dl-flow-frontend/packages/theme/dark/scrollbar.less new file mode 100644 index 0000000..5e56ec2 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/scrollbar.less @@ -0,0 +1,30 @@ +// 1.scrollbar 伪类中,css变量是隔离的,无法向上找到,所以需要在亮色和暗色分别定义一遍 +// 2. tinyvue 也有定义 scrollbar 样式,所以无法定义在 body 下全局生效 +body { + *, + .lowcode-scrollbar, + .lowcode-scrollbar-thin { + &::-webkit-scrollbar { + width: 8px; + } + + &::-webkit-scrollbar-track, + &::-webkit-scrollbar-track-piece, + &::-webkit-scrollbar-corner { + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + + &:hover { + background-color: #c2c2c2; + } + } + } + .lowcode-scrollbar-thin { + &::-webkit-scrollbar { + width: 4px; + } + } +} diff --git a/dl-flow-frontend/packages/theme/dark/setting-style.less b/dl-flow-frontend/packages/theme/dark/setting-style.less new file mode 100644 index 0000000..4080f5d --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/setting-style.less @@ -0,0 +1,7 @@ +:root { + --ti-lowcode-setting-style-input-bg: var(--ti-lowcode-base-blue-6); + --ti-lowcode-setting-style-font-color: var(--ti-lowcode-common-secondary-text-color); // light + --ti-lowcode-setting-style-input-font-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-setting-style-btn-font-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-setting-style-btn-border-color: var(--ti-lowcode-base-blue-6); +} diff --git a/dl-flow-frontend/packages/theme/dark/settings.less b/dl-flow-frontend/packages/theme/dark/settings.less new file mode 100644 index 0000000..6f23ab2 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/settings.less @@ -0,0 +1,44 @@ +// 右侧属性面板 css 变量 +#tiny-right-panel { + --ti-lowcode-setting-panel-bg-color: #2f2f2f; + --ti-lowcode-setting-panel-tabs-item-title-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-setting-panel-tabs-item-title-active-color: #000; + --ti-lowcode-setting-panel-tabs-item-title-hover-color: #fff; + // 插件设置面板左侧边框 + --ti-lowcode-plugin-setting-panel-border-left-color: var(--ti-lowcode-common-component-bg); +} + +// 属性面板-属性-新建区块属性 +.block-new-attr-popover { + --ti-lowcode-attr-popover-menu-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-attr-popover-menu-item-link-item-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-attr-popover-menu-item-link-item-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-attr-popover-menu-item-color: var(--ti-lowcode-base-text-color); +} + +// 属性面板-属性-区块关联属性 icon +.block-link-field { + --ti-lowcode-block-link-field-link-icon-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-block-link-field-link-icon-bg-color: var(--ti-lowcode-base-success-color); +} + +.className-container { + --ti-lowcode-className-selector-container-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-className-selector-container-error-border-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-className-selector-container-error-bg-color: rgba(242, 48, 48, 0.1); + --ti-lowcode-className-selector-error-tips-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-className-selector-container-border-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-className-selector-container-hover-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-className-selector-container-empty-tips-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-className-selector-container-label-bg-color: var(--ti-lowcode-base-blue-6); + --ti-lowcode-className-selector-container-option-btn-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-className-selector-dropdown-list-bg-color: #202020; + --ti-lowcode-className-selector-dropdown-list-item-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-className-selector-dropdown-list-item-active-bg-color: var(--ti-lowcode-base-bg-2); + --ti-lowcode-className-selector-title-color: var(--ti-lowcode-base-text-color); +} + +:root { + --ti-lowcode-className-selector-del-popover-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-className-selector-del-popover-title-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-checkbox.less b/dl-flow-frontend/packages/theme/dark/tiny-checkbox.less new file mode 100644 index 0000000..8e9b9a5 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-checkbox.less @@ -0,0 +1,27 @@ +label.tiny-checkbox[class*='tiny'] { + --ti-checkbox-text-color: var(--ti-lowcode-base-gray-10); + --ti-checkbox-bg-color-checked: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-bg-color-hover-checked: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-border-color-hover-checked: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-border-color-checked: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-border-color-hover: var(--ti-lowcode-base-gray-40); + --ti-checkbox-bg-color-disable: rgba(255, 255, 255, 0.08); + --ti-checkbox-border-color-unchecked-disabled: var(--ti-lowcode-base-gray-40); +} + +label.tiny-checkbox-button[class*='tiny'] { + --ti-checkbox-button-checked-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-button-checked-text-color: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-button-bg-color-hover: #fff; + --ti-checkbox-button-border-color-hover: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-button-hover-text-color: var(--ti-lowcode-base-primary-color-2); + --ti-checkbox-button-disabled-bg-color: rgba(255, 255, 255, 0.08); +} + +label.tiny-checkbox-button:not(.is-disabled).is-checked::after { + border-right-color: var(--ti-lowcode-base-primary-color-2); +} + +label.tiny-checkbox-button:not(.is-disabled).is-checked .tiny-checkbox-button__inner { + --ti-checkbox-shadow-color: var(--ti-lowcode-base-primary-color-2); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-collapse.less b/dl-flow-frontend/packages/theme/dark/tiny-collapse.less new file mode 100644 index 0000000..22f1393 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-collapse.less @@ -0,0 +1,7 @@ +.tiny-collapse { + --ti-lowcode-collapse-item-header-bg-color: #222; + --ti-lowcode-collapse-item-header-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-collapse-item-header-active-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-collapse-item-bg-color: #2f2f2f; + --ti-lowcode-collapse-item-content-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-dialog-box.less b/dl-flow-frontend/packages/theme/dark/tiny-dialog-box.less new file mode 100644 index 0000000..56a010e --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-dialog-box.less @@ -0,0 +1,7 @@ +.tiny-dialog-box__wrapper { + --ti-lowcode-dialog-close-btn-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-dialog-close-btn-hover-color: var(--ti-lowcode-common-primary-text-color); + --ti-lowcode-dialog-box-bg-color: #2f2f2f; + --ti-lowcode-dialog-box-body-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-dialog-header-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-grid.less b/dl-flow-frontend/packages/theme/dark/tiny-grid.less new file mode 100644 index 0000000..73aaeb3 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-grid.less @@ -0,0 +1,24 @@ +.tiny-grid { + --ti-lowcode-tiny-grid-header-color: var(--ti-lowcode-toolbar-breadcrumb-color); + --ti-lowcode-tiny-grid-header-color-bg: var(--ti-lowcode-common-bg-4); + --ti-lowcode-tiny-grid-row-hover-bg: var(--ti-lowcode-common-component-bg); + // 表格checkbox非选中时边框颜色 + --ti-lowcode-tiny-grid-checkbox-border-color: #8a8e99; + // 表格checkbox选中时边框颜色 + --ti-lowcode-tiny-grid-checkbox-checked-border-color: var(--ti-lowcode-common-primary-color); + // 表格checkbox选中时背景颜色 + --ti-lowcode-tiny-grid-checkbox-checked-bg-color: #fff; + // 表格checkbox未选中时图标颜色 + --ti-lowcode-tiny-grid-checkbox-svg-color: #fff; + // 表格radio选中时颜色 + --ti-lowcode-tiny-radio-selected-svg-color: var(--ti-lowcode-common-primary-color); + // ----斑马纹表格---- + // 斑马纹表格单行背景颜色 + --ti-lowcode-stripe-grid-list-n-bg-color: #282828; + // 斑马纹表格双行背景颜色 + --ti-lowcode-stripe-grid-list-2n-bg-color: var(--ti-lowcode-common-component-bg); + // 斑马纹表格鼠标悬浮时背景颜色 + --ti-lowcode-stripe-grid-list-item-hover-bg: var(--ti-lowcode-toolbar-view-hover-bg); + // 斑马纹表格头部字体颜色 + --ti-lowcode-stripe-grid-header-text-color: #d9d9d9; +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-input.less b/dl-flow-frontend/packages/theme/dark/tiny-input.less new file mode 100644 index 0000000..e98eefb --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-input.less @@ -0,0 +1,25 @@ +.tiny-input { + // input 禁用边框色 + --ti-lowcode-input-disabled-border-color: #6b6b6b; + --ti-lowcode-input-disabled-bg-color: #4d4d4d; + --ti-lowcode-input-border-color: transparent; + --ti-lowcode-input-bg-color: #262626; + --ti-lowcode-input-placeholder-color: rgba(138, 142, 153, 0.6); + --ti-lowcode-input-color: #d9d9d9; + // input框focus 获焦时边框颜色 + --ti-lowcode-input-focus-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-input-hover-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-input-error-border-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-input-error-bg-color: rgba(242, 48, 48, 0.1); +} + +.tiny-textarea { + --ti-lowcode-textarea-border-color: #313131; + --ti-lowcode-textarea-hover-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-textarea-input-bg-color: #262626; + --ti-lowcode-textarea-input-color: #fff; +} + +.tiny-form-item__label { + --ti-lowcode-input-label-color: var(--ti-lowcode-base-gray-20); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-modal.less b/dl-flow-frontend/packages/theme/dark/tiny-modal.less new file mode 100644 index 0000000..dd5bfa5 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-modal.less @@ -0,0 +1,10 @@ +// 覆写组件样式 +:root .tiny-modal[class*='tiny'] { + --ti-modal-box-background-color: #2f2f2f; + --ti-modal-header-text-color: var(--ti-lowcode-base-text-color); +} +.tiny-modal { + --ti-lowcode-modal-close-btn-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-modal-close-btn-hover-color: var(--ti-lowcode-common-primary-text-color); + --ti-lowcode-modal-content-color: var(--ti-lowcode-common-secondary-text-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-notify.less b/dl-flow-frontend/packages/theme/dark/tiny-notify.less new file mode 100644 index 0000000..1a99c0d --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-notify.less @@ -0,0 +1,5 @@ +.tiny-notify { + // notify 样式 + --ti-lowcode-notify-close-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-notify-close-hover-color: var(--ti-lowcode-base-gray-80); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-numeric.less b/dl-flow-frontend/packages/theme/dark/tiny-numeric.less new file mode 100644 index 0000000..f2c45e0 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-numeric.less @@ -0,0 +1,11 @@ +div.tiny-numeric { + --ti-numeric-input-normal-bg-color: #262626; + --ti-numeric-input-normal-border-color: var(--ti-lowcode-base-gray-60); + --ti-numeric-input-normal-text-color: var(--ti-lowcode-base-text-color); + --ti-numeric-input-border-color-active: var(--ti-lowcode-base-gray-40); + --ti-numeric-input-normal-active-border-color: var(--ti-lowcode-base-gray-40); + --ti-numeric-input-icon-color-hover: var(--ti-lowcode-base-gray-40); + + --ti-lowcode-tiny-numeric-icon-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-tiny-numeric-icon-hover-color: var(--ti-lowcode-base-gray-40); +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-search.less b/dl-flow-frontend/packages/theme/dark/tiny-search.less new file mode 100644 index 0000000..0356fb7 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-search.less @@ -0,0 +1,23 @@ +#app .tiny-search { + --ti-search-input-border-color: transparent; + --ti-search-input-bg-color: #262626; + --ti-search-line-hover-border-color: #3c3c3c; + --ti-search-input-focus-border-color: #4f77ff; + --ti-search-input-text-color: #d9d9d9; +} + +.tiny-search { + // 搜索框图标颜色 + --ti-lowcode-search-icon-color: #737373; + // 搜索框图标悬浮时颜色 + --ti-lowcode-search-hover-icon-color: #d9d9d9; + // 搜索框hover背景色 + --ti-lowcode-search-hover-bg: #3c3c3c; + + // tinysearch 背景色 + --ti-lowcode-component-search-bg: var(--ti-lowcode-input-bg); + // 搜索框hover背景色 + --ti-lowcode-search-hover-bg: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-search-input-color: #d9d9d9; + --ti-lowcode-search-input-placeholder-color: #757575; +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-switch.less b/dl-flow-frontend/packages/theme/dark/tiny-switch.less new file mode 100644 index 0000000..9025824 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-switch.less @@ -0,0 +1,5 @@ +.tiny-switch { + --ti-lowcode-tiny-switch-bg-color: #c2c2c2; + --ti-lowcode-tiny-switch-checked-bg-color: var(--ti-lowcode-base-blue-6); + --ti-lowcode-tiny-switch-dot-bg: #fff; +} diff --git a/dl-flow-frontend/packages/theme/dark/tiny-tabs.less b/dl-flow-frontend/packages/theme/dark/tiny-tabs.less new file mode 100644 index 0000000..1b68112 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tiny-tabs.less @@ -0,0 +1,5 @@ +#app .tiny-tabs { + --ti-tabs-button-card-item-text-color: #a6a6a6; + --ti-tabs-button-card-item-hover-text-color: #fff; + --ti-tabs-button-card-nav-bg-color: #262626; +} diff --git a/dl-flow-frontend/packages/theme/dark/toolbar.less b/dl-flow-frontend/packages/theme/dark/toolbar.less new file mode 100644 index 0000000..322903a --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/toolbar.less @@ -0,0 +1,14 @@ +.tiny-engine-toolbar { + // 头部工具栏 + --ti-lowcode-toolbar-border-bottom-color: transparent; + --ti-lowcode-toolbar-media-bg: var(--ti-lowcode-common-bg-6); + --ti-lowcode-toolbar-media-setting-border-color: var(--ti-lowcode-common-border-color-2); + --ti-lowcode-toolbar-title-color: #e6e6e6; + --ti-lowcode-toolbar-sub-title-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-toolbar-hover-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-toolbar-view-active-bg: #2f2f2f; + --ti-lowcode-toolbar-popover-bg: var(--ti-lowcode-base-gray-0); + --ti-lowcode-toolbar-active-color: #808080; + --ti-lowcode-toolbar-user-img-border-color: var(--ti-lowcode-base-gray-20); + --ti-lowcode-toolbar-dot-color: var(--ti-lowcode-common-danger-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/tree.less b/dl-flow-frontend/packages/theme/dark/tree.less new file mode 100644 index 0000000..b2d7556 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tree.less @@ -0,0 +1,7 @@ +.outlinebox { + --ti-lowcode-tree-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-tree-icon-color: rgba(138, 142, 153, 0.99); + --ti-lowcode-tree-icon-hover-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-tree-selected-color: var(--ti-lowcode-common-text-color-3); + --ti-lowcode-tree-selected-bg: var(--ti-lowcode-common-primary-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/tutorial.less b/dl-flow-frontend/packages/theme/dark/tutorial.less new file mode 100644 index 0000000..28f063e --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/tutorial.less @@ -0,0 +1,5 @@ +#tiny-engine-left-panel { + --ti-lowcode-tutorial-primary-text-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-tutorial-primary-bg-color: var(--ti-lowcode-base-bg-2); + --ti-lowcode-tutorial-hover-bg-color: var(--ti-lowcode-base-bg); +} diff --git a/dl-flow-frontend/packages/theme/dark/variable.less b/dl-flow-frontend/packages/theme/dark/variable.less new file mode 100644 index 0000000..eaa6505 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/variable.less @@ -0,0 +1,449 @@ +// 暗色主题 +:root { + // 基础配置,前缀为 --base + --base-min-width: 1280px; + + // ------ 主要的公共主题色,前缀为 --ti-lowcode-common ------- + --ti-lowcode-common-primary-color: #4f77ff; + --ti-lowcode-common-primary-hover-color: #3961eb; + --ti-lowcode-common-primary-color-1: #cad6ff; + --ti-lowcode-common-component-bg: #2f2f2f; + --ti-lowcode-common-component-hover-bg: #3c3c3c; + --ti-lowcode-common-layout-bg: #191818; + --ti-lowcode-common-layout-hover-bg: #191919; + --ti-lowcode-common-header-bg: #202020; + --ti-lowcode-common-bg-1: #404040; + --ti-lowcode-common-bg-2: #4d4d4d; + --ti-lowcode-common-bg-3: #2b2b2b; + --ti-lowcode-common-bg-4: #262626; + --ti-lowcode-common-bg-5: #eee; + --ti-lowcode-common-bg-6: #414141; + --ti-lowcode-common-bg-7: #8a8e99; + --ti-lowcode-common-bg-8: #222; + --ti-lowcode-common-bg-9: #292929; + --ti-lowcode-common-hover-bg-1: rgba(255, 255, 255, 0.1); + --ti-lowcode-common-transparent-color: transparent; + --ti-lowcode-common-primary-text-color: #fff; + --ti-lowcode-common-secondary-text-color: #adb0b8; + --ti-lowcode-common-text-title-color: #252b3a; + --ti-lowcode-common-text-color-1: #6a6a6a; + --ti-lowcode-common-text-color-2: #d9d9d9; + --ti-lowcode-common-text-color-3: #fff; + --ti-lowcode-common-text-color-4: #50d4ab; + --ti-lowcode-common-text-color-5: #8a8e99; + --ti-lowcode-common-text-color-6: #575d6c; + --ti-lowcode-common-third-text-color: #ababab; + --ti-lowcode-common-danger-color: #c7000b; + --ti-lowcode-common-border-color-1: #212121; + --ti-lowcode-common-border-color-2: #313131; + --ti-lowcode-common-border-color-3: #606165; + --ti-lowcode-common-border-color-4: #232323; + --ti-lowcode-common-error-color: var(--ti-lowcode-base-error-color); + + --ti-lowcode-info-color: #7693f5; + --ti-lowcode-warning-color: #fa9841; + --ti-lowcode-warning-color-1: #fac20a; + --ti-lowcode-common-empty-color: #9a9a9a; + + // tiny vue 的 css 变量,覆盖掉就好 + + .tiny-form-item { + // 错误背景色 + --ti-form-item-error-bg-color: #433535; + } + + .tiny-grid { + --ti-grid-light-color: var(--ti-lowcode-common-component-bg); + --ti-grid-text-color: var(--ti-lowcode-common-text-color-5); + } + + --ti-lowcode-trigger-color: #adb0b8; + --ti-lowcode-trigger-hover-color: #8a8e99; + --ti-lowcode-input-error-color: var(--ti-lowcode-common-error-color); + --ti-lowcode-input-error-bg: rgba(246, 111, 106, 0.1); + + // ------ 公共组件的主题色,前缀为 --ti-lowcode-component-组件名 ------ + // tinysearch 背景色 + --ti-lowcode-component-search-bg: var(--ti-lowcode-input-bg); + // tinysearch 边框色 + --ti-lowcode-component-input-border-color: transparent; + // svgButton + --ti-lowcode-component-svg-button-color: var(--ti-lowcode-common-text-color-2); + --ti-lowcode-component-svg-button-hover-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-component-svg-button-hover-bg-color: transparent; + --ti-lowcode-component-svg-button-active-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-component-svg-button-hover-bg-color: transparent; + + --ti-lowcode-tabs-active-border-bottom-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-tabs-active-color: var(--ti-lowcode-common-primary-color); + + --ti-lowcode-form-error-tips-color: var(--ti-lowcode-common-error-color); + // 关闭按钮 + --ti-lowcode-component-close-icon-text-color: var(--ti-lowcode-common-third-text-color); // 关闭按钮默认颜色 + // 关闭按钮 hover 颜色 + --ti-lowcode-component-close-icon-text-hover-color: var(--ti-lowcode-common-primary-text-color); + + // 设置面板 + --ti-lowcode-component-setting-panel-label-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-component-setting-panel-icon-color: var(--ti-lowcode-toolbar-breadcrumb-color); + --ti-lowcode-component-setting-panel-label-tips-bg: #f2f5fc; + + // 插件面板 + --ti-lowcode-plugin-panel-title-color: var(--ti-lowcode-dialog-font-color); // 插件面板标题色 + --ti-lowcode-plugin-panel-bg: var(--ti-lowcode-common-component-bg); // 插件面板背景色 + --ti-lowcode-plugin-panel-border-right-color: var(--ti-lowcode-canvas-border-color); // 插件面板右侧边框色 + --ti-lowcode-plugin-panel-header-border-bottom-color: #262626; // 插件面板头部区域底部边框线颜色 + --ti-lowcode-plugin-panel-title-font-weight: 400; // 插件面板标题加粗效果 + + // 插件设置面板 + --ti-lowcode-plugin-setting-panel-bg: var(--ti-lowcode-common-component-bg); // 插件设置面板背景色 + + // ------ 各个模块的主题色,前缀为 --ti-lowcode-模块名 ------- + + --ti-lowcode-design-plugin-color: #8a8e99; + --ti-lowcode-design-toolbar-icon-color: #8a8e99; + --ti-lowcode-nav-panel-border-left-color: transparent; + + // 物料-组件列表 + --ti-lowcode-material-component-list-border-color: var(--ti-lowcode-common-border-color-4); + --ti-lowcode-material-component-list-hover-bg: var(--ti-lowcode-common-component-hover-bg); + + // 页面管理 + --ti-lowcode-page-tree-color: var(--ti-lowcode-common-secondary-text-color); + --ti-lowcode-page-tree-hover-color: var(--ti-lowcode-common-primary-text-color); + + // 画布 canvas + --ti-lowcode-canvas-iframe-scrollbar-track-color: var(--ti-lowcode-canvas-wrap-bg); // iframe 内部滚动条 track 颜色 + // iframe 内部滚动条 滑块 颜色 + --ti-lowcode-canvas-iframe-scrollbar-thumb-color: var(--ti-lowcode-common-component-bg); + + // 数据源 + --ti-lowcode-datasource-list-color: var(--ti-lowcode-toolbar-more-hover-color); + + // 状态管理 + --ti-lowcode-data-list-color: var(--ti-lowcode-toolbar-icon-color); + // 状态管理面板头部的底部边框色 + --ti-lowcode-data-header-border-bottom-color: var(--ti-lowcode-common-bg-4); + // 状态管理示例背景色 + --ti-lowcode-data-example-bg-color: var(--ti-lowcode-common-primary-text-color); + // 状态管理示例文字色 + --ti-lowcode-data-example-color: var(--ti-lowcode-common-text-title-color); + // 添加高级属性文字颜色 + --ti-lowcode-data-advanced-text-color: #dfe1e6; + // 添加高级属性 hover 文字颜色 + --ti-lowcode-data-advanced-text-hover-color: #8a8e99; + + // 状态管理按激活背景色 + --ti-lowcode-data-radio-group-active-bg: var(--ti-lowcode-common-primary-color); + // 状态管理按默认背景色 + --ti-lowcode-data-radio-group-bg: var(--ti-lowcode-common-header-bg); + + // 教程 + --ti-lowcode-tutorial-list-item-color: var(--ti-lowcode-toolbar-breadcrumb-color); + + // 头部工具栏背景色 + --ti-lowcode-toolbar-bg: #404040; + // 头部工具栏选中背景色 + --ti-lowcode-toolbar-active-bg: #212121; + // 头部工具栏边框色 + --ti-lowcode-toolbar-border-color: #333; + // 头部工具栏icon颜色 && 右侧属性面板tabs hover字体颜色 && switch 选中hover圆背景色 + --ti-lowcode-toolbar-icon-color: #fff; + // 头部工具栏icon颜色 + --ti-lowcode-toolbar-icon-active-color: #4f77ff; + // 头部工具栏面包屑背景颜色 + --ti-lowcode-toolbar-breadcrumb-background-color: rgba(0, 179, 54, 0.6); + // 头部工具栏更多more图标颜色 + --ti-lowcode-toolbar-more-color: rgba(217, 217, 217, 0.4); + // 头部工具栏更多more图标hover颜色 + --ti-lowcode-toolbar-more-hover-color: rgba(217, 217, 217, 0.8); + // 头部工具栏面包屑字体颜色 && 右侧属性面板tabs字体颜色 && 右侧属性面板 collapse 头部字体颜色 && switch 选中圆背景色 + --ti-lowcode-toolbar-breadcrumb-color: #d9d9d9; + // 头部工具栏画布大小文本hover背景色 && 头部弹框背景色 && context-menu 背景色 && 大纲树节点hover背景色 && 日期组件背景色 + --ti-lowcode-toolbar-view-hover-bg: #4d4d4d; + // 头部工具栏i18n国际化字体颜色 + --ti-lowcode-toolbar-i18n-color: rgba(255, 255, 255, 0.4); + // 应用发布弹窗图标颜色 + --ti-lowcode-toolbar-publish-icon-color: var(--ti-lowcode-common-primary-text-color); + // 头部左侧logo颜色 + --ti-lowcode-logo-color: #8a8e99; + // 头部左侧logo颜色 + --ti-lowcode-logo-active-color: rgba(255, 255, 255, 0.5); + // 中间画布边框色 + --ti-lowcode-canvas-border-color: #1a1a1a; + // 右侧属性面板tab页签背景色 && 表单校验错误输入框背景色 + --ti-lowcode-tabs-bg: #2b2b2b; + // 右侧属性面板tab页签边框色 && 弹框边框色 && context-menu 边框色 + --ti-lowcode-tabs-border-color: #313131; + // 右侧属性面板tab页签激活状态背景色 && 弹框title背景颜色 + --ti-lowcode-tabs-active-bg: #404040; + // 右侧属性面板折叠面板展开内容边框色 + --ti-lowcode-collapse-active-border-color: #333; + // 中间画布外框容器背景色 && 弹框底部tip背景色 && select 多选下拉选项hover背景色 + --ti-lowcode-canvas-wrap-bg: #5e5e5e; + // 中间画布拖拽宽度按钮背景色 + --ti-lowcode-canvas-handle-bg: #2b2b2b; + // 中间画布拖拽宽度按钮背景色 + --ti-lowcode-canvas-handle-hover-bg: var(--ti-lowcode-common-primary-color); + // 中间画布底部面包屑背景色 && popover 背景颜色 + --ti-lowcode-breadcrumb-bg: #ebebeb; + // 中间画布底部面包屑字体颜色 && popover 字体颜色 + --ti-lowcode-breadcrumb-color: #4d4d4d; + // 中间画布底部面包屑三角箭头颜色 + --ti-lowcode-breadcrumb-icon-color: #858585; + // 弹框遮罩层背景色 + --ti-lowcode-mask-modal-bg: rgba(0, 0, 0, 0.5); + // 引导提示框遮罩层背景色 + --ti-lowcode-guide-mask-bg: rgba(255, 255, 255, 0.5); + // 引导高亮遮罩层背景色 + --ti-lowcode-guide-highlight-mask-bg: rgba(200, 200, 200, 0.2); + // 引导弹框背景色 + --ti-lowcode-guide-dialog-bg: #041320; + // 引导弹框标题,按钮文本字体色 + --ti-lowcode-guide-title-color: #fff; + // 引导弹框描述文本字体色 + --ti-lowcode-guide-message-color: #a7aab2; + + // collapse 折叠面板激活后字体颜色 + --ti-lowcode-collapse-active-color: #ebebeb; + // input 框背景色 + --ti-lowcode-input-bg: #262626; + // switch 圆点 hover 背景色 + --ti-lowcode-switch-after-hover-bg: #6b6b6b; + // switch 圆点 checked 背景色 + --ti-lowcode-switch-after-checked-bg: #d9d9d9; + // -----下拉框相关主题配置----- + // 下拉框聚焦时边框颜色 + --ti-lowcode-select-focus-border-color: var(--ti-lowcode-common-primary-color); + // 下拉框选中标签字体颜色 + --ti-lowcode-select-tags-text-color: #d9d9d9; + // 下拉框选中标签背景颜色 + --ti-lowcode-select-tags-bg-color: #5e5e5e; + // 下拉框suffix图标悬浮颜色 + --ti-lowcode-select-suffix-icon-color-hover: #fff; + // select 下拉框背景色 + --ti-lowcode-dropdown-bg-color: #202020; + // select 下拉面板边框颜色 + --ti-lowcode-dropdown-border-color: #333; + // select 下拉面板选型字体颜色 + --ti-lowcode-dropdown-item-text-color: #d9d9d9; + // select 下拉框选项hover背景色 + --ti-lowcode-dropdown-item-hover-bg-color: var(--ti-lowcode-common-component-bg); + // select 下拉框选项选中背景色 + --ti-lowcode-dropdown-item-selected-bg: var(--ti-lowcode-common-component-hover-bg); + // select 下拉框选项选中字体颜色 + --ti-lowcode-dropdown-item-selected-color: #ebebeb; + // select 下拉框选项hover字体颜色 + --ti-lowcode-dropdown-item-hover-text-color: #ebebeb; + // button info 字体颜色 + --ti-lowcode-button-info-color: #fff; + // button default 背景颜色 + --ti-lowcode-button-default-bg: transparent; + // 按钮hover字体颜色 + --ti-lowcode-button-default-hover-color: #fff; + // 按钮hover背景色 + --ti-lowcode-button-default-hover-bg: #6b6b6b; + --ti-lowcode-button-default-hover-border-color: #6b6b6b; + // info 保存按钮背景色 + --ti-lowcode-button-info-bg: var(--ti-lowcode-common-primary-color); + // info 保存按钮 hover 背景色 + --ti-lowcode-button-info-hover-bg: var(--ti-lowcode-common-primary-hover-color); + // primary 按钮字体颜色 + --ti-lowcode-button-primary-color: #fff; + // 按钮边框颜色 + --ti-lowcode-button-border-color: #333; + + // 组件icon颜色 + --ti-lowcode-component-icon-color: #d9d9d9; + // 组件item hover 背景色 + --ti-lowcode-component-item-hover-bg: #4d4d4d; + // 左侧插件激活背景色 + --ti-lowcode-left-panel-active-bg: #2f2f2f; + // 左侧插件激活边框色 + --ti-lowcode-left-panel-active-border-color: #212121; + // 左侧按钮边框色 + --ti-lowcode-left-button-border-color: #212121; + + // list-item 项背景色 + --ti-lowcode-list-item-bg: #333; + // list-item 项激活背景色 + --ti-lowcode-list-item-active-bg: #404040; + // radio 按钮组激活背景色 + --ti-lowcode-radio-button-active-bg: #2b2b2b; + // grid 布局设置按钮字体颜色 + --ti-lowcode-grid-edit-color: #d9d9d9; + // grid 布局设置按钮背景色 + --ti-lowcode-grid-edit-bg: #5e5e5e; + // tooltip字体颜色 + --ti-lowcode-tooltip-text-color: #999; + // tooltip背景颜色 + --ti-lowcode-tooltip-bg-color: #ebebeb; + // tooltip错误提示背景颜色 + --ti-lowcode-tooltip-error-bg-color: #c92c3f; + + // Fit 字体颜色 + --ti-lowcode-fit-label-color: #ebebeb; + // Fit 背景颜色 + --ti-lowcode-fit-coordinate-bg: #2b2b2b; + // Fit 边框颜色 + --ti-lowcode-fit-coordinate-border-color: #212121; + // Fit 圆点颜色 + --ti-lowcode-fit-coordinate-origin-color: #757575; + // more icon 选中背景色 + --ti-lowcode-more-icon-selected-bg: #2e2e2e; + // main menu 背景色 + --ti-lowcode-main-menu-bg: var(--ti-lowcode-common-component-bg); + --ti-lowcode-main-menu-item-hover-bg: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-main-menu-item-hover-color: var(--ti-lowcode-toolbar-icon-color); + // spacing svg 图标上下颜色 + --ti-lowcode-spacing-tb-color: #4d4d4d; + // spacing svg 图标上下hover颜色 + --ti-lowcode-spacing-tb-hover-color: #5a5a5a; + // spacing svg 图标左右颜色 + --ti-lowcode-spacing-lr-color: #555; + // spacing svg 图标左右hover颜色 + --ti-lowcode-spacing-lr-hover-color: #626262; + // spacing svg 图标边框颜色 + --ti-lowcode-spacing-border-color: #333; + // position direction 字体颜色 + --ti-lowcode-position-direction-color: #ebebeb; + // position direction 弹框显示时字体背景色 + --ti-lowcode-position-direction-bg: #6b6b6b; + // position Relative to 按钮字体颜色 + --ti-lowcode-position-relative-to-color: #ababab; + // position Relative to 按钮边框颜色 + --ti-lowcode-position-relative-to-border-color: #363636; + // position Relative to 按钮背景色 + --ti-lowcode-position-relative-to-bg: #363636; + // position 选中背景色 + --ti-lowcode-position-selected-bg: #2b2b2b; + // icon 图标选择弹框背景色 + --ti-lowcode-icon-popover-bg: #404040; + // icon 图标选择弹框字体颜色 + --ti-lowcode-icon-popover-color: #d9d9d9; + // icon 图标选择弹框hover颜色 + --ti-lowcode-icon-popover-hover-color: #fff; + // 查看区块详情icon颜色 + --ti-lowcode-block-detail-icon-color: #f6eeee; + + // 中间画布底部面包屑hover背景色 + --ti-lowcode-breadcrumb-hover-bg: #fff; + // 弹框中tip提示边框颜色 + --ti-lowcode-dialog-tip-border-color: #d9d9d9; + // 弹框字体颜色 && 左侧面板 title 字体颜色 + --ti-lowcode-dialog-font-color: #ebebeb; + // 输入框icon图标颜色 + --ti-lowcode-input-icon-color: #737373; + // 弹框字体颜色 && 图标颜色 && 输入框 suffix 字体颜色 + --ti-lowcode-text-color: #6a6a6a; + // 右侧optionitem的边框色 + --ti-lowcode-optionitem-border-color: #2b2b2b; + // 右侧optionitem的背景色 + --ti-lowcode-optionitem-background-color: #363636; + //tootip里的input框字体颜色 + --ti-lowcode-tootip-input-color: #fff; + //tootip里的input背景颜色 + --ti-lowcode-tootip-input-background-color: #363636; + //tootip里的input框边框颜色 + --ti-lowcode-tootip-input-border-color: #2b2b2b; + //tootip里的input框箭头颜色 + --ti-lowcode-tootip-arrow-border-color: #404040; + // dialogBox弹框示例框边框色 + --ti-lowcode-dialog-demo-border-color: #5e5e5e; + // 关闭 icon 图标hover背景色 && 输入框后置文本hover背景色 + --ti-lowcode-icon-hover-bg: rgba(255, 255, 255, 0.1); + // 说明提示框警告颜色 + --ti-lowcode-description-warning-color: #facb4b; + // 说明提示框错误颜色 + --ti-lowcode-description-error-color: #ff0000; + // switch checked状态边框色 + --ti-lowcode-switch-checked-border-color: var(--ti-lowcode-common-primary-color); + // 文本链接颜色 + --ti-lowcode-text-link-color: #6bb0ff; + // 大纲树node节点选中背景色 + --ti-lowcode-node-current-bg: var(--ti-lowcode-common-primary-color); + // 大纲树node节点不可拖拽背景色 && 表单校验错误边框色 + --ti-lowcode-node-nodrag-bg: #ea384c; + // 成功状态按钮边框色 + --ti-lowcode-success-border-color: #2ad986; + // 错误提示颜色 + --ti-lowcode-error-tip-color: #de504e; + + // 画布拖拽元素背景色 + --ti-lowcode-drag-ghost-bg: #888; + // 画布拖拽位置线背景色 + --ti-lowcode-ghost-line-bg: #ffb100; + // 描述颜色 + --ti-lowcode-description-color: var(--ti-lowcode-common-text-color-4); + // 更多折叠面板头部hover背景色 + --ti-lowcode-more-collapse-header-hover-color: #5a5a5a; + // 绑定时icon图标颜色 + --ti-lowcode-icon-bind-color: #006cff; + // 创建字体颜色 + --ti-lowcode-create-color: #575d6c; + // 删除按钮hover背景色 && 表单校验错误背景色 + --ti-lowcode-delete-button-hover-bg: #c92c3f; + // input框focus 获焦时边框颜色 + --ti-lowcode-input-focus-border-color: var(--ti-lowcode-common-primary-color); + // 次要描述字体颜色 && 面包屑label 字体颜色 + --ti-lowcode-description-minor-color: #ababab; + // 样式设置 label 字体颜色 + --ti-lowcode-style-setting-label-color: #8bbefa; + // 样式设置 label 背景颜色 + --ti-lowcode-style-setting-label-bg: rgba(76, 152, 241, 0.15); + // 多人协作item项hover背景色 + --ti-lowcode-user-item-hover-bg: rgba(94, 94, 94, 0.8); + // 多人协作人员头像背景色 + --ti-lowcode-user-header-bg: #919191; + // 工具栏提示框字体颜色 + --ti-lowcode-toolbar-popover-color: #363636; + // 工具栏 media 提示框字体颜色 + --ti-lowcode-media-popover-color: #adb0b8; + // 工具栏 media 提示框标题字体颜色 + --ti-lowcode-media-popover-title-color: #fff; + // 工具栏icon禁用颜色 + --ti-lowcode-disabled-color: #757575; + // 状态管理详情收缩摩纳哥编辑器icon颜色 + --ti-lowcode-state-management-screen-icon-color: #fff; + // 状态管理搜索无结果显示颜色 + --ti-lowcode-state-management-query-color: #fff; + + // Popover提示框 + --ti-lowcode-popover-color: var(--ti-lowcode-breadcrumb-color); + --ti-lowcode-popover-bg-color: #191919; + // 自定义类名lowcode弹框背景色 + --ti-lowcode-custom-popover-bg-color: #404040; + // 自定义类名lowcode弹框字体颜色 + --ti-lowcode-custom-popover-text-color: #d9d9d9; + // 自定义类名lowcode弹框边框颜色 + --ti-lowcode-custom-popover-border-color: #313131; + + // 滚动条thumb颜色 + --ti-lowcode-scrollbar-thumb-background-color: rgba(121, 121, 121, 0.4); + // 可点击交互的文字颜色 + --ti-lowcode-common-interaction-text-color: #5e7ce0; + // 数字输入框组件下拉列表文字颜色 + --ti-lowcode-numeric-unit-text-color: var(--ti-lowcode-text-color); + + //左侧插件栏hover背景色 + --ti-plugins-hover-bg-color: #ffffff; + //左侧插件栏hover文字色 + --ti-plugins-hover-text-color: #4d4d4d; + //左侧插件栏hover边框色 + --ti-plugins-hover-border-color: #9e9e9e; + // 表格行间背景色 + --ti-lowcode-new-table-row-sepline-background: #1f1f1f; + + // 查看指引视频 + --ti-lowcode-block-video-tip-color: var(--ti-lowcode-base-primary-color-2); + + // 属性设置、事件设置等列表的背景色 + --ti-lowcode-meta-list-item-border-color: #2b2b2b; + // 属性设置、事件设置等列表的背景色 + --ti-lowcode-meta-list-item-bg-color: #363636; + + // 空数据图标颜色 + --ti-lowcode-empty-icon-color: #fff; + --ti-lowcode-popover-option-popper-border-color: transparent; + --ti-lowcode-toolbar-hover-popper: var(--ti-lowcode-common-primary-text-color); +} diff --git a/dl-flow-frontend/packages/theme/dark/vite.config.js b/dl-flow-frontend/packages/theme/dark/vite.config.js new file mode 100644 index 0000000..f885fc5 --- /dev/null +++ b/dl-flow-frontend/packages/theme/dark/vite.config.js @@ -0,0 +1,27 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { defineConfig } from 'vite' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + publicDir: false, + build: { + lib: { + entry: path.resolve(__dirname, './index.less'), + name: 'theme-dark', + fileName: () => 'index.js', + formats: ['es'] + } + } +}) diff --git a/dl-flow-frontend/packages/theme/light/base.less b/dl-flow-frontend/packages/theme/light/base.less new file mode 100644 index 0000000..89c7d23 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/base.less @@ -0,0 +1,273 @@ +:root { + // 灰阶 + --ti-lowcode-base-gray-0: #fff; + --ti-lowcode-base-gray-5: #fafafa; + --ti-lowcode-base-gray-10: #f5f5f5; + --ti-lowcode-base-gray-20: #ebebeb; + --ti-lowcode-base-gray-30: #dbdbdb; + --ti-lowcode-base-gray-40: #c2c2c2; + --ti-lowcode-base-gray-50: #808080; + --ti-lowcode-base-gray-60: #595959; + --ti-lowcode-base-gray-70: #333; + --ti-lowcode-base-gray-80: #262626; + --ti-lowcode-base-gray-90: #191919; + --ti-lowcode-base-gray-100: #000; + + // expand-red + --ti-lowcode-base-red-1: #ffeae8; + --ti-lowcode-base-red-2: #fccdca; + --ti-lowcode-base-red-3: #faa9a5; + --ti-lowcode-base-red-4: #fa8682; + --ti-lowcode-base-red-5: #f76360; + --ti-lowcode-base-red-6: #f23030; + --ti-lowcode-base-red-7: #cc272a; + --ti-lowcode-base-red-8: #a3171c; + --ti-lowcode-base-red-9: #78080e; + --ti-lowcode-base-red-10: #4d0005; + --ti-lowcode-base-red-11: #a64242; + --ti-lowcode-base-red-12: #d4827f; + --ti-lowcode-base-red-13: #f2c5c2; + + // expand-orange + --ti-lowcode-base-orange-1: #fff5e8; + --ti-lowcode-base-orange-2: #fcdfb8; + --ti-lowcode-base-orange-3: #fcc98b; + --ti-lowcode-base-orange-4: #fcb25c; + --ti-lowcode-base-orange-5: #ff9a2e; + --ti-lowcode-base-orange-6: #ff8800; + --ti-lowcode-base-orange-7: #d96900; + --ti-lowcode-base-orange-8: #a64d00; + --ti-lowcode-base-orange-9: #733400; + --ti-lowcode-base-orange-10: #4d2201; + --ti-lowcode-base-orange-11: #9e6d3f; + --ti-lowcode-base-orange-12: #d6a981; + --ti-lowcode-base-orange-13: #f2d8c2; + + // expand-yellow + --ti-lowcode-base-yellow-1: #fcf9eb; + --ti-lowcode-base-yellow-2: #fcf0c2; + --ti-lowcode-base-yellow-3: #fae396; + --ti-lowcode-base-yellow-4: #f7d56d; + --ti-lowcode-base-yellow-5: #f7c845; + --ti-lowcode-base-yellow-6: #fcbe1e; + --ti-lowcode-base-yellow-7: #d99b0b; + --ti-lowcode-base-yellow-8: #a67711; + --ti-lowcode-base-yellow-9: #7a5202; + --ti-lowcode-base-yellow-10: #4d3200; + --ti-lowcode-base-yellow-11: #9e7e3f; + --ti-lowcode-base-yellow-12: #d4b57f; + --ti-lowcode-base-yellow-13: #e6d3b8; + + // expand-lemon + --ti-lowcode-base-lemon-1: #fcfae8; + --ti-lowcode-base-lemon-2: #fcf6c2; + --ti-lowcode-base-lemon-3: #fcf092; + --ti-lowcode-base-lemon-4: #fae969; + --ti-lowcode-base-lemon-5: #f7e04a; + --ti-lowcode-base-lemon-6: #f7d916; + --ti-lowcode-base-lemon-7: #d9bb16; + --ti-lowcode-base-lemon-8: #a38708; + --ti-lowcode-base-lemon-9: #756002; + --ti-lowcode-base-lemon-10: #4d3d00; + --ti-lowcode-base-lemon-11: #9e8f46; + --ti-lowcode-base-lemon-12: #d6c581; + --ti-lowcode-base-lemon-13: #eddfb2; + + // expand-lime + --ti-lowcode-base-lime-1: #f8fae3; + --ti-lowcode-base-lime-2: #eff5bf; + --ti-lowcode-base-lime-3: #e2ed8e; + --ti-lowcode-base-lime-4: #d5e667; + --ti-lowcode-base-lime-5: #c6de3e; + --ti-lowcode-base-lime-6: #b2d119; + --ti-lowcode-base-lime-7: #95b312; + --ti-lowcode-base-lime-8: #728c0a; + --ti-lowcode-base-lime-9: #576e05; + --ti-lowcode-base-lime-10: #3b4d00; + --ti-lowcode-base-lime-11: #808c46; + --ti-lowcode-base-lime-12: #c1cc7a; + --ti-lowcode-base-lime-13: #3b4d00; + + // expand-kelly + --ti-lowcode-base-kelly-1: #f2fae6; + --ti-lowcode-base-kelly-2: #daf2bb; + --ti-lowcode-base-kelly-3: #b9e683; + --ti-lowcode-base-kelly-4: #9edb58; + --ti-lowcode-base-kelly-5: #7dcc29; + --ti-lowcode-base-kelly-6: #5cb300; + --ti-lowcode-base-kelly-7: #4b9902; + --ti-lowcode-base-kelly-8: #3c8001; + --ti-lowcode-base-kelly-9: #2e6600; + --ti-lowcode-base-kelly-10: #1f4700; + --ti-lowcode-base-kelly-11: #628c38; + --ti-lowcode-base-kelly-12: #a2c777; + --ti-lowcode-base-kelly-13: #d2e6bb; + + // expand-green + --ti-lowcode-base-green-1: #e8fced; + --ti-lowcode-base-green-2: #bbf2c8; + --ti-lowcode-base-green-3: #82e09a; + --ti-lowcode-base-green-4: #51d675; + --ti-lowcode-base-green-5: #25c251; + --ti-lowcode-base-green-6: #00b336; + --ti-lowcode-base-green-7: #029931; + --ti-lowcode-base-green-8: #01802b; + --ti-lowcode-base-green-9: #006624; + --ti-lowcode-base-green-10: #004a1b; + --ti-lowcode-base-green-11: #3d995c; + --ti-lowcode-base-green-12: #77c78f; + --ti-lowcode-base-green-13: #b8e6c7; + + // expand-mint + --ti-lowcode-base-mint-1: #e8fcfa; + --ti-lowcode-base-mint-2: #bff5ef; + --ti-lowcode-base-mint-3: #8be8e0; + --ti-lowcode-base-mint-4: #5dded5; + --ti-lowcode-base-mint-5: #38d6ce; + --ti-lowcode-base-mint-6: #10c7c1; + --ti-lowcode-base-mint-7: #0aaba8; + --ti-lowcode-base-mint-8: #048c8c; + --ti-lowcode-base-mint-9: #046466; + --ti-lowcode-base-mint-10: #004547; + --ti-lowcode-base-mint-11: #3d9996; + --ti-lowcode-base-mint-12: #77c7c2; + --ti-lowcode-base-mint-13: #b8e6e1; + + // expand-sky + --ti-lowcode-base-sky-1: #e8f8fc; + --ti-lowcode-base-sky-2: #c4f2ff; + --ti-lowcode-base-sky-3: #9de4fa; + --ti-lowcode-base-sky-4: #79d8f7; + --ti-lowcode-base-sky-5: #58cbf5; + --ti-lowcode-base-sky-6: #33bcf2; + --ti-lowcode-base-sky-7: #1f9acf; + --ti-lowcode-base-sky-8: #1075a3; + --ti-lowcode-base-sky-9: #065278; + --ti-lowcode-base-sky-10: #00304a; + --ti-lowcode-base-sky-11: #3d7f99; + --ti-lowcode-base-sky-12: #7ab8cc; + --ti-lowcode-base-sky-13: #b6e5f2; + + // expand-blue + --ti-lowcode-base-blue-1: #e3effa; + --ti-lowcode-base-blue-2: #c4e1ff; + --ti-lowcode-base-blue-3: #99c9ff; + --ti-lowcode-base-blue-4: #68abfc; + --ti-lowcode-base-blue-5: #4191fa; + --ti-lowcode-base-blue-6: #1476ff; + --ti-lowcode-base-blue-7: #0f5ed4; + --ti-lowcode-base-blue-8: #0845a6; + --ti-lowcode-base-blue-9: #022e7a; + --ti-lowcode-base-blue-10: #001a4a; + --ti-lowcode-base-blue-11: #3d6899; + --ti-lowcode-base-blue-12: #7fa6d4; + --ti-lowcode-base-blue-13: #b6d4f2; + + // expand-indigo + --ti-lowcode-base-indigo-1: #eee8ff; + --ti-lowcode-base-indigo-2: #ddd7fa; + --ti-lowcode-base-indigo-3: #b19cf7; + --ti-lowcode-base-indigo-4: #957af5; + --ti-lowcode-base-indigo-5: #6e51e0; + --ti-lowcode-base-indigo-6: #512fd6; + --ti-lowcode-base-indigo-7: #391eb0; + --ti-lowcode-base-indigo-8: #27108f; + --ti-lowcode-base-indigo-9: #19056e; + --ti-lowcode-base-indigo-10: #0e004d; + --ti-lowcode-base-indigo-11: #584d99; + --ti-lowcode-base-indigo-12: #847acc; + --ti-lowcode-base-indigo-13: #bbb8e6; + + // expand-purple + --ti-lowcode-base-purple-1: #f5e8ff; + --ti-lowcode-base-purple-2: #e4c5fc; + --ti-lowcode-base-purple-3: #d0a1f7; + --ti-lowcode-base-purple-4: #b878f0; + --ti-lowcode-base-purple-5: #9f53e6; + --ti-lowcode-base-purple-6: #832fd6; + --ti-lowcode-base-purple-7: #641eb0; + --ti-lowcode-base-purple-8: #4c1091; + --ti-lowcode-base-purple-9: #370673; + --ti-lowcode-base-purple-10: #20004d; + --ti-lowcode-base-purple-11: #683d99; + --ti-lowcode-base-purple-12: #a07acc; + --ti-lowcode-base-purple-13: #cbb8e6; + + // expand-pink + --ti-lowcode-base-pink-1: #fce6fb; + --ti-lowcode-base-pink-2: #fcc2f9; + --ti-lowcode-base-pink-3: #f794f2; + --ti-lowcode-base-pink-4: #eb67e6; + --ti-lowcode-base-pink-5: #e841e5; + --ti-lowcode-base-pink-6: #d91ad9; + --ti-lowcode-base-pink-7: #b50fb8; + --ti-lowcode-base-pink-8: #8f0a94; + --ti-lowcode-base-pink-9: #6b0370; + --ti-lowcode-base-pink-10: #47004d; + --ti-lowcode-base-pink-11: #993d99; + --ti-lowcode-base-pink-12: #c97acc; + --ti-lowcode-base-pink-13: #e2b8e6; + + // expand-rose + --ti-lowcode-base-rose-1: #fce6ef; + --ti-lowcode-base-rose-2: #ffc4de; + --ti-lowcode-base-rose-3: #fa9bc9; + --ti-lowcode-base-rose-4: #f56cac; + --ti-lowcode-base-rose-5: #eb4696; + --ti-lowcode-base-rose-6: #e61c81; + --ti-lowcode-base-rose-7: #b50e65; + --ti-lowcode-base-rose-8: #940a54; + --ti-lowcode-base-rose-9: #70033f; + --ti-lowcode-base-rose-10: #4d002b; + --ti-lowcode-base-rose-11: #993d6e; + --ti-lowcode-base-rose-12: #cc7aa6; + --ti-lowcode-base-rose-13: #e6b8d2; + + // 公司品牌色 + --ti-lowcode-base-brand-color: #c7000b; + + // 主色 + --ti-lowcode-base-primary-color-1: #191919; + --ti-lowcode-base-primary-color-2: #1476ff; + + // 背景色 + --ti-lowcode-base-bg: #f5f5f5; + --ti-lowcode-base-bg-1: rgba(0, 0, 0, 0.05); + --ti-lowcode-base-bg-2: #fafafa; + --ti-lowcode-base-bg-3: #191919; + --ti-lowcode-base-bg-4: #595959; + --ti-lowcode-base-bg-5: #fff; + --ti-lowcode-base-bg-6: #5959591a; + + // 文本色 + --ti-lowcode-base-text-color: #191919; + --ti-lowcode-base-text-color-1: #595959; + --ti-lowcode-base-text-color-2: #1476ff; + --ti-lowcode-base-text-color-3: #808080; + --ti-lowcode-base-text-color-4: #c2c2c2; + + // 文本链接色 + --ti-lowcode-base-text-link-color: #191919; + --ti-lowcode-base-text-link-color-1: #595959; + --ti-lowcode-base-text-link-color-2: #c2c2c2; + --ti-lowcode-base-text-link-color-3: #fff; + + // 按钮边框色 + --ti-lowcode-base-secondary-button-border-color: #595959; + --ti-lowcode-base-secondary-button-border-hover-color: #c2c2c2; + --ti-lowcode-base-default-button-border-color: #c2c2c2; + --ti-lowcode-base-default-button-border-hover-color: #191919; + --ti-lowcode-base-default-button-border-disable-color: #dbdbdb; + + // 分割线 + --ti-lowcode-base-split-color-1: rgba(0, 0, 0, 0.08); // 白色背景分割线 + --ti-lowcode-base-split-color-2: rgba(0, 0, 0, 0.15); // 灰色背景分割线 + + // 状态色 + --ti-lowcode-base-error-color: #f23030; + --ti-lowcode-base-warn-color: #ff8800; + --ti-lowcode-base-warn-color-1: #f7d916; + --ti-lowcode-base-success-color: #5cb300; + --ti-lowcode-base-prompt-color: #1476ff; + --ti-lowcode-base-invalidate-color: #ebebeb; +} diff --git a/dl-flow-frontend/packages/theme/light/block.less b/dl-flow-frontend/packages/theme/light/block.less new file mode 100644 index 0000000..9b3afa1 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/block.less @@ -0,0 +1,54 @@ +:root { + // 历史备份列表 + --ti-lowcode-component-block-history-list-item-border-color: var(--ti-lowcode-common-border-color-1); // 组件边框色 + --ti-lowcode-component-block-history-list-item-hover-bg: var( + --ti-lowcode-common-component-hover-bg + ); // 组件 hover 背景 色 + --ti-lowcode-component-block-history-list-item-btn-color: var( + --ti-lowcode-common-secondary-text-color + ); // 预览还原按钮文字色 + --ti-lowcode-component-block-history-list-item-btn-hover-color: var( + --ti-lowcode-common-text-main-color + ); // 预览还原 hover 颜色 + --ti-lowcode-component-block-history-list-item-btn-hover-bg: var(--ti-lowcode-common-hover-bg-1); // 预览还原背景色 + --ti-lowcode-component-block-history-list-item-btn-border-color: var( + --ti-lowcode-common-secondary-text-color + ); // 预览还原边框色 + + // 区块列表 + --ti-lowcode-component-block-list-item-color: var(--ti-lowcode-common-text-main-color); // 区块列表颜色 + --ti-lowcode-component-block-list-shortcut-title-color: var(--ti-lowcode-common-primary-text-color); // 快照标题颜色 + --ti-lowcode-component-block-list-shortcut-bg: var(--ti-lowcode-common-component-bg); // 快照标题颜色 + --ti-lowcode-component-block-list-border-color: var(--ti-lowcode-common-border-color-4); // 快照标题颜色 + --ti-lowcode-component-block-list-item-active-bg: #f5f5f5; // 区块 active 背景色 + --ti-lowcode-component-block-version-list-item-border-color: var(--ti-lowcode-base-gray-20); + --ti-lowcode-component-block-version-list-item-bg: var(--ti-lowcode-base-gray-0); + --ti-lowcode-component-block-version-list-version-bg: #1476ff1a; + --ti-lowcode-component-block-version-list-version-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-component-block-version-list-panel-title-color: var(--ti-lowcode-common-text-title-color); + --ti-lowcode-component-block-version-list-time-color: var(--ti-lowcode-common-text-title-color); + --ti-lowcode-component-block-version-list-desc-color: var(--ti-lowcode-common-text-desc-color); + --ti-lowcode-component-block-version-list-current-version-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-component-block-setting-popover-bg: var(--ti-lowcode-base-gray-0); + --ti-lowcode-component-block-setting-item-hover-bg: var(--ti-lowcode-base-bg-2); + --ti-lowcode-component-block-setting-item-text-color: var(--ti-lowcode-base-text-color); + // 区块管理 - 添加分类 + --ti-lowcode-component-block-list-add-group-btn-bg: transparent; + --ti-lowcode-component-block-list-add-group-btn-border: 1px solid var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-component-block-list-setting-btn-color: var(--ti-lowcode-base-default-button-border-hover-color); + --ti-lowcode-component-block-list-setting-btn-hover-color: var(--ti-lowcode-base-default-button-border-hover-color); + --ti-lowcode-component-block-list-add-group-btn-border-radius: 6px; +} + +.block-setting-content { + --ti-lowcode-block-config-form-item-color: var(--ti-lowcode-base-text-color); +} + +// 区块设置 - 标签 +.block-tag-create { + --ti-lowcode-block-config-tag-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-block-config-tag-bg: var(--ti-lowcode-input-bg); + --ti-lowcode-block-config-tag-hover-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-block-config-tag-hover-bg: #f2f2f2; + --ti-lowcode-block-config-tag-close-color: var(--ti-lowcode-toolbar-icon-color); +} diff --git a/dl-flow-frontend/packages/theme/light/bridge.less b/dl-flow-frontend/packages/theme/light/bridge.less new file mode 100644 index 0000000..2b23ddc --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/bridge.less @@ -0,0 +1,11 @@ +.plugin-panel { + // 资源管理 + --ti-lowcode-bridge-list-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-bridge-list-bg: var(--ti-lowcode-base-gray-10); + --ti-lowcode-birdge-editor-border-color: var(--ti-lowcode-base-gray-20); + --ti-lowcode-birdge-input-label-color: var(--ti-lowcode-base-text-color-1); + + // npm工具类中代码预览的主题 + --ti-lowcode-birdge-code-preview-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-birdge-code-preview-bg-color: #f0f0f0; +} diff --git a/dl-flow-frontend/packages/theme/light/button.less b/dl-flow-frontend/packages/theme/light/button.less new file mode 100644 index 0000000..4d23f22 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/button.less @@ -0,0 +1,36 @@ +button { + // primary 按钮字体颜色 + // --ti-lowcode-button-primary-color: #fff; + --ti-lowcode-button-primary-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-button-primary-border-color: var(--ti-lowcode-base-bg-3); + --ti-lowcode-button-primary-bg-color: var(--ti-lowcode-base-bg-3); + + --ti-lowcode-button-primary-hover-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-button-primary-hover-border-color: var(--ti-lowcode-base-bg-4); + --ti-lowcode-button-primary-hover-bg-color: var(--ti-lowcode-base-bg-4); + + // button info 字体颜色 + --ti-lowcode-button-info-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-button-info-border-color: var(--ti-lowcode-base-bg-3); + --ti-lowcode-button-info-bg-color: var(--ti-lowcode-base-bg-3); + + // info 保存按钮 hover + --ti-lowcode-button-info-hover-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-button-info-hover-border-color: var(--ti-lowcode-base-bg-4); + --ti-lowcode-button-info-hover-bg-color: var(--ti-lowcode-base-bg-4); + + // 默认按钮颜色 + --ti-lowcode-button-default-color: var(--ti-lowcode-base-primary-color-1); // 默认按钮颜色 + --ti-lowcode-button-default-border-color: var(--ti-lowcode-base-secondary-button-border-color); // 默认按钮边框色 + --ti-lowcode-button-default-bg: var(--ti-lowcode-base-gray-0); + + // 按钮hover字体颜色 + --ti-lowcode-button-default-hover-color: var(--ti-lowcode-base-primary-color-1); + --ti-lowcode-button-default-hover-border-color: var(--ti-lowcode-base-secondary-button-border-hover-color); + --ti-lowcode-button-default-hover-bg: var(--ti-lowcode-base-gray-0); + + // 默认按钮禁用颜色 + --ti-lowcode-button-default-disabled-color: var(--ti-lowcode-base-text-color-4); + --ti-lowcode-button-default-disabled-border-color: transparent; + --ti-lowcode-button-default-disabled-bg: var(--ti-lowcode-base-bg-1); +} diff --git a/dl-flow-frontend/packages/theme/light/canvas.less b/dl-flow-frontend/packages/theme/light/canvas.less new file mode 100644 index 0000000..35e3824 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/canvas.less @@ -0,0 +1,25 @@ +#canvas-wrap { + --ti-lowcode-canvas-rect-border-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-canvas-hover-line-in-bg-color: rgba(0, 255, 0, 0.1); + --ti-lowcode-canvas-hover-line-forbid-bg-color: rgb(255, 66, 77); + --ti-lowcode-canvas-choose-slot-border-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-canvas-choose-slot-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-canvas-corner-mark-left-color: var(--ti-lowcode-base-text-color-2); + --ti-lowcode-canvas-corner-mark-bottom-right-color: var(--ti-lowcode-base-text-color-3); + --ti-lowcode-canvas-corner-mark-bottom-right-border-color: #c2c2c2; + --ti-lowcode-canvas-corner-mark-bottom-right-bg-color: #f5f5f5; + --ti-lowcode-canvas-corner-mark-right-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-canvas-corner-mark-right-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-canvas-select-corner-mark-left-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-canvas-select-corner-mark-left-bg-color: var(--ti-lowcode-base-primary-color-2); + + --ti-lowcode-canvas-footer-border-top-color: var(--ti-lowcode-common-border-color-4); // canvas 底部面包屑 边框色 + --ti-lowcode-canvas-tab-handle-bg: var(--ti-lowcode-common-secondary-text-color); // canvas 宽度拖动手柄 背景色 + --ti-lowcode-canvas-tab-handle-hover-bg: var(--ti-lowcode-common-primary-color); // canvas 宽度拖动手柄 hover 背景色 + --ti-lowcode-canvas-tab-handle-color: var(--ti-lowcode-common-text-color-2); // canvas 宽度拖动手柄 两条竖线颜色 + --ti-lowcode-canvas-menu-bg: var(--ti-lowcode-common-component-bg); // canvas 右键菜单背景 + --ti-lowcode-canvas-menu-item-color: var(--ti-lowcode-base-gray-90); // 右键菜单文字颜色 + --ti-lowcode-canvas-menu-item-hover-bg-color: #f5f5f5; + --ti-lowcode-canvas-menu-border-color: #ddd; + --ti-lowcode-canvas-menu-item-disabled-color: var(--ti-lowcode-base-text-color-4); +} diff --git a/dl-flow-frontend/packages/theme/light/datasource.less b/dl-flow-frontend/packages/theme/light/datasource.less new file mode 100644 index 0000000..a8d7178 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/datasource.less @@ -0,0 +1,44 @@ +:root { + --ti-lowcode-datasource-toolbar-icon-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-datasource-tabs-border-color: var(--ti-lowcode-base-gray-30); + --ti-lowcode-datasource-toolbar-breadcrumb-color: var(--ti-lowcode-base-gray-80); + --ti-lowcode-datasource-json-border-colorr: var(--ti-lowcode-common-primary-color); + --ti-lowcode-datasource-tree-border-color: var(--ti-lowcode-base-success-color); + --ti-lowcode-datasource-common-primary-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-datasource-success-border-color: var(--ti-lowcode-base-success-color); + --ti-lowcode-datasource-input-icon-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-datasource-dialog-demo-border-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-datasource-canvas-wrap-bg: var(--ti-lowcode-base-default-button-border-disable-color); + --ti-lowcode-datasource-dialog-font-color: var(--ti-lowcode-base-gray-70); + --ti-lowcode-datasource-toolbar-bg: var(--ti-lowcode-base-bg-2); + --ti-lowcode-datasource-description-error-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-datasource-common-text-main-color: var(--ti-lowcode-common-text-main-color); + --ti-lowcode-datasource-toolbar-more-hover-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-datasource-delete-button-hover-bg: var(--ti-lowcode-base-red-6); + --ti-lowcode-datasource-common-text-color-5: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-datasource-common-empty-color: var(--ti-lowcode-common-empty-color); + --ti-lowcode-datasource-toolbar-view-hover-bg: var(--ti-lowcode-base-invalidate-color); + --ti-lowcode-datasource-common-hover-bg-1: var(--ti-lowcode-common-hover-bg-1); + --ti-lowcode-datasource-common-primary-text-color: var(--ti-lowcode-common-primary-text-color); + --ti-lowcode-datasource-icon-hover-bg: var(--ti-lowcode-base-invalidate-color); + --ti-lowcode-datasource-tabs-bg: var(--ti-lowcode-base-gray-20); + --ti-lowcode-datasource-canvas-handle-hover-bg: var(--ti-lowcode-base-blue-6); + --ti-lowcode-datasource-tabs-active-bg: var(--ti-lowcode-base-gray-20); + --ti-lowcode-datasource-common-error-color: var(--ti-lowcode-common-error-color); + --ti-lowcode-datasource-description-minor-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-datasource-description-warning-color: var(--ti-lowcode-base-orange-6); + --ti-lowcode-datasource-error-tip-color: var(--ti-lowcode-base-red-6); + --ti-lowcode-datasource-label-color: var(--ti-lowcode-base-gray-60); // light + --ti-lowcode-datasource-list-hover-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-datasource-btn-click-color: var(--ti-lowcode-base-default-button-border-hover-color); + --ti-lowcode-datasource-tabs-bottom-border-color: var(--ti-lowcode-base-default-button-border-hover-color); + --ti-lowcode-datasource-list-bottom-border-color: var(--ti-lowcode-base-invalidate-color); + --ti-lowcode-datasource-switch-off-bg-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-datasource-switch-on-bg-color: var(--ti-lowcode-base-blue-6); + --ti-lowcode-datasource-modal-text-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-datasource-respones-select-color-bg: var(--ti-lowcode-base-text-link-color-3); + --ti-lowcode-datasource-respones-color-bg: var(--ti-lowcode-base-blue-6); + --ti-lowcode-datasource-respones-border-color-bg: var(--ti-lowcode-base-text-link-color-3); + --ti-lowcode-datasource-select-border-right-color-bg: var(--ti-lowcode-base-default-button-border-disable-color); + --ti-lowcode-datasource-select-border-color: var(--ti-lowcode-common-secondary-text-color); +} diff --git a/dl-flow-frontend/packages/theme/light/events.less b/dl-flow-frontend/packages/theme/light/events.less new file mode 100644 index 0000000..9191a75 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/events.less @@ -0,0 +1,38 @@ +.setting-advanced-add-custom-event-tip { + --ti-lowcode-events-add-custom-event-tips-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-event-add-custom-event-tips-highlight-color: var(--ti-lowcode-base-warn-color); +} + +.setting-advanced-bind-event-list { + --ti-lowcode-events-bind-event-list-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-events-bind-event-list-item-disabled-color: var(--ti-lowcode-base-text-color-4); + --lowcode-events-bind-event-list-item-hover-bg-color: var(--ti-lowcode-base-bg-1); +} + +.bind-action-list { + --ti-lowcode-events-bind-action-item-border-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-events-event-bind-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-events-bind-action-item-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-events-bind-action-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-events-bind-action-item-linked-bg-color: var(--ti-lowcode-base-success-color); + --ti-lowcode-events-bind-action-item-linked-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-events-empty-action-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-events-empty-action-tips-strong-color: var(--ti-lowcode-base-warn-color); +} + +.advanced-config-container { + --ti-lowcode-events-advanced-config-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-events-advanced-label-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-events-advanced-binding-state-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-events-advanced-binding-state-color: var(--ti-lowcode-base-gray-0); +} + +.bind-event-dialog-content { + --ti-lowcode-bind-event-dialog-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-bind-event-dialog-content-left-border-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-bind-event-dialog-content-right-monaco-border-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-bind-event-dialog-content-left-list-item-active-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-bind-event-dialog-new-action-tip-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-bind-event-dialog-action-selected-icon-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-bind-event-dialog-mark-bg-color: var(--ti-lowcode-base-bg-1); +} diff --git a/dl-flow-frontend/packages/theme/light/gpt-dialog.less b/dl-flow-frontend/packages/theme/light/gpt-dialog.less new file mode 100644 index 0000000..5a45c34 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/gpt-dialog.less @@ -0,0 +1,51 @@ +.bind-chatgpt { + // chatGPT聊天窗问题模板文字颜色 + --ti-lowcode-chat-model-text: #191919; + // chatGPT聊天窗问题模板文字边框颜色 + --ti-lowcode-chat-model-text-border: #cbcbcb; + // chatGPT聊天窗提问框图标 + --ti-lowcode-chat-model-input-icon: #999999; + // chatGPT聊天窗用户头像边框色 + --ti-lowcode-chat-model-avatar-border: #dfe1e6; + // chatGPT聊天窗AI聊天文字背景 + --ti-lowcode-chat-model-ai-text-bg: #1476ff; + // chatGPT聊天窗AI聊天文字背景边框 + --ti-lowcode-chat-model-ai-text-border: #1476ff; + // chatGPT聊天窗AI聊天文字 + --ti-lowcode-chat-model-ai-text: #ffffff; + // chatGPT聊天窗AI连接失败文字背景 + --ti-lowcode-chat-model-ai-fail-text-bg: #feeaeb; + // chatGPT聊天窗AI连接失败文字背景边框 + --ti-lowcode-chat-model-ai-fail-text-border: #dc544f; + // chatGPT聊天窗AI连接失败文字 + --ti-lowcode-chat-model-ai-fail-text: #191919; + // chatGPT聊天窗用户聊天文字背景 + --ti-lowcode-chat-model-user-text-bg: #fafafa; + // chatGPT聊天窗用户聊天文字边框 + --ti-lowcode-chat-model-user-text-border: #dbdbdb; + // chatGPT聊天窗用户聊天文字 + --ti-lowcode-chat-model-user-text: #191919; + // chatGPT聊天窗标题文字 + --ti-lowcode-chat-model-title: #333333; + // chatGPT聊天窗基础图标 + --ti-lowcode-chat-model-common-icon: #8a887b; + // chatGPT聊天窗输入框背景 + --ti-lowcode-chat-model-input-bg: #eeeeee; + // chatGPT聊天窗发送按钮背景 + --ti-lowcode-chat-model-button-bg: #1476ff; + // chatGPT聊天窗发送按钮边框 + --ti-lowcode-chat-model-button-border: #1476ff; + // chatGPT聊天窗发送按钮文字 + --ti-lowcode-chat-model-button-text: #ffffff; + + // chatGPT加载 + --ti-lowcode-chat-loading-svg-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-chat-loading-text-color: #595959; +} + +.chat-model-popover { + --ti-lowcode-chat-model-popover-bg: #fff; + --ti-lowcode-chat-model-popover-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-chat-model-popover-active-bg: #fff; + --ti-lowcode-chat-model-popover-active-color: var(--ti-lowcode-base-text-color-2); +} diff --git a/dl-flow-frontend/packages/theme/light/help.less b/dl-flow-frontend/packages/theme/light/help.less new file mode 100644 index 0000000..e53a7e3 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/help.less @@ -0,0 +1,15 @@ +.shepherd-modal-overlay-container, +.tiny-guide { + --ti-lowcode-help-guide-content-text-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-help-guide-title-text-color: var(--ti-lowcode-base-primary-color-1); + --ti-lowcode-help-guide-progress-style-text-color: var(--ti-lowcode-base-primary-color-1); + --ti-lowcode-help-guide-mask-bg-color: inherit; +} +.help-plugin-box { + --ti-lowcode-help-box-bg-color: #ffffff; + --ti-lowcode-help-box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.2); + --ti-lowcode-help-box-title-text-color: #191919; + --ti-lowcode-help-box-item-text-color: #191919; + --ti-lowcode-help-box-question-border-top: #ebebeb; + --ti-lowcode-help-box-question-item-text-color: #1476ff; +} diff --git a/dl-flow-frontend/packages/theme/light/i18n.less b/dl-flow-frontend/packages/theme/light/i18n.less new file mode 100644 index 0000000..6b8db46 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/i18n.less @@ -0,0 +1,8 @@ +:root { + // 国际化表格操作图标颜色 + --ti-lowcode-i18n-operate-svg-color: var(--ti-lowcode-base-text-color); + // 国际化表格加载中字体颜色 + --ti-lowcode-i18n-loading-text-color: #999999; + // 国际化表格加载中图标颜色 + --ti-lowcode-i18n-loading-svg-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/light/index.less b/dl-flow-frontend/packages/theme/light/index.less new file mode 100644 index 0000000..759f817 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/index.less @@ -0,0 +1,36 @@ +@import '../common/base.less'; +@import '../common/global.less'; +@import './base.less'; +@import './scrollbar.less'; +// 主题配置优先于公共配置 +@import './variable.less'; +@import './tutorial.less'; +@import './help.less'; +@import './block.less'; +@import './life-cycles.less'; +@import './settings.less'; +@import './metaComponent.less'; +@import './button.less'; +@import './tiny-collapse.less'; +@import './tiny-modal.less'; +@import './tiny-search.less'; +@import './tiny-grid.less'; +@import './events.less'; +@import './radio.less'; +@import './i18n.less'; +@import './pageManage.less'; +@import './materials.less'; +@import './tree.less'; +@import './canvas.less'; +@import './tiny-dialog-box.less'; +@import './tiny-input.less'; +@import './tiny-switch.less'; +@import './tiny-search.less'; +@import './tiny-numeric.less'; +@import './tiny-notify.less'; +@import './bridge.less'; +@import './toolbar.less'; +@import './datasource.less'; +@import './plugin-js.less'; +@import './gpt-dialog.less'; +@import './setting-style'; diff --git a/dl-flow-frontend/packages/theme/light/life-cycles.less b/dl-flow-frontend/packages/theme/light/life-cycles.less new file mode 100644 index 0000000..ff5e86f --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/life-cycles.less @@ -0,0 +1,7 @@ +:root { + // 生命周期 + --ti-lowcode-life-cycle-alert-color: inherit; + --ti-lowcode-life-cycle-item-hover-bg: var(--ti-lowcode-common-hover-bg-1); + --ti-lowcode-life-cycle-item-disable-color: var(--ti-lowcode-base-text-link-color-2); + --ti-lowcode-life-cycle-editor-border: var(--ti-lowcode-base-default-button-border-color); +} diff --git a/dl-flow-frontend/packages/theme/light/materials.less b/dl-flow-frontend/packages/theme/light/materials.less new file mode 100644 index 0000000..eb46f29 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/materials.less @@ -0,0 +1,30 @@ +:root { + // 带边框的图标按钮边框颜色 + --ti-lowcode-materials-border-icon-border-color: var(--ti-lowcode-base-default-button-border-color); + // 带边框的图标按钮图标颜色 + --ti-lowcode-materials-border-icon-svg-color: var(--ti-lowcode-base-text-color); + // 带边框的图标按钮悬浮边框颜色 + --ti-lowcode-materials-border-icon-border-color-hover: var(--ti-lowcode-base-default-button-border-hover-color); + // 带边框的图标按钮背景颜色 + --ti-lowcode-materials-border-icon-bg-color: var(--ti-lowcode-base-bg-5); + // 区块分组下拉选项下边框颜色 + --ti-lowcode-materials-block-group-item-border-color: var(--ti-lowcode-common-primary-text-color); + // 添加区块筛选模块字体颜色 + --ti-lowcode-materials-block-filter-text-color: var(--ti-lowcode-common-primary-text-color); + // 添加区块穿梭框面板背景颜色 + --ti-lowcode-materials-block-transfer-bg-color: var(--ti-lowcode-common-component-bg); + // 添加区块穿梭框面板头部字体颜色 + --ti-lowcode-materials-block-transfer-header-text-color: var(--ti-lowcode-common-primary-text-color); + // 添加区块筛选模块选中字体颜色 + --ti-lowcode-materials-block-filter-selected-text-color: var(--ti-lowcode-common-primary-text-color); + // 添加区块穿梭框面板头部背景颜色 + --ti-lowcode-materials-block-transfer-header-bg-color: var(--ti-lowcode-base-bg); + // 区块分组添加区块筛选项 hover 颜色 + --ti-lowcode-materials-block-filter-hover-color: var(--ti-lowcode-common-primary-text-color); + // 组件列表 组件名称颜色 + --ti-lowcode-materials-component-list-color: var(--ti-lowcode-common-text-main-color); + // 删除区块分组气泡弹窗背景色 + --ti-lowcode-materials-block-group-delete-popover-bg-color: var(--ti-lowcode-common-component-bg); + // 删除区块分组气泡弹窗标题色 + --ti-lowcode-materials-block-group-delete-popover-title-color: var(--ti-lowcode-common-text-title-color); +} diff --git a/dl-flow-frontend/packages/theme/light/metaComponent.less b/dl-flow-frontend/packages/theme/light/metaComponent.less new file mode 100644 index 0000000..0ad943a --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/metaComponent.less @@ -0,0 +1,65 @@ +:root { + // MetaListItem + --ti-lowcode-meta-list-item-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-meta-list-item-border-color: rgba(0, 0, 0, 0.08); + // + --ti-lowcode-meta-list-top-color: var(--ti-lowcode-base-text-color-1); + // MetaJsSlot + --lowcode-meta-js-slot-color: var(--ti-lowcode-base-text-color-1); + + // MetaCodeEditor + --ti-lowcode-meta-codeEditor-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-codeEditor-border-color: var(--ti-lowcode-base-secondary-button-border-color); + --ti-lowcode-meta-codeEditor-hover-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-codeEditor-border-hover-color: var(--ti-lowcode-base-secondary-button-border-hover-color); +} + +// config-item label popover tips +.prop-label-tips-container { + --ti-lowcode-meta-config-item-label-tips-desc-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-meta-config-item-label-tips-title-color: var(--ti-lowcode-base-text-color); +} + +// configItem +.properties-item { + --ti-lowcode-meta-config-item-error-tips-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-meta-config-item-label-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-config-item-bind-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-meta-config-item-bind-bg: var(--ti-lowcode-base-primary-color-2); + + --ti-lowcode-meta-config-item-active-bg: var(--ti-lowcode-common-hover-bg-1); + --ti-lowcode-meta-config-item-link-color: var(--ti-lowcode-base-text-color-2); +} + +// MetaBindVariable +.meta-bind-variable-dialog-box { + --ti-lowcode-meta-bind-variable-icon-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-icon-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-content-left-title-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-content-right-title-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-list-wrap-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-meta-bind-variable-content-left-list-border-right-color: var( + --ti-lowcode-base-default-button-border-color + ); + --ti-lowcode-meta-bind-variable-list-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-item-selected-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-meta-bind-variable-bottom-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-meta-bind-variable-top-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-meta-bind-variable-bottom-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-meta-bind-variable-content-left-list-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-item-text-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-header-alert-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-bind-variable-top-color: var(--ti-lowcode-base-text-color); +} + +// MetaCodeEditor +.meta-code-editor-dialog-box { + --ti-lowcode-meta-code-editor-header-tips-container-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-code-editor-header-collapse-icon-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-meta-code-editor-header-collapse-icon-hover-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-meta-code-editor-header-tips-demo-bg-color: var(--ti-lowcode-base-gray-5); + --ti-lowcode-meta-code-editor-header-tips-demo-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-meta-code-editor-source-code-content-border-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-meta-code-editor-err-msg-color: var(--ti-lowcode-base-error-color); +} diff --git a/dl-flow-frontend/packages/theme/light/package.json b/dl-flow-frontend/packages/theme/light/package.json new file mode 100644 index 0000000..74adbb8 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/package.json @@ -0,0 +1,29 @@ +{ + "name": "@opentiny/tiny-engine-theme-light", + "version": "1.0.4", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build && rimraf dist/index.js" + }, + "main": "dist/style.css", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/theme/light" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "devDependencies": { + "rimraf": "^3.0.2", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/theme/light/pageManage.less b/dl-flow-frontend/packages/theme/light/pageManage.less new file mode 100644 index 0000000..e9caec3 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/pageManage.less @@ -0,0 +1,26 @@ +:root { + --ti-lowcode-page-manage-title-background-text-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-page-manage-tip-border-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-page-manage-tree-text-background-color: var(--ti-lowcode-common-bg-8); + --ti-lowcode-page-manage-tree-node-background-color: var(--ti-lowcode-common-component-bg); + --ti-lowcode-page-manage-tip-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-page-manage-input-background-color: var(--ti-lowcode-common-bg-9); + --ti-lowcode-page-manage-input-border-color: var(--ti-lowcode-common-text-color-4); + --ti-lowcode-page-manage-tips-icon-color: var(--ti-lowcode-common-primary-color); + --ti-lowcode-page-manage-content-tips-color: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-page-manage-search-border-color: var(--ti-lowcode-base-gray-30); + --ti-lowcode-page-manage-tree-color: var(--ti-lowcode-common-text-main-color); + --ti-lowcode-page-manage-page-tree-background-active-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-page-manage-page-tree-background-hover-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-page-manage-svg-hover-color: var(--ti-lowcode-base-bg-3); + --ti-lowcode-page-manage-text-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-page-manage-input-head-text-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-page-manage-btn-text-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-page-manage-btn-text-color-2: var(--ti-lowcode-common-text-color-5); + --ti-lowcode-page-manage-error-color: var(--ti-lowcode-common-error-color); + --ti-lowcode-page-manage-input-group-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-page-manage-input-group-border-color: var(--ti-lowcode-base-default-button-border-color); + --ti-lowcode-page-manage-input-group-border-right-color: var(--ti-lowcode-common-component-hover-bg); + --ti-lowcode-page-manage-input-output-text-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-page-manage-input-output-text-bg-color: var(--ti-lowcode-base-blue-6); +} diff --git a/dl-flow-frontend/packages/theme/light/plugin-js.less b/dl-flow-frontend/packages/theme/light/plugin-js.less new file mode 100644 index 0000000..ad512cd --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/plugin-js.less @@ -0,0 +1,7 @@ +// 页面JS 插件面板 +.plugin-page-js-container { + --ti-lowcode-plugin-js-bg: var(--ti-lowcode-base-gray-0); + --ti-lowcode-plugin-js-head-border-bottom-color: var(--ti-lowcode-base-split-color-1); + --ti-lowcode-code-edit-content-border-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-plugin-js-help-link-color: var(--ti-lowcode-base-primary-color-2); +} diff --git a/dl-flow-frontend/packages/theme/light/radio.less b/dl-flow-frontend/packages/theme/light/radio.less new file mode 100644 index 0000000..b93c1e4 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/radio.less @@ -0,0 +1,6 @@ +.tiny-radio-group { + --ti-lowcode-tiny-radio-button-bg: var(--ti-lowcode-base-gray-0); + --ti-lowcode-tiny-radio-button-checked-bg: var(--ti-lowcode-base-bg-3); + --ti-lowcode-radio-button-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-radio-button-border-color: var(--ti-lowcode-base-secondary-button-border-color); +} diff --git a/dl-flow-frontend/packages/theme/light/scrollbar.less b/dl-flow-frontend/packages/theme/light/scrollbar.less new file mode 100644 index 0000000..d49cf2e --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/scrollbar.less @@ -0,0 +1,32 @@ +// 1. scrollbar 伪类中,css变量是隔离的,无法向上找到,所以需要在亮色和暗色分别定义一遍 +// 2. tinyvue 也有定义 scrollbar 样式,所以无法定义在 body 下全局生效 +body { + *, + .lowcode-scrollbar, + .lowcode-scrollbar-thin { + &::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + &::-webkit-scrollbar-track, + &::-webkit-scrollbar-track-piece, + &::-webkit-scrollbar-corner { + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + + &:hover { + background-color: #c2c2c2; + } + } + } + .lowcode-scrollbar-thin { + &::-webkit-scrollbar { + width: 4px; + height: 4px; + } + } +} diff --git a/dl-flow-frontend/packages/theme/light/setting-style.less b/dl-flow-frontend/packages/theme/light/setting-style.less new file mode 100644 index 0000000..f046a23 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/setting-style.less @@ -0,0 +1,7 @@ +:root { + --ti-lowcode-setting-style-input-bg: var(--ti-lowcode-base-blue-6); + --ti-lowcode-setting-style-font-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-setting-style-input-font-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-setting-style-btn-font-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-setting-style-btn-border-color: var(--ti-lowcode-base-gray-90); +} diff --git a/dl-flow-frontend/packages/theme/light/settings.less b/dl-flow-frontend/packages/theme/light/settings.less new file mode 100644 index 0000000..49e0756 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/settings.less @@ -0,0 +1,44 @@ +// 右侧属性面板 css 变量 +#tiny-right-panel { + --ti-lowcode-setting-panel-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-setting-panel-tabs-item-title-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-setting-panel-tabs-item-title-active-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-setting-panel-tabs-item-title-hover-color: var(--ti-lowcode-base-text-color); + // 插件设置面板左侧边框 + --ti-lowcode-plugin-setting-panel-border-left-color: var(--ti-lowcode-common-border-color-4); +} + +// 属性面板-属性-区块关联属性-新建区块属性popover +.block-new-attr-popover { + --ti-lowcode-attr-popover-menu-item-hover-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-attr-popover-menu-item-link-item-bg-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-attr-popover-menu-item-link-item-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-attr-popover-menu-item-color: var(--ti-lowcode-base-text-color); +} + +// 属性面板-属性-区块关联属性 icon +.block-link-field { + --ti-lowcode-block-link-field-link-icon-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-block-link-field-link-icon-bg-color: var(--ti-lowcode-base-success-color); +} + +.className-container { + --ti-lowcode-className-selector-container-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-className-selector-container-error-border-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-className-selector-container-error-bg-color: rgba(242, 48, 48, 0.1); + --ti-lowcode-className-selector-error-tips-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-className-selector-container-border-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-className-selector-container-hover-border-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-className-selector-container-empty-tips-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-className-selector-container-label-bg-color: var(--ti-lowcode-base-blue-6); + --ti-lowcode-className-selector-container-option-btn-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-className-selector-dropdown-list-bg-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-className-selector-dropdown-list-item-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-className-selector-dropdown-list-item-active-bg-color: var(--ti-lowcode-base-bg-2); + --ti-lowcode-className-selector-title-color: var(--ti-lowcode-base-text-color); +} + +:root { + --ti-lowcode-className-selector-del-popover-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-className-selector-del-popover-title-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-collapse.less b/dl-flow-frontend/packages/theme/light/tiny-collapse.less new file mode 100644 index 0000000..84df15b --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-collapse.less @@ -0,0 +1,7 @@ +.tiny-collapse { + --ti-lowcode-collapse-item-header-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-collapse-item-header-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-collapse-item-header-active-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-collapse-item-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-collapse-item-content-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-dialog-box.less b/dl-flow-frontend/packages/theme/light/tiny-dialog-box.less new file mode 100644 index 0000000..25f4c18 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-dialog-box.less @@ -0,0 +1,7 @@ +.tiny-dialog-box__wrapper { + --ti-lowcode-dialog-box-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-dialog-close-btn-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-dialog-close-btn-hover-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-dialog-box-body-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-dialog-header-color: var(--ti-lowcode-base-text-color); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-grid.less b/dl-flow-frontend/packages/theme/light/tiny-grid.less new file mode 100644 index 0000000..a6db2b0 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-grid.less @@ -0,0 +1,24 @@ +.tiny-grid { + --ti-lowcode-tiny-grid-header-color: var(--ti-lowcode-toolbar-breadcrumb-color); + --ti-lowcode-tiny-grid-header-color-bg: #f2f2f2; + --ti-lowcode-tiny-grid-row-hover-bg: #f2f5fc; + // 表格checkbox非选中时边框颜色 + --ti-lowcode-tiny-grid-checkbox-border-color: transparent; + // 表格checkbox选中时边框颜色 + --ti-lowcode-tiny-grid-checkbox-checked-border-color: transparent; + // 表格checkbox选中时背景颜色 + --ti-lowcode-tiny-grid-checkbox-checked-bg-color: transparent; + // 表格checkbox未选中时图标颜色 + --ti-lowcode-tiny-grid-checkbox-svg-color: #c2c2c2; + // 表格radio选中时颜色 + --ti-lowcode-tiny-radio-selected-svg-color: var(--ti-lowcode-common-primary-text-color); + // ----斑马纹表格---- + // 斑马纹表格单行背景颜色 + --ti-lowcode-stripe-grid-list-n-bg-color: var(--ti-lowcode-base-bg-5); + // 斑马纹表格双行背景颜色 + --ti-lowcode-stripe-grid-list-2n-bg-color: var(--ti-lowcode-base-bg-5); + // 斑马纹表格鼠标悬浮时背景颜色 + --ti-lowcode-stripe-grid-list-item-hover-bg: var(--ti-lowcode-base-bg); + // 斑马纹表格头部字体颜色 + --ti-lowcode-stripe-grid-header-text-color: #595959; +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-input.less b/dl-flow-frontend/packages/theme/light/tiny-input.less new file mode 100644 index 0000000..4c09843 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-input.less @@ -0,0 +1,24 @@ +.tiny-input { + // input 禁用边框色 + --ti-lowcode-input-disabled-border-color: var(--ti-lowcode-base-gray-30); + --ti-lowcode-input-disabled-bg-color: var(--ti-lowcode-base-bg-1); + --ti-lowcode-input-border-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-input-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-input-placeholder-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-input-color: var(--ti-lowcode-base-text-color); + // input框focus 获焦时边框颜色 + --ti-lowcode-input-focus-border-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-input-hover-border-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-input-error-border-color: var(--ti-lowcode-base-error-color); + --ti-lowcode-input-error-bg-color: rgba(242, 48, 48, 0.1); +} + +.tiny-textarea { + --ti-lowcode-textarea-border-color: var(--ti-lowcode-base-gray-40); + --ti-lowcode-textarea-hover-border-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-textarea-input-bg-color: var(--ti-lowcode-base-gray-0); + --ti-lowcode-textarea-input-color: var(--ti-lowcode-base-text-color); +} +.tiny-form-item__label { + --ti-lowcode-input-label-color: var(--ti-lowcode-base-text-color-1); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-modal.less b/dl-flow-frontend/packages/theme/light/tiny-modal.less new file mode 100644 index 0000000..6b6068c --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-modal.less @@ -0,0 +1,5 @@ +.tiny-modal { + --ti-lowcode-modal-close-btn-color: var(--ti-lowcode-base-text-color-3); + --ti-lowcode-modal-close-btn-hover-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-modal-content-color: var(--ti-lowcode-base-text-color-1); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-notify.less b/dl-flow-frontend/packages/theme/light/tiny-notify.less new file mode 100644 index 0000000..6dbb0f8 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-notify.less @@ -0,0 +1,5 @@ +.tiny-notify { + // notify 样式 + --ti-lowcode-notify-close-color: var(--ti-lowcode-base-gray-50); + --ti-lowcode-notify-close-hover-color: var(--ti-lowcode-base-gray-90); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-numeric.less b/dl-flow-frontend/packages/theme/light/tiny-numeric.less new file mode 100644 index 0000000..7ced741 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-numeric.less @@ -0,0 +1,4 @@ +div.tiny-numeric { + --ti-lowcode-tiny-numeric-icon-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-tiny-numeric-icon-hover-color: var(--ti-lowcode-base-gray-50); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-search.less b/dl-flow-frontend/packages/theme/light/tiny-search.less new file mode 100644 index 0000000..29f9851 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-search.less @@ -0,0 +1,14 @@ +.tiny-search { + // 搜索框图标颜色 + --ti-lowcode-search-icon-color: #808080; + // 搜索框图标悬浮时颜色 + --ti-lowcode-search-hover-icon-color: #191919; + + // tinysearch 背景色 + --ti-lowcode-component-search-bg: var(--ti-lowcode-base-bg-5); + + // 搜索框hover背景色 + --ti-lowcode-search-hover-bg: var(--ti-lowcode-base-bg-5); + --ti-lowcode-search-input-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-search-input-placeholder-color: var(--ti-lowcode-base-gray-50); +} diff --git a/dl-flow-frontend/packages/theme/light/tiny-switch.less b/dl-flow-frontend/packages/theme/light/tiny-switch.less new file mode 100644 index 0000000..f0590ca --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tiny-switch.less @@ -0,0 +1,5 @@ +.tiny-switch { + --ti-lowcode-tiny-switch-bg-color: #c2c2c2; + --ti-lowcode-tiny-switch-checked-bg-color: var(--ti-lowcode-base-blue-6); + --ti-lowcode-tiny-switch-dot-bg: var(--ti-lowcode-base-bg-5); +} diff --git a/dl-flow-frontend/packages/theme/light/toolbar.less b/dl-flow-frontend/packages/theme/light/toolbar.less new file mode 100644 index 0000000..778b9ca --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/toolbar.less @@ -0,0 +1,14 @@ +.tiny-engine-toolbar { + // 头部工具栏 + --ti-lowcode-toolbar-border-bottom-color: var(--ti-lowcode-common-border-color-4); + --ti-lowcode-toolbar-media-bg: var(--ti-lowcode-common-component-bg); + --ti-lowcode-toolbar-media-setting-border-color: var(--ti-lowcode-common-border-color-1); + --ti-lowcode-toolbar-title-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-toolbar-sub-title-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-toolbar-hover-color: var(--ti-lowcode-base-bg); + --ti-lowcode-toolbar-view-active-bg: #f2f2f2; // 相当于 规范中定义的 #191919 透明度5% + --ti-lowcode-toolbar-popover-bg: var(--ti-lowcode-base-gray-0); + --ti-lowcode-toolbar-active-color: var(--ti-lowcode-base-gray-60); + --ti-lowcode-toolbar-user-img-border-color: var(--ti-lowcode-base-gray-20); + --ti-lowcode-toolbar-dot-color: var(--ti-lowcode-base-brand-color); +} diff --git a/dl-flow-frontend/packages/theme/light/tree.less b/dl-flow-frontend/packages/theme/light/tree.less new file mode 100644 index 0000000..d29c7bd --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tree.less @@ -0,0 +1,7 @@ +.outlinebox { + --ti-lowcode-tree-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-tree-icon-color: var(--ti-lowcode-base-primary-color-1); + --ti-lowcode-tree-icon-hover-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-tree-selected-color: var(--ti-lowcode-common-text-main-color); + --ti-lowcode-tree-selected-bg: var(--ti-lowcode-base-bg); +} diff --git a/dl-flow-frontend/packages/theme/light/tutorial.less b/dl-flow-frontend/packages/theme/light/tutorial.less new file mode 100644 index 0000000..45404b2 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/tutorial.less @@ -0,0 +1,5 @@ +#tiny-engine-left-panel { + --ti-lowcode-tutorial-primary-text-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-tutorial-primary-bg-color: var(--ti-lowcode-base-bg-5); + --ti-lowcode-tutorial-hover-bg-color: var(--ti-lowcode-base-bg); +} diff --git a/dl-flow-frontend/packages/theme/light/variable.less b/dl-flow-frontend/packages/theme/light/variable.less new file mode 100644 index 0000000..473d6f0 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/variable.less @@ -0,0 +1,424 @@ +// 亮色主题 +:root { + // 基础配置,前缀为 --base + --base-min-width: 1280px; + + // ------ 主要的公共主题色,前缀为 --ti-lowcode-common ------- + --ti-lowcode-common-primary-color: var(--ti-lowcode-base-primary-color-2); + --ti-lowcode-common-primary-hover-color: var(--ti-lowcode-base-primary-color-2); // hover时,颜色不变 + --ti-lowcode-common-component-bg: #fff; + --ti-lowcode-common-component-hover-bg: #f5f5f5; + --ti-lowcode-common-layout-bg: #fff; + --ti-lowcode-common-header-bg: #eee; + --ti-lowcode-common-primary-text-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-common-secondary-text-color: #c2c2c2; + --ti-lowcode-common-text-title-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-common-text-main-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-common-text-desc-color: var(--ti-lowcode-base-text-color-3); + --ti-lowcode-common-text-placeholder-color: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-common-text-color-1: #6a6a6a; + --ti-lowcode-common-text-color-2: #d9d9d9; + --ti-lowcode-common-text-color-3: #fff; + --ti-lowcode-common-text-color-4: #50d4ab; + --ti-lowcode-common-text-color-5: var(--ti-lowcode-base-text-color-3); + --ti-lowcode-common-text-color-6: var(--ti-lowcode-base-text-color-1); + --ti-lowcode-common-border-color-1: #dfe1e6; + --ti-lowcode-common-border-color-3: #606165; + --ti-lowcode-common-border-color-4: #dfe1e6; + --ti-lowcode-common-hover-bg-1: #f5f5f5; + --ti-lowcode-common-third-text-color: #ababab; + --ti-lowcode-common-error-color: var(--ti-lowcode-base-error-color); + + --ti-lowcode-info-color: var(--ti-lowcode-base-prompt-color); + --ti-lowcode-warning-color: var(--ti-lowcode-base-warn-color); + --ti-lowcode-warning-color-1: var(--ti-lowcode-base-warn-color-1); + --ti-lowcode-dark-1: #464c59; + + // ------ 公共组件的主题色,前缀为 --ti-lowcode-component-组件名 ------- + --ti-lowcode-component-btn-default-color: var(--ti-lowcode-base-primary-color-1); // 默认按钮颜色 + --ti-lowcode-component-btn-default-disabled-color: var(--ti-lowcode-common-secondary-text-color); // 默认禁用颜色 + --ti-lowcode-component-btn-default-hover-color: var(--ti-lowcode-common-text-main-color); // 默认按钮 hover 颜色 + --ti-lowcode-component-btn-default-border-color: var(--ti-lowcode-base-primary-color-1); // 默认按钮边框色 + --ti-lowcode-component-btn-default-border-hover-color: var( + --ti-lowcode-common-text-main-color + ); // 默认按钮 hover 边框色 + --ti-lowcode-component-search-bg: #fff; // tinysearch 背景色 + // svgButton + --ti-lowcode-component-svg-button-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-component-svg-button-hover-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-component-svg-button-hover-bg-color: rgba(0, 0, 0, 0.05); + --ti-lowcode-component-svg-button-active-color: var(--ti-lowcode-base-text-color); + --ti-lowcode-component-svg-button-active-bg-color: rgba(0, 0, 0, 0.05); + + --ti-lowcode-meta-codeEditor-color: var(--ti-lowcode-component-btn-default-color); + --ti-lowcode-meta-codeEditor-border-color: var(--ti-lowcode-component-btn-default-border-color); + --ti-lowcode-meta-codeEditor-hover-color: var(--ti-lowcode-component-btn-default-hover-color); + --ti-lowcode-meta-codeEditor-border-hover-color: var(--ti-lowcode-component-btn-default-border-hover-color); + + // 关闭按钮 + --ti-lowcode-component-close-icon-text-color: var(--ti-lowcode-base-text-color); // 关闭按钮默认颜色 + --ti-lowcode-component-close-icon-text-hover-color: var( + --ti-lowcode-common-primary-text-color + ); // 关闭按钮 hover 颜色 + + // 插件面板 + --ti-lowcode-plugin-panel-title-color: var(--ti-lowcode-common-text-title-color); // 插件面板标题色 + --ti-lowcode-plugin-panel-title-font-weight: 700; // 插件面板标题加粗效果 + --ti-lowcode-plugin-panel-bg: var(--ti-lowcode-common-component-bg); // 插件面板背景色 + --ti-lowcode-plugin-panel-border-right-color: var(--ti-lowcode-common-border-color-4); // 插件面板右侧边框色 + --ti-lowcode-plugin-panel-header-border-bottom-color: #ebebeb; // 插件面板头部区域底部边框线颜色 + + // 插件设置面板 + --ti-lowcode-plugin-setting-panel-bg: var(--ti-lowcode-common-component-bg); // 插件设置面板背景色 + + // 设置面板 + --ti-lowcode-component-setting-panel-label-color: var(--ti-lowcode-common-text-main-color); + --ti-lowcode-component-setting-panel-icon-color: var(--ti-lowcode-common-text-main-color); + + // ------ 各个模块的主题色,前缀为 --ti-lowcode-模块名 ------- + + --ti-lowcode-design-plugin-color: var(--ti-lowcode-base-gray-90); + --ti-lowcode-design-toolbar-icon-color: #8a8e99; + + // 物料-组件列表 + --ti-lowcode-material-component-list-border-color: var(--ti-lowcode-common-border-color-4); + --ti-lowcode-material-component-list-hover-bg: var(--ti-lowcode-common-component-hover-bg); + + // 页面管理 + --ti-lowcode-page-tree-color: var(--ti-lowcode-common-text-main-color); + --ti-lowcode-page-tree-hover-color: var(--ti-lowcode-common-primary-text-color); + + // 数据源 + --ti-lowcode-datasource-list-color: var(--ti-lowcode-common-text-main-color); + + // 状态管理 + --ti-lowcode-data-list-color: var(--ti-lowcode-common-text-main-color); + // 状态管理面板头部的底部边框色 + --ti-lowcode-data-header-border-bottom-color: var(--ti-lowcode-common-border-color-4); + // 状态管理示例背景色 + --ti-lowcode-data-example-bg-color: var(--ti-lowcode-dark-1); + // 状态管理示例文字色 + --ti-lowcode-data-example-color: var(--ti-lowcode-common-text-color-2); + // 添加高级属性文字颜色 + --ti-lowcode-data-advanced-text-color: #252b3a; + // 添加高级属性 hover 文字颜色 + --ti-lowcode-data-advanced-text-hover-color: #5073e5; + // 状态管理按激活背景色 + --ti-lowcode-data-radio-group-active-bg: var(--ti-lowcode-base-gray-0); + // 状态管理按背景色 + --ti-lowcode-data-radio-group-bg: transparent; + + // 教程 + --ti-lowcode-tutorial-list-item-color: var(--ti-lowcode-common-text-main-color); + + // 头部工具栏背景色 + --ti-lowcode-toolbar-bg: #fafafa; + // 头部工具栏选中背景色 + --ti-lowcode-toolbar-active-bg: transparent; + // 头部工具栏边框色 + --ti-lowcode-toolbar-border-color: var(--ti-lowcode-base-default-button-border-color); + // 头部工具栏icon颜色 + --ti-lowcode-toolbar-icon-color: #404040; + // 头部工具栏icon颜色 + --ti-lowcode-toolbar-icon-active-color: #4f77ff; + // 头部工具栏更多more图标颜色 + --ti-lowcode-toolbar-more-color: #000; + // 头部工具栏更多more图标hover颜色 + --ti-lowcode-toolbar-more-hover-color: #666; + + // 头部工具栏面包屑字体颜色 + --ti-lowcode-toolbar-breadcrumb-color: var(--ti-lowcode-base-gray-90); + // 头部工具栏画布大小文本hover背景色 && 头部弹框背景色 && context-menu 背景色 && 大纲树节点hover背景色 && 日期组件背景色 + --ti-lowcode-toolbar-view-hover-bg: #e9e9e9; + // 头部工具栏i18n国际化字体颜色 + --ti-lowcode-toolbar-i18n-color: red; + // 应用发布弹窗图标颜色 + --ti-lowcode-toolbar-publish-icon-color: var(--ti-lowcode-common-primary-text-color); + // 头部左侧logo颜色 + --ti-lowcode-logo-color: #8a8e99; + // 头部左侧logo颜色 + --ti-lowcode-logo-active-color: rgba(0, 0, 0, 0.5); + // 中间画布边框色 + --ti-lowcode-canvas-border-color: #999; + // 右侧属性面板tab页签背景色 + --ti-lowcode-tabs-bg: #ebebeb; + // 右侧属性面板tab页签边框色 + --ti-lowcode-tabs-border-color: #ddd; + // 右侧属性面板tab页签激活状态背景色 + --ti-lowcode-tabs-active-bg: #f3f3f3; + // 右侧属性面板折叠面板展开内容边框色 + --ti-lowcode-collapse-active-border-color: #333; + // 中间画布外框容器背景色 + --ti-lowcode-canvas-wrap-bg: #e5e5e5; + // 中间画布拖拽宽度按钮背景色 + --ti-lowcode-canvas-handle-bg: red; + // 中间画布拖拽宽度按钮背景色 + --ti-lowcode-canvas-handle-hover-bg: #5e7ce0; + // 中间画布底部面包屑背景色 + --ti-lowcode-breadcrumb-bg: #fff; + // 中间画布底部面包屑字体颜色 + --ti-lowcode-breadcrumb-color: #999; + // 中间画布底部面包屑三角箭头颜色 + --ti-lowcode-breadcrumb-icon-color: #ccc; + // 弹框遮罩层背景色 + --ti-lowcode-mask-modal-bg: rgba(0, 0, 0, 0.5); + // 引导提示框遮罩层背景色 + --ti-lowcode-guide-mask-bg: rgba(0, 0, 0, 0.5); + // 引导高亮遮罩层背景色 + --ti-lowcode-guide-highlight-mask-bg: rgba(200, 200, 200, 0.2); + // 引导弹框背景色 + --ti-lowcode-guide-dialog-bg: #fff; + // 引导弹框标题,按钮文本字体色 + --ti-lowcode-guide-title-color: #252b3a; + // 引导弹框描述文本字体色 + --ti-lowcode-guide-message-color: #575d6c; + + // collapse 折叠面板激活后字体颜色 + --ti-lowcode-collapse-active-color: #252b3a; + // input 框背景色 + --ti-lowcode-input-bg: #fff; + // switch 圆点背景色 + --ti-lowcode-switch-after-bg: #fff; + // switch 圆点 hover 背景色 + --ti-lowcode-switch-after-hover-bg: #f5f5f5; + // switch 圆点 checked 背景色 + --ti-lowcode-switch-after-checked-bg: #fff; + + // -----下拉框相关主题配置----- + // 下拉框聚焦时边框颜色 + --ti-lowcode-select-focus-border-color: var(--ti-lowcode-base-default-button-border-hover-color); + // 下拉框选中标签字体颜色 + --ti-lowcode-select-tags-text-color: var(--ti-lowcode-base-text-color-3); + // 下拉框选中标签背景颜色 + --ti-lowcode-select-tags-bg-color: #5959591a; + // 下拉框suffix图标悬浮颜色 + --ti-lowcode-select-suffix-icon-color-hover: var(--ti-lowcode-base-text-color); + // select 下拉框背景色 + --ti-lowcode-dropdown-bg-color: #202020; + // select 下拉面板边框颜色 + --ti-lowcode-dropdown-border-color: transparent; + // select 下拉面板选型字体颜色 + --ti-lowcode-dropdown-item-text-color: var(--ti-lowcode-base-text-color); + // select 下拉框背景色 + --ti-lowcode-dropdown-bg-color: #fff; + // select 下拉框选项hover背景色 + --ti-lowcode-dropdown-item-hover-bg-color: #f2f2f2; + // select 下拉框选项选中背景色 + --ti-lowcode-dropdown-item-selected-bg: #fff; + // select 下拉框选项选中字体颜色 + --ti-lowcode-dropdown-item-selected-color: var(--ti-lowcode-base-text-color-2); + // select 下拉框选项hover字体颜色 + --ti-lowcode-dropdown-item-hover-text-color: var(--ti-lowcode-base-text-color); + // button info 字体颜色 + --ti-lowcode-button-info-color: #fff; + // button default 背景颜色 + --ti-lowcode-button-default-bg: #fff; + // 按钮hover字体颜色 + --ti-lowcode-button-default-hover-color: var(--ti-lowcode-common-primary-color); + // 按钮hover背景色 + --ti-lowcode-button-default-hover-bg: #fff; + --ti-lowcode-button-default-hover-border-color: var(--ti-lowcode-common-primary-color); + // info 保存按钮背景色 + --ti-lowcode-button-info-bg: var(--ti-lowcode-common-primary-color); + // info 保存按钮 hover 背景色 + --ti-lowcode-button-info-hover-bg: var(--ti-lowcode-common-primary-hover-color); + // primary 按钮字体颜色 + --ti-lowcode-button-primary-color: #fff; + // 按钮边框颜色 + --ti-lowcode-button-border-color: var(--ti-lowcode-common-primary-color); + // 组件icon颜色 + --ti-lowcode-component-icon-color: #8d8d8d; + // 组件item hover 背景色 + --ti-lowcode-component-item-hover-bg: #e3e3e3; + // 左侧插件激活背景色 + --ti-lowcode-left-panel-active-bg: #f2f2f2; + // 左侧插件激活边框色 + --ti-lowcode-left-panel-active-border-color: #999; + // 左侧tabs按钮边框色 + --ti-lowcode-left-button-border-color: #ddd; + + // list-item 项背景色 + --ti-lowcode-list-item-bg: #fafafa; + // list-item 项激活背景色 + --ti-lowcode-list-item-active-bg: #e9e9e9; + // radio 按钮组激活背景色 + --ti-lowcode-radio-button-active-bg: #9d9d9d; + // grid 布局设置按钮字体颜色 + --ti-lowcode-grid-edit-color: #252b3a; + // grid 布局设置按钮背景色 + --ti-lowcode-grid-edit-bg: #fff; + // tooltip字体颜色 + --ti-lowcode-tooltip-text-color: var(--ti-lowcode-base-text-color); + // tooltip背景颜色 + --ti-lowcode-tooltip-bg-color: var(--ti-lowcode-base-bg-5); + // tooltip错误提示背景颜色 + --ti-lowcode-tooltip-error-bg-color: var(--ti-lowcode-base-bg-5); + + // Fit 字体颜色 + --ti-lowcode-fit-label-color: #252b3a; + // Fit 背景颜色 + --ti-lowcode-fit-coordinate-bg: #fff; + // Fit 边框颜色 + --ti-lowcode-fit-coordinate-border-color: #ddd; + // Fit 圆点颜色 + --ti-lowcode-fit-coordinate-origin-color: #757575; + // more icon 选中背景色 + --ti-lowcode-more-icon-selected-bg: #e5e5e5; + // main menu 背景色 + --ti-lowcode-main-menu-bg: #fff; + // main menu hover 背景色 + --ti-lowcode-main-menu-item-hover-bg: var(--ti-lowcode-common-primary-color); + --ti-lowcode-main-menu-item-hover-color: var(--ti-lowcode-common-text-color-3); + // spacing svg 图标上下颜色 + --ti-lowcode-spacing-tb-color: #d1d1d1; + // spacing svg 图标上下hover颜色 + --ti-lowcode-spacing-tb-hover-color: #bdbdbd; + // spacing svg 图标左右颜色 + --ti-lowcode-spacing-lr-color: #e5e5e5; + // spacing svg 图标左右hover颜色 + --ti-lowcode-spacing-lr-hover-color: #dfdfdf; + // spacing svg 图标边框颜色 + --ti-lowcode-spacing-border-color: #999; + // position direction 字体颜色 + --ti-lowcode-position-direction-color: #252b3a; + // position direction 弹框显示时字体背景色 + --ti-lowcode-position-direction-bg: #bfbfbf; + // position Relative to 按钮字体颜色 + --ti-lowcode-position-relative-to-color: #252b3a; + // position Relative to 按钮边框颜色 + --ti-lowcode-position-relative-to-border-color: #ddd; + // position Relative to 按钮背景色 + --ti-lowcode-position-relative-to-bg: #e5e5e5; + // position 选中背景色 + --ti-lowcode-position-selected-bg: #b5b5b5; + // icon 图标选择弹框背景色 + --ti-lowcode-icon-popover-bg: #ebebeb; + // icon 图标选择弹框字体颜色 + --ti-lowcode-icon-popover-color: #666; + // icon 图标选择弹框hover颜色 + --ti-lowcode-icon-popover-hover-color: #333; + // 查看区块详情icon颜色 + --ti-lowcode-block-detail-icon-color: #999; + + // 中间画布底部面包屑hover背景色 + --ti-lowcode-breadcrumb-hover-bg: #fff; + // 弹框中tip提示边框颜色 + --ti-lowcode-dialog-tip-border-color: #575d6c; + // 弹框字体颜色 && 左侧面板 title 字体颜色 + --ti-lowcode-dialog-font-color: #333; + // 输入框icon图标颜色 + --ti-lowcode-input-icon-color: #737373; + // 弹框字体颜色 && 图标颜色 && 输入框 suffix 字体颜色 + --ti-lowcode-text-color: #6a6a6a; + // 右侧optionitem的边框色 + --ti-lowcode-optionitem-border-color: #9f9f9f; + // 右侧optionitem的背景色 + --ti-lowcode-optionitem-background-color: #e5e5e5; + //tootip里的input框字体颜色 + --ti-lowcode-tootip-input-color: #fff; + //tootip里的input背景颜色 + --ti-lowcode-tootip-input-background-color: #363636; + //tootip里的input框边框颜色 + --ti-lowcode-tootip-input-border-color: #b9b9b9; + //tootip里的input框箭头颜色 + --ti-lowcode-tootip-arrow-border-color: #404040; + // dialogBox弹框示例框边框色 + --ti-lowcode-dialog-demo-border-color: #5e5e5e; + // 关闭 icon 图标hover背景色 && 输入框后置文本hover背景色 + --ti-lowcode-icon-hover-bg: rgba(255, 255, 255, 0.1); + // 说明提示框警告颜色 + --ti-lowcode-description-warning-color: #facb4b; + // 说明提示框错误颜色 + --ti-lowcode-description-error-color: #ff0000; + // switch checked状态边框色 + --ti-lowcode-switch-checked-border-color: var(--ti-lowcode-common-primary-color); + // 文本链接颜色 + --ti-lowcode-text-link-color: #6bb0ff; + // 大纲树node节点选中背景色 + --ti-lowcode-node-current-bg: var(--ti-lowcode-common-primary-color); + // 大纲树node节点不可拖拽背景色 && 表单校验错误边框色 + --ti-lowcode-node-nodrag-bg: #ea384c; + // 成功状态按钮边框色 + --ti-lowcode-success-border-color: #2ad986; + // 错误提示颜色 + --ti-lowcode-error-tip-color: var(--ti-lowcode-base-error-color); + // 画布拖拽元素背景色 + --ti-lowcode-drag-ghost-bg: #888; + // 画布拖拽位置线背景色 + --ti-lowcode-ghost-line-bg: #ffb100; + // 描述颜色 + --ti-lowcode-description-color: var(--ti-lowcode-common-text-color-4); + // 更多折叠面板头部hover背景色 + --ti-lowcode-more-collapse-header-hover-color: #afafaf; + // 绑定时icon图标颜色 + --ti-lowcode-icon-bind-color: #006cff; + // 创建字体颜色 + --ti-lowcode-create-color: #575d6c; + // 删除按钮hover背景色 && 表单校验错误背景色 + --ti-lowcode-delete-button-hover-bg: #c92c3f; + // input框focus 获焦时边框颜色 + --ti-lowcode-input-focus-border-color: var(--ti-lowcode-base-default-button-border-hover-color); + // 次要描述字体颜色 && 面包屑label 字体颜色 + --ti-lowcode-description-minor-color: #ababab; + // 样式设置 label 字体颜色 + --ti-lowcode-style-setting-label-color: #8bbefa; + // 样式设置 label 背景颜色 + --ti-lowcode-style-setting-label-bg: rgba(76, 152, 241, 0.15); + // 多人协作item项hover背景色 + --ti-lowcode-user-item-hover-bg: #f3f3f5; + // 多人协作人员头像背景色 + --ti-lowcode-user-header-bg: #919191; + // 工具栏提示框字体颜色 + --ti-lowcode-toolbar-popover-color: #363636; + // 工具栏 media 提示框字体颜色 + --ti-lowcode-media-popover-color: var(--ti-lowcode-base-gray-60); + // 工具栏 media 提示框标题字体颜色 + --ti-lowcode-media-popover-title-color: #191919; + // 工具栏icon禁用颜色 + --ti-lowcode-disabled-color: #c2c2c2; + // 状态管理详情收缩摩纳哥编辑器icon颜色 + --ti-lowcode-state-management-screen-icon-color: #404040; + // 状态管理搜索无结果显示颜色 + --ti-lowcode-state-management-query-color: #404040; + + // Popover提示框 + --ti-lowcode-popover-color: var(--ti-lowcode-base-text-color); + // popover 弹框背景色 + --ti-lowcode-popover-bg-color: #fff; + // 自定义类名lowcode弹框背景色 + --ti-lowcode-custom-popover-bg-color: #fff; + // 自定义类名lowcode弹框字体颜色 + --ti-lowcode-custom-popover-text-color: #191919; + // 自定义类名lowcode弹框边框颜色 + --ti-lowcode-custom-popover-border-color: #fff; + + // 滚动条thumb颜色 + --ti-lowcode-scrollbar-thumb-background-color: #e7e8e9; + // 可点击交互的文字颜色 + --ti-lowcode-common-interaction-text-color: #5e7ce0; + // 数字输入框组件下拉列表文字颜色 + --ti-lowcode-numeric-unit-text-color: var(--ti-lowcode-text-color); + + //左侧插件栏hover背景色 + --ti-plugins-hover-bg-color: #fff; + //左侧插件栏hover边框色 + --ti-plugins-hover-border-color: #9e9e9e; + //左侧插件栏hover文字色 + --ti-plugins-hover-text-color: #4d4d4d; + // 表格行间背景色 + --ti-lowcode-new-table-row-sepline-background: #f0f0f0; + + // 查看指引视频 + --ti-lowcode-block-video-tip-color: var(--ti-lowcode-base-primary-color-2); + + // 右侧optionitem的边框色 + --ti-lowcode-optionitem-border-color: rgba(0, 0, 0, 0.08); + // 右侧optionitem的背景色 + --ti-lowcode-optionitem-background-color: #fff; + + // 空数据图标颜色 + --ti-lowcode-empty-icon-color: unset; + + --ti-lowcode-popover-option-popper-border-color: transparent; + --ti-lowcode-toolbar-hover-popper: var(--ti-lowcode-toolbar-more-color); +} diff --git a/dl-flow-frontend/packages/theme/light/vite.config.js b/dl-flow-frontend/packages/theme/light/vite.config.js new file mode 100644 index 0000000..5bfb4b2 --- /dev/null +++ b/dl-flow-frontend/packages/theme/light/vite.config.js @@ -0,0 +1,27 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { defineConfig } from 'vite' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + publicDir: false, + build: { + lib: { + entry: path.resolve(__dirname, './index.less'), + name: 'theme-light', + fileName: () => 'index.js', + formats: ['es'] + } + } +}) diff --git a/dl-flow-frontend/packages/toolbars/export/assets/test.png b/dl-flow-frontend/packages/toolbars/export/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/toolbars/export/index.js b/dl-flow-frontend/packages/toolbars/export/index.js new file mode 100644 index 0000000..d64deaa --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/export/index.js @@ -0,0 +1,23 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import component from './src/Main.vue' +import * as api from './src/api'; + +export default { + id: 'export', + title: '导出', + icon: '', + align: 'right', + component, + api +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/export/mock/test.js b/dl-flow-frontend/packages/toolbars/export/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/dl-flow-frontend/packages/toolbars/export/package.json b/dl-flow-frontend/packages/toolbars/export/package.json new file mode 100644 index 0000000..113fba0 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/export/package.json @@ -0,0 +1,39 @@ +{ + "name": "dl-flow-toolbar-export", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/toolbars/save" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} diff --git a/dl-flow-frontend/packages/toolbars/export/src/Main.vue b/dl-flow-frontend/packages/toolbars/export/src/Main.vue new file mode 100644 index 0000000..fe0f8da --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/export/src/Main.vue @@ -0,0 +1,59 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/export/src/api.js b/dl-flow-frontend/packages/toolbars/export/src/api.js new file mode 100644 index 0000000..7b05698 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/export/src/api.js @@ -0,0 +1,77 @@ +import {ref} from 'vue'; +import {useSchema, useWs, useX6} from '@opentiny/tiny-engine-controller'; +export const visible = ref(false); +export const messages = ref([]) +export const finish = ref(false); +export const error = ref(false); +export const canDownload = ref(false); +export const downloadFileName = ref(''); +export const loading = ref(false); +export const colors = { + 'info': '#1976D2', + 'error': '#D32F2F', +} +const { + client, + onConnect, + onProgess, + onFinish, + onError, + onDone +} = useWs(); +onConnect(()=>{ + messages.value.push([colors.info, 'Connect server success...']) +}) +onProgess((message)=>{ + messages.value.push([colors.info, message]); +}) +onFinish((message)=>{ + error.value = false; + finish.value = true; + loading.value = false; + messages.value.push([colors.info, message]) +}) +onError((reason)=>{ + messages.value.push( + [colors.error, reason] + ); + finish.value = true; + error.value = true; + loading.value = false; +}) +onDone((fileName) => { + downloadFileName.value = fileName; + canDownload.value = true; +}) +const {schema, updateSchema} = useSchema(); +let g = null; +export const useExport = () => { + const openDialog = () => { + if (messages.value.length){ + messages.value = []; + } + loading.value = true; + if (!visible.value){ + visible.value = true; + } + if (!g){ + g = useX6().g; + } + const edges = g.getEdges(); + updateSchema({ + cells: g.toJSON().cells, + edges + }) + client.emitWithAck('createCodeGenerate', schema) + .catch(() => { + messages.value.push([colors.error, '服务器超时, 请重试']) + finish.value = true; + loading.value = false; + }) + } + const retry = () => { + messages.value = []; + openDialog(); + } + return {retry, openDialog}; +} diff --git a/dl-flow-frontend/packages/toolbars/export/src/js/index.js b/dl-flow-frontend/packages/toolbars/export/src/js/index.js new file mode 100644 index 0000000..0094b9d --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/export/src/js/index.js @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { reactive, ref } from 'vue' +import { useBlock, useCanvas, useLayout, useNotify, usePage } from '@opentiny/tiny-engine-controller' +import { getSchema, setSchema, selectNode } from '@opentiny/tiny-engine-canvas' +import { constants } from '@opentiny/tiny-engine-utils' +import { handlePageUpdate } from '@opentiny/tiny-engine-common/js/http' + +const { pageState, isSaved, isBlock } = useCanvas() +const { PLUGIN_NAME, getPluginApi } = useLayout() +const { getCurrentBlock } = useBlock() +const { PAGE_STATUS } = constants +const { pageSettingState, isTemporaryPage } = usePage() +const state = reactive({ + visible: false, + code: '', + originalCode: '', + disabled: false +}) + +export const isLoading = ref(false) + +// 保存或新建区块 +const saveBlock = async (pageSchema) => { + const api = getPluginApi(PLUGIN_NAME.BlockManage) + const block = getCurrentBlock() + + block.label = pageSchema.fileName + // 画布上的schem回写到block的schema + block.content = pageSchema + // 获取区块截图 + isLoading.value = true + block.screenshot = await api.getBlockBase64() + await api.saveBlock?.(block) + isLoading.value = false +} + +const savePage = async (pageSchema) => { + const { currentPage } = pageState + const params = { + page_content: pageSchema + } + + isLoading.value = true + await handlePageUpdate(currentPage.id, { ...currentPage, ...params }) + isLoading.value = false +} + +export const saveCommon = (value) => { + const pageSchema = JSON.parse(value) + + pageState.pageSchema = pageSchema + // setSchema 是异步,保存直接传递当前 schema + setSchema(pageSchema) + + if (pageSettingState?.isAIPage) { + if (isTemporaryPage.saved) { + isTemporaryPage.saved = false + } + + // 如果当前页面没有ID,为临时生成的页面,则打开新建页面面板 + isTemporaryPage.saved = true + const pageContent = 'page_content' + + pageSettingState.currentPageData[pageContent] = pageSchema + + return Promise.resolve() + } + + // 选中画布中的页面,关闭插件、属性配置 + selectNode(null) + + return isBlock() ? saveBlock(pageSchema) : savePage(pageSchema) +} +export const openCommon = async () => { + if (isSaved() || state.disabled) { + return + } + + const pageStatus = useLayout().layoutState?.pageStatus + const curPageState = pageStatus?.state + const pageInfo = pageStatus?.data + const ERR_MSG = { + [PAGE_STATUS.Release]: '当前页面未锁定,请先锁定再保存', + [PAGE_STATUS.Empty]: '当前应用无页面,请先新建页面再保存', + [PAGE_STATUS.Guest]: '官网演示应用不能保存页面,如需体验请切换应用', + [PAGE_STATUS.Lock]: `当前页面被 ${pageInfo?.username} ${pageInfo?.resetPasswordToken} 锁定,如需编辑请先联系他解锁文件,然后再锁定该页面后编辑!` + } + + if ([PAGE_STATUS.Release, PAGE_STATUS.Empty, PAGE_STATUS.Guest, PAGE_STATUS.Lock].includes(curPageState)) { + useNotify({ + type: 'error', + title: '保存失败', + message: ERR_MSG[curPageState] + }) + + return + } + + state.disabled = true + + const pageSchema = getSchema() + + state.code = JSON.stringify(pageSchema || {}, null, 2) + + // 获取请求前schema代码,暂时先屏蔽 + /** + if (isBlock()) { + const api = getPluginApi(PLUGIN_NAME.BlockManage) + const block = getCurrentBlock() + const remote = await api.getBlockById(block?.id) + state.originalCode = JSON.stringify(remote?.content || {}, null, 2) + } else { + const api = getPluginApi(PLUGIN_NAME.AppManage) + const remote = await api.getPageById(pageState?.currentPage?.id) + state.originalCode = JSON.stringify(remote?.['page_content'] || {}, null, 2) + } + */ + + saveCommon(state.code).finally(() => { + state.disabled = false + }) +} diff --git a/dl-flow-frontend/packages/toolbars/export/vite.config.js b/dl-flow-frontend/packages/toolbars/export/vite.config.js new file mode 100644 index 0000000..905c76a --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/export/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'toolbar-export', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/toolbars/menu/index.js b/dl-flow-frontend/packages/toolbars/menu/index.js new file mode 100644 index 0000000..67de05b --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/menu/index.js @@ -0,0 +1,21 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import component from './src/main.vue' + +export default { + id: 'menu', + title: '菜单', + icon: '', + align: 'left', + component, +} diff --git a/dl-flow-frontend/packages/toolbars/menu/package.json b/dl-flow-frontend/packages/toolbars/menu/package.json new file mode 100644 index 0000000..de2c30d --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/menu/package.json @@ -0,0 +1,41 @@ +{ + "name": "dl-flow-toolbar-menu", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/toolbars/menu" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "dl-flow-toolbar-export": "workspace:^", + "dl-flow-toolbar-save": "workspace:^", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/menu/src/main.vue b/dl-flow-frontend/packages/toolbars/menu/src/main.vue new file mode 100644 index 0000000..3fb369d --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/menu/src/main.vue @@ -0,0 +1,42 @@ + + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/menu/src/menu-icon.vue b/dl-flow-frontend/packages/toolbars/menu/src/menu-icon.vue new file mode 100644 index 0000000..5a41d04 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/menu/src/menu-icon.vue @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/menu/vite.config.js b/dl-flow-frontend/packages/toolbars/menu/vite.config.js new file mode 100644 index 0000000..396b85a --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/menu/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'toolbar-save', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/toolbars/rename/index.js b/dl-flow-frontend/packages/toolbars/rename/index.js new file mode 100644 index 0000000..cc25b30 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/rename/index.js @@ -0,0 +1,9 @@ +import component from './src/main.vue'; + +export default { + id: 'name', + title: '项目名', + icon: '', + align: 'center', + component +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/rename/package.json b/dl-flow-frontend/packages/toolbars/rename/package.json new file mode 100644 index 0000000..bde8758 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/rename/package.json @@ -0,0 +1,39 @@ +{ + "name": "dl-flow-toolbar-rename", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/toolbars/rename" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/rename/src/main.vue b/dl-flow-frontend/packages/toolbars/rename/src/main.vue new file mode 100644 index 0000000..5e35104 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/rename/src/main.vue @@ -0,0 +1,62 @@ + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/rename/vite.config.js b/dl-flow-frontend/packages/toolbars/rename/vite.config.js new file mode 100644 index 0000000..b59dcc8 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/rename/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'toolbar-rename', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/toolbars/save/index.js b/dl-flow-frontend/packages/toolbars/save/index.js new file mode 100644 index 0000000..58454a7 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/save/index.js @@ -0,0 +1,23 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import component from './src/main.vue' +import {saveSchema} from './src/api'; + +export default { + id: 'save', + title: '保存', + icon: '', + align: 'right', + component, + api: {saveSchema} +} diff --git a/dl-flow-frontend/packages/toolbars/save/package.json b/dl-flow-frontend/packages/toolbars/save/package.json new file mode 100644 index 0000000..014919d --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/save/package.json @@ -0,0 +1,40 @@ +{ + "name": "dl-flow-toolbar-save", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/toolbars/save" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "vue": "3.2.45" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "vite": "^4.3.7" + } + } + \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/save/src/api.js b/dl-flow-frontend/packages/toolbars/save/src/api.js new file mode 100644 index 0000000..2b01601 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/save/src/api.js @@ -0,0 +1,29 @@ +import { useSearchParam, useState, useX6 } from '@opentiny/tiny-engine-controller'; +import {useSchema,useProjects,useNotify} from '@opentiny/tiny-engine-controller'; +const state = useState(); +export const saveSchema = () => { + const {save} = useProjects(); + const {schema} = useSchema(); + const graphData = useX6().g.toJSON(); + let timer = setTimeout(() => { + state.loading.value = true; + }, 500); + const id = useSearchParam(window.location.search).get('projectId'); + save(id, schema, graphData) + .then(()=>{ + useNotify({ + type: 'success', + message: '保存成功' + }) + }) + .catch((reason)=>{ + useNotify({ + type: 'error', + message: `保存失败: ${reason}` + }) + }) + .finally(()=>{ + clearTimeout(timer) + state.loading.value = false; + }) +} \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/save/src/main.vue b/dl-flow-frontend/packages/toolbars/save/src/main.vue new file mode 100644 index 0000000..57a236f --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/save/src/main.vue @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/dl-flow-frontend/packages/toolbars/save/vite.config.js b/dl-flow-frontend/packages/toolbars/save/vite.config.js new file mode 100644 index 0000000..c126818 --- /dev/null +++ b/dl-flow-frontend/packages/toolbars/save/vite.config.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './index.js'), + name: 'toolbar-save', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + // output: { + // banner: 'import "./style.css"' + // }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/utils/package.json b/dl-flow-frontend/packages/utils/package.json new file mode 100644 index 0000000..540ecdd --- /dev/null +++ b/dl-flow-frontend/packages/utils/package.json @@ -0,0 +1,37 @@ +{ + "name": "@opentiny/tiny-engine-utils", + "version": "1.0.3", + "publishConfig": { + "access": "public" + }, + "description": "", + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "vite build", + "test": "vitest" + }, + "keywords": [], + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/utils" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "devDependencies": { + "vite": "^4.3.7", + "vitest": "^0.34.6" + }, + "dependencies": { + "@opentiny/vue-renderless": "~3.10.0", + "vue": "^3.3.8" + } +} diff --git a/dl-flow-frontend/packages/utils/src/constants/index.js b/dl-flow-frontend/packages/utils/src/constants/index.js new file mode 100644 index 0000000..92fa301 --- /dev/null +++ b/dl-flow-frontend/packages/utils/src/constants/index.js @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import * as utils from '../utils' + +export const MATERIAL_TYPE = { + Component: 'component', + Block: 'block' +} + +export const NODE_INSERT_TYPE = { + Inside: 'inside', + After: 'after', + Before: 'before', + Replace: 'replace' +} + +export const PROP_DATA_TYPE = { + I18N: 'i18n', + VARIABLE: 'variable', + JSEXPRESSION: 'JSExpression', + JSRESOURCE: 'JSResource', + JSSLOT: 'JSSlot' +} + +export const EXPRESSION_TYPE = { + JS_FUNCTION: 'JSFunction', + JS_EXPRESSION: 'JSExpression' +} + +export const PLUGIN_NAME = { + Materials: 'Materials', + AppManage: 'AppManage', + BlockManage: 'BlockManage', + PageController: 'PageController', + Lock: 'Lock', + OutlineTree: 'OutlineTree', + save: 'save' +} + +export const LOCALE = { + zh_CN: 'zh_CN', + en_US: 'en_US' +} + +export const COMPONENT_NAME = { + Page: 'Page', + Block: 'Block', + Folder: 'Folder' +} + +export const ELEMENT_TAG = { + Body: 'body', + Div: 'div' +} + +export const SCHEMA_DATA_TYPE = { + JSFunction: 'JSFunction', + JSExpression: 'JSExpression', + I18n: 'i18n' +} + +export const PAGE_STATUS = { + Release: 'release', + Occupy: 'occupy', + Lock: 'lock', + Guest: 'guest', + Empty: 'empty', + SuperAdmin: 'p_webcenter', + Developer: 'developer' +} + +export const BLOCK_OPENNESS = { + Private: 0, + Open: 1, + Special: 2 +} + +/** + * 当前浏览器标签页中 BroadcastChannel 的唯一 id + * 为了避免在同一个浏览器下打开不同设计器应用造成的消息错乱 + * 频道名字 需要为 channelName + channelId + */ +const CHANNEL_UID = sessionStorage.getItem('BROADCAST_CHANNEL_UID') || utils.guid() + +sessionStorage.setItem('BROADCAST_CHANNEL_UID', CHANNEL_UID) + +export const BROADCAST_CHANNEL = { + CanvasLang: `tiny-lowcode-canvas-lang-${CHANNEL_UID}`, + Notify: `global-notify-${CHANNEL_UID}`, + SchemaLength: `schema-length-${CHANNEL_UID}` +} + +export const TYPES = { + ErrorType: 'error', + ObjectType: 'object', + RegExpType: 'regExp', + DateType: 'date', + ArrayType: 'array', + FunctionType: 'function', + StringType: 'string', + NumberType: 'number', + BooleanType: 'boolean' +} + +export const DEFAULT_LOOP_NAME = { + INDEX: 'index', + ITEM: 'item' +} + +export const HOST_TYPE = { + App: 'app', + Block: 'block' +} + +export const ENVIRONMENTS = { + Alpha: ['alpha'], + Prod: ['prod'], + Development: ['development'] +} + +// 数据源默认拦截器 +export const DEFAULT_INTERCEPTOR = { + dataHandler: { + type: 'JSFunction', + value: 'function dataHandler(res){\n return res\n}' + }, + willFetch: { + type: 'JSFunction', + value: 'function willFetch(option) {\n return option\n}' + }, + errorHandler: { + type: 'JSFunction', + value: 'function errorHandler(err) {\n return Promise.reject(err)\n}' + }, + shouldFetch: { + type: 'JSFunction', + value: 'function shouldFetch(option) {\n return true \n}' + } +} + +// 排序方式枚举 +export const SORT_TYPE = { + // 时间顺序 + timeAsc: 'timeAsc', + // 时间倒序 + timeDesc: 'timeDesc', + // 字母正序 + alphabetAsc: 'alphabetAsc', + // 字母倒序 + alphabetDesc: 'alphabetDesc' +} diff --git a/dl-flow-frontend/packages/utils/src/fs/index.js b/dl-flow-frontend/packages/utils/src/fs/index.js new file mode 100644 index 0000000..2cb2bf5 --- /dev/null +++ b/dl-flow-frontend/packages/utils/src/fs/index.js @@ -0,0 +1,181 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +// browser File System Access API encapsulation + +/** + * 获取用户选择并授权的文件夹根路径 + * @param {*} options + * mode: 授权模式 e.g. 'readwrite' + * @returns dirHandle 目录句柄 + */ +export const getUserBaseDirHandle = async (options = {}) => { + if (!window.showOpenFilePicker) { + throw new Error('不支持的浏览器!') + } + const dirHandle = await window.showDirectoryPicker({ mode: 'readwrite', ...options }) + return dirHandle +} + +/** + * 获取目录句柄 + * @param {*} baseDirHandle 根目录句柄 + * @param {Array} pathArr 相对路径(相对根路径) + * @param {boolean} create true:不存在则创建 + * @returns dirHandle | null + */ +export async function getDirectoryHandle(baseDirHandle, pathArr = [], { create = false } = {}) { + if (!baseDirHandle) { + return null + } + + let currentHandle = baseDirHandle + + for (const curPath of pathArr) { + currentHandle = await currentHandle.getDirectoryHandle(curPath, { create }) + } + + return currentHandle +} + +/** + * 获取文件句柄 + * @param {*} baseDirHandle 根目录句柄 + * @param {string} filePath 相对路径(相对根路径) + * @param {*} options + * {boolean} create true:不存在则创建 + * @returns fileHandle | null + */ +export async function getFileHandle(baseDirHandle, filePath, { create = false } = {}) { + if (!baseDirHandle || !filePath) { + return null + } + + const pathArr = filePath.split('/') + const fileName = pathArr.pop() + const dirHandle = await getDirectoryHandle(baseDirHandle, pathArr, { create }) + const fileHandle = await dirHandle.getFileHandle(fileName, { create }) + + return fileHandle +} + +/** + * 获取用户选择并授权的文件路径 + * @param {*} options + * mode: 授权模式 e.g. 'readwrite' + * @returns fileHandle 文件句柄 + */ +export const getUserFileHandle = async (options = {}) => { + if (!window.showOpenFilePicker) { + throw new Error('不支持的浏览器!') + } + const [fileHandle] = await window.showOpenFilePicker({ mode: 'readwrite', ...options }) + return fileHandle +} + +/** + * 读取文件内容 + * @param {*} baseDirHandle 根目录句柄 + * @param {*} filePath 文件相对路径(相对根目录) + * @return {string} 文件内容 + */ +export const readFile = async (baseDirHandle, filePath) => { + if (!baseDirHandle || !filePath) { + return undefined + } + + const fileHandle = await getFileHandle(baseDirHandle, filePath) + const file = await fileHandle.getFile() + const content = await file.text() + + return content +} + +/** + * 读取目录文件列表 + * @param {*} baseDirHandle 根目录句柄 + * @param {string} dirPath 目录相对路径 + * @returns {Array} 目录文件列表 Handle:句柄 + * Handle.type 类型 'file' | 'directory' + * Handle.name 名称 + */ +export const readDir = async (baseDirHandle, dirPath) => { + let dirHandle = baseDirHandle + if (!baseDirHandle) { + return undefined + } + + if (dirPath) { + const pathArr = dirPath.split('/') + dirHandle = await getDirectoryHandle(baseDirHandle, pathArr) + } + + const dirs = [] + for await (const value of dirHandle.values()) { + dirs.push(value) + } + + return dirs +} + +/** + * 写入文件(不存在则创建) + * @param {*} baseDirHandle 根目录句柄 + * @param {Object} fileInfo + * {string} filePath 文件相对路径(相对根目录) + * {string} fileContent 文件内容 + */ +export const writeFile = async (handle, { filePath, fileContent }) => { + let directoryHandle = null + let fileHandle = null + let fileName + + if (!handle || (handle.type === 'directory' && !filePath)) { + throw new Error('invalid handle.') + } + + if (handle.type === 'file') { + fileHandle = handle + fileName = handle.name + } else { + directoryHandle = handle + const pathArr = filePath.split('/') + fileName = pathArr.pop() + + const dirHandle = await getDirectoryHandle(directoryHandle, pathArr, { create: true }) + fileHandle = await dirHandle.getFileHandle(fileName, { create: true }) + } + + const writable = await fileHandle.createWritable() + await writable.write(fileContent) + await writable.close() +} + +/** + * 批量写入文件(不存在则创建) + * @param {*} baseDirHandle 根目录句柄 + * @param {Array} filesInfo 文件信息 + * FileInfo.filePath 文件相对路径 + * FileInfo.fileContent 文件内容 + */ +export const writeFiles = async (baseDirHandle, filesInfo) => { + if (!filesInfo?.length) { + return + } + + let directoryHandle = baseDirHandle + if (!directoryHandle) { + directoryHandle = await window.showDirectoryPicker({ mode: 'readwrite' }) + } + + await Promise.all(filesInfo.map((fileInfo) => writeFile(baseDirHandle, fileInfo))) +} diff --git a/dl-flow-frontend/packages/utils/src/index.js b/dl-flow-frontend/packages/utils/src/index.js new file mode 100644 index 0000000..9201772 --- /dev/null +++ b/dl-flow-frontend/packages/utils/src/index.js @@ -0,0 +1,15 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +export * as utils from './utils' +export * as constants from './constants' +export * as fs from './fs' diff --git a/dl-flow-frontend/packages/utils/src/utils/index.js b/dl-flow-frontend/packages/utils/src/utils/index.js new file mode 100644 index 0000000..e16359c --- /dev/null +++ b/dl-flow-frontend/packages/utils/src/utils/index.js @@ -0,0 +1,327 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { isRef, isProxy, unref, toRaw } from 'vue' +import { isObject, isArray } from '@opentiny/vue-renderless/grid/static' + +export const fun_ctor = Function + +/** + * 解析表达式字符串 + * @param {string} rawCode 表达式字符串 + * @param {object} context 调用的上下文 + * @returns any + */ +export function parseExpression(rawCode, context = {}) { + try { + return fun_ctor(`return (${rawCode})`).call(context) + } catch (error) { + // eslint-disable-next-line no-console + console.error(`parseExpression error: ${error}`) + return undefined + } +} + +/** + * 解析函数字符串成函数 + * @param {string} rawCode 字符串函数 + * @param {object} context 需要绑定的函数上下文 + * @returns Function + */ +export function parseFunction(rawCode, context = {}) { + try { + return fun_ctor(`return (${rawCode})`).call(context).bind(context) + } catch (error) { + // eslint-disable-next-line no-console + console.error(`parseFunction error: ${JSON.Stringify(error)}`) + + return null + } +} + +/** + * 将字符串包含的特殊正则字符逃逸出来 (加上 \\) + * 适用于 new Regexp(`${str}`)的情形,防止变量 str 具有一些特殊的正则字符串导致挂掉或者不符合期望 + * @param {string} value 字符串 + * @returns escape 之后的字符串 + */ +export const escapeRegExp = (value) => { + const reg = /[\\^$.*+?()[\]{}|]/g + const str = String(value) + + return str.replace(reg, '\\$&') +} + +// prefer old unicode hacks for backward compatibility +// https://base64.guru/developers/javascript/examples/unicode-strings +export const utoa = (string) => btoa(unescape(encodeURIComponent(string))) + +export const atou = (base64) => decodeURIComponent(escape(atob(base64))) + +/** + * Create a cached version of a pure function. + */ +function cached(fn) { + const cache = Object.create(null) + return function cachedFn(str) { + if (!cache[str]) { + cache[str] = fn(str) + } + return cache[str] + } +} + +/** + * Camelize a hyphen-delimited string. + */ +const camelizeRE = /-(\w)/g +export const camelize = cached((str) => { + return str.replace(camelizeRE, (_, c) => { + return c ? c.toUpperCase() : '' + }) +}) + +/** + * Capitalize a string. + */ +export const capitalize = cached((str) => { + return str.charAt(0).toUpperCase() + str.slice(1) +}) + +export const hyphenateRE = /\B([A-Z])/g +export const hyphenate = cached((str) => { + return str.replace(hyphenateRE, '-$1').toLowerCase() +}) + +/** + * get random id + */ +export const guid = () => { + return 'xxxxxxxx'.replace(/[x]/g, (c) => { + const random = parseFloat('0.' + crypto.getRandomValues(new Uint32Array(1))[0]) + const r = (random * 16) | 0 + const v = c === 'x' ? r : (r & 0x3) | 0x8 + return v.toString(16) + }) +} + +export const getEnumData = (item) => { + if (item.enum && item.enumNames) { + return item.enum.map((value, index) => ({ value, text: item.enumNames[index] })) + } + return undefined +} + +export const mapTree = (obj = {}, handler, childName = 'children') => { + const children = obj[childName] + const node = handler(obj) + if (Array.isArray(children)) { + node[childName] = children.map((child) => mapTree(child, handler)) + } + + return node +} + +export const mapObj = (source, handler, rootKey) => { + const caller = (obj, key) => { + const { item, deep } = handler(obj, key) + + return deep ? mapObj(item, handler, key) : item + } + + if (isArray(source)) { + return source.map((obj) => caller(obj, rootKey)) + } + + if (source && isObject(source)) { + return Object.keys(source).reduce((output, key) => { + output[key] = caller(source[key], rootKey || key) + + return output + }, {}) + } + + return source +} + +export const getDefaultProps = (properties = []) => { + const props = {} + + properties.forEach(({ content = [] }) => { + content.forEach(({ defaultValue, schema, property }) => { + const value = Array.isArray(schema) ? getDefaultProps(schema) : defaultValue + + if (value) { + props[property] = value + } + }) + }) + + return props +} + +export function generateRandomLetters(length = 1) { + let result = '' + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + for (let i = 0; i < length; i++) { + const random = parseFloat('0.' + crypto.getRandomValues(new Uint32Array(1))[0]) + result += chars.charAt(Math.floor(random * chars.length)) + } + return result +} + +export function getRawValue(target) { + let res = target + + if (isRef(res)) { + res = unref(res) + } + + if (isProxy(res)) { + return toRaw(res) + } + + return res +} + +export function getType(val) { + let type = typeof val + + if (type !== 'object') { + return type + } + + return Object.prototype.toString.call(val).replace(/\[object (.*)\]/, '$1') +} + +function cloneArray(target, map, _deepClone) { + let res = [] + + map.set(target, res) + + target.forEach((item, index) => { + res[index] = _deepClone(item, map) + }) + + return res +} + +function cloneMap(target, map, _deepClone) { + let res = new Map() + + map.set(target, res) + + target.forEach((value, key) => { + res.set(key, _deepClone(value, map)) + }) + + return res +} + +function cloneSet(target, map, _deepClone) { + let res = new Set() + + map.set(target, res) + + target.forEach((value) => { + res.add(_deepClone(value, map)) + }) + + return res +} + +function cloneObject(target, map, _deepClone) { + const res = {} + + map.set(target, res) + + Object.entries(target).forEach(([key, value]) => { + res[key] = _deepClone(value, map) + }) + + return res +} + +export function nativeDeepClone(target) { + try { + return structuredClone(target) + } catch (error) { + // target is no serializable + return undefined + } +} + +/** + * 使用 JSON.stringify 进行 deep clone + * 不支持 Map、Set、Date、RegExp、ArrayBuffer 等变量类型 + * 不支持循环引用 + * @param {*} target target to be copy + * @param {*} callback target copyed + */ +export function jsonDeepClone(target, callback) { + try { + JSON.parse(JSON.stringify(target)) + } catch (error) { + if (typeof callback === 'function') { + callback() + } + } +} + +const copyMethodMap = { + Array: cloneArray, + Map: cloneMap, + Set: cloneSet, + Object: cloneObject +} + +function _deepClone(target, map) { + if (map.has(target)) { + return map.get(target) + } + + const copyTarget = getRawValue(target) + const basicType = ['undefined', 'number', 'string', 'boolean', 'function', 'bigint', 'symbol', 'Null'] + + let type = getType(copyTarget) + + if (basicType.includes(type)) { + return target + } + + let res = nativeDeepClone(copyTarget) + + if (res) { + map.set(target, res) + + return res + } + + if (copyMethodMap[type]) { + res = copyMethodMap[type](target, map, _deepClone) + + return res + } + + return copyTarget +} + +/** + * 优先使用 structuredClone 的深拷贝方法 + * 不支持 拷贝 prototype、function、DOM nodes、proxy(getter、setter) + * 如果是 vue 的 ref 或者 reactive,会尝试拿到 raw value 然后进行深拷贝 + * @param {*} target value to be deep clone + * @returns * deepCloned target + */ +export function deepClone(target) { + return _deepClone(target, new WeakMap()) +} diff --git a/dl-flow-frontend/packages/utils/test/deepClone.test.js b/dl-flow-frontend/packages/utils/test/deepClone.test.js new file mode 100644 index 0000000..6c819f3 --- /dev/null +++ b/dl-flow-frontend/packages/utils/test/deepClone.test.js @@ -0,0 +1,151 @@ +import { ref, reactive } from 'vue' +import { expect, test } from 'vitest' +import { deepClone } from '../src/utils' + +test('should be clone primitive value', () => { + expect(deepClone(null)).toBe(null) + expect(deepClone(undefined)).toBe(undefined) + expect(deepClone('a')).toBe('a') + expect(deepClone(1)).toBe(1) + expect(deepClone(false)).toBe(false) + expect(deepClone(1n)).toBe(1n) +}) + +test('should be clone simple object', () => { + const map = new Map() + + map.set('a', 1) + map.set('b', [1, { b: 2 }]) + + const set = new Set() + + set.add(1) + set.add('2') + + const obj = { + a: 1, + b: '2', + c: true, + d: false, + e: 0, + f: undefined, + g: null, + arr: ['a', '', 0, false, { c: 'ccc' }], + arrLike: { 0: 'a', length: 1 }, + reg: /word/gim, + date: new Date(), + map, + set + } + + const newObj = deepClone(obj) + + expect(newObj).toStrictEqual(obj) + expect(newObj !== obj).toBe(true) + expect(newObj.arr[4] !== obj.arr[4]).toBe(true) +}) + +test('should be clone map', () => { + const map = new Map() + + map.set('a', 1) + map.set('b', [1, { b: 2 }]) + + const newMap = deepClone(map) + + expect(map).toStrictEqual(newMap) + expect(newMap.get('a')).toBe(1) + expect(newMap.get('b') !== map.get('b')).toBe(true) + expect(newMap.get('b')).toStrictEqual(map.get('b')) +}) + +test('should be clone set', () => { + const set = new Set() + + set.add(1) + set.add('2') + + const newSet = deepClone(set) + + expect(newSet.size).toBe(2) + expect(newSet.has(1)).toBe(true) + expect(newSet.has('2')).toBe(true) +}) + +test('should be clone with circular reference', () => { + const obj = { + foo: { b: { c: { d: {} } } }, + bar: {} + } + + obj.foo.b.c.d = obj + obj.bar.b = obj.foo.b + + const newObj = deepClone(obj) + + expect(newObj.bar.b === newObj.foo.b && newObj === newObj.foo.b.c.d && newObj !== obj).toBe(true) +}) + +test('should be clone with `index` and `input` array properties', () => { + const arr = /c/.exec('abcde') + const clonedArr = deepClone(arr) + + expect(clonedArr.index).toBe(2) + expect(clonedArr.input).toBe('abcde') +}) + +test('should be clone with ref value', () => { + const map = new Map() + + map.set('a', 1) + map.set('b', [1, { b: 2 }]) + + const set = new Set() + + set.add(1) + set.add('2') + + const obj = { + a: 1, + b: '2', + c: true, + d: false, + e: 0, + f: undefined, + g: null, + arr: ['a', '', 0, false, { c: 'ccc' }], + arrLike: { 0: 'a', length: 1 }, + reg: /word/gim, + date: new Date(), + map, + set + } + + const objRef = ref(obj) + + const newObj = deepClone(objRef) + + expect(newObj).toStrictEqual(obj) + expect(newObj !== obj && newObj !== objRef.value).toBe(true) + expect(newObj.arr[4] !== objRef.value.arr[4] && newObj.arr[4].c === objRef.value.arr[4].c).toBe(true) +}) + +test('should be clone with reactive with inner refs', () => { + const origin = { + a: 'a', + b: 2, + c: 'c', + d: ['aaa', 'ad'] + } + + const obj = reactive({ + a: 'a', + b: 2, + c: ref('c'), + d: ['aaa', ref('ad')] + }) + + const newObj = deepClone(obj) + expect(newObj).toStrictEqual(newObj) + expect(newObj.d !== origin.d).toBe(true) +}) diff --git a/dl-flow-frontend/packages/utils/vite.config.js b/dl-flow-frontend/packages/utils/vite.config.js new file mode 100644 index 0000000..60ec861 --- /dev/null +++ b/dl-flow-frontend/packages/utils/vite.config.js @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [], + publicDir: false, + resolve: {}, + build: { + lib: { + entry: path.resolve(__dirname, './src/index.js'), + name: 'utils', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/dl-flow-frontend/packages/vue-generator/.eslintrc.cjs b/dl-flow-frontend/packages/vue-generator/.eslintrc.cjs new file mode 100644 index 0000000..fc0c951 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/.eslintrc.cjs @@ -0,0 +1,18 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + extends: ['plugin:vue/vue3-essential', 'eslint:recommended', '@vue/eslint-config-prettier'], + env: { + 'vue/setup-compiler-macros': true, + browser: true, + es2015: true, + node: true + }, + parserOptions: { + ecmaFeatures: { + jsx: true + } + } +} diff --git a/dl-flow-frontend/packages/vue-generator/.gitignore b/dl-flow-frontend/packages/vue-generator/.gitignore new file mode 100644 index 0000000..d180ec5 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/.gitignore @@ -0,0 +1 @@ +test/testcases/full/**/result/* diff --git a/dl-flow-frontend/packages/vue-generator/jsconfig.json b/dl-flow-frontend/packages/vue-generator/jsconfig.json new file mode 100644 index 0000000..5ed408d --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/jsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "target": "ES6", + "module": "CommonJS", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/dl-flow-frontend/packages/vue-generator/package.json b/dl-flow-frontend/packages/vue-generator/package.json new file mode 100644 index 0000000..a16fac1 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/package.json @@ -0,0 +1,45 @@ +{ + "name": "@opentiny/tiny-engine-dsl-vue", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "main": "dist/tiny-engine-dsl-vue.cjs.js", + "files": [ + "dist" + ], + "scripts": { + "build": "vite build", + "test": "npx nyc@latest --reporter=lcov node test/test_generator.js", + "test:latest": "npm run build && node test/testcases/full/index.js", + "publish:npm": "npm publish --verbose" + }, + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/vue-generator" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@opentiny/tiny-engine-builtin-component": "workspace:*", + "@vue/compiler-sfc": "3.2.45", + "@vue/shared": "^3.3.4", + "vue": "3.2.45", + "vue-eslint-parser": "8.3.0" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.1.1", + "@vue/eslint-config-prettier": "^7.0.0", + "eslint": "^8.12.0", + "eslint-plugin-vue": "^8.6.0", + "fs-extra": "^10.0.1", + "prettier": "^2.6.1", + "vite": "^2.8.6", + "winston": "^3.10.0" + } +} diff --git a/dl-flow-frontend/packages/vue-generator/src/constant/index.js b/dl-flow-frontend/packages/vue-generator/src/constant/index.js new file mode 100644 index 0000000..e0d66e2 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/constant/index.js @@ -0,0 +1,2238 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +/** + * 组件映射关系,默认使用 Tiny Vue 组件,支持传入其它组件库的映射关系 + * @summary 建议:添加时,按照组件名称的字母序排列 + */ +const DEFAULT_COMPONENTS_MAP = [ + { + componentName: 'TinyAlert', + exportName: 'Alert', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyBreadcrumb', + exportName: 'Breadcrumb', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyBreadcrumbItem', + exportName: 'BreadcrumbItem', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyButton', + exportName: 'Button', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyCheckbox', + exportName: 'Checkbox', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyCheckboxButton', + exportName: 'CheckboxButton', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyCheckboxGroup', + exportName: 'CheckboxGroup', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyCol', + exportName: 'Col', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyCollapse', + exportName: 'Collapse', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyCollapseItem', + exportName: 'CollapseItem', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyDatePicker', + exportName: 'DatePicker', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyDialogBox', + exportName: 'DialogBox', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyFloatbar', + exportName: 'Floatbar', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyForm', + exportName: 'Form', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyFormItem', + exportName: 'FormItem', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyGrid', + exportName: 'Grid', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAdd', + exportName: 'iconAdd', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAdministrator', + exportName: 'iconAdministrator', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignBaseline', + exportName: 'iconAlignBaseline', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignCenter', + exportName: 'iconAlignCenter', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignFlexCenter', + exportName: 'iconAlignFlexCenter', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignFlexEnd', + exportName: 'iconAlignFlexEnd', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignFlexStart', + exportName: 'iconAlignFlexStart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignJustify', + exportName: 'iconAlignJustify', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignLeft', + exportName: 'iconAlignLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignRight', + exportName: 'iconAlignRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAlignStretch', + exportName: 'iconAlignStretch', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAngularjs', + exportName: 'iconAngularjs', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconApp', + exportName: 'iconApp', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconApplication', + exportName: 'iconApplication', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAreaChart', + exportName: 'iconAreaChart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconArrowDown', + exportName: 'iconArrowDown', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconArrowLeft', + exportName: 'iconArrowLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconArrowRight', + exportName: 'iconArrowRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconArrowUp', + exportName: 'iconArrowUp', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAscending', + exportName: 'iconAscending', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAssociation', + exportName: 'iconAssociation', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconAttachment', + exportName: 'iconAttachment', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconBarChart', + exportName: 'iconBarChart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconBefilter', + exportName: 'iconBefilter', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconBoat', + exportName: 'iconBoat', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconBoxSolid', + exportName: 'iconBoxSolid', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconBusy', + exportName: 'iconBusy', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCalculator', + exportName: 'iconCalculator', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCalendar', + exportName: 'iconCalendar', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCheck', + exportName: 'iconCheck', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCheckOut', + exportName: 'iconCheckOut', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCheckedLinear', + exportName: 'iconCheckedLinear', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCheckedSur', + exportName: 'iconCheckedSur', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCheckedTrue', + exportName: 'iconCheckedTrue', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconChevronDown', + exportName: 'iconChevronDown', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconChevronLeft', + exportName: 'iconChevronLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconChevronRight', + exportName: 'iconChevronRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconChevronUp', + exportName: 'iconChevronUp', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconClearFilter', + exportName: 'iconClearFilter', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconClockWork', + exportName: 'iconClockWork', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconClose', + exportName: 'iconClose', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCloseCircle', + exportName: 'iconCloseCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCloseSquare', + exportName: 'iconCloseSquare', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCloudDownload', + exportName: 'iconCloudDownload', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCloudUpload', + exportName: 'iconCloudUpload', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCode', + exportName: 'iconCode', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCoin', + exportName: 'iconCoin', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconColReverse', + exportName: 'iconColReverse', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCommission', + exportName: 'iconCommission', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconConmentRefresh', + exportName: 'iconConmentRefresh', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCopy', + exportName: 'iconCopy', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCopySolid', + exportName: 'iconCopySolid', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCourse', + exportName: 'iconCourse', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCueL', + exportName: 'iconCueL', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCustom', + exportName: 'iconCustom', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconCustomerService', + exportName: 'iconCustomerService', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDataSource', + exportName: 'iconDataSource', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDefault', + exportName: 'iconDefault', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDefinedFiltration', + exportName: 'iconDefinedFiltration', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDel', + exportName: 'iconDel', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeletePage', + exportName: 'iconDeletePage', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeleted', + exportName: 'iconDeleted', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaDown', + exportName: 'iconDeltaDown', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaDownO', + exportName: 'iconDeltaDownO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaLeft', + exportName: 'iconDeltaLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaLeftO', + exportName: 'iconDeltaLeftO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaRight', + exportName: 'iconDeltaRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaRightO', + exportName: 'iconDeltaRightO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaUp', + exportName: 'iconDeltaUp', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDeltaUpO', + exportName: 'iconDeltaUpO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDerive', + exportName: 'iconDerive', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDescending', + exportName: 'iconDescending', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDesktopView', + exportName: 'iconDesktopView', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDialog', + exportName: 'iconDialog', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDialog2', + exportName: 'iconDialog2', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDirectionCol', + exportName: 'iconDirectionCol', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDirectionRow', + exportName: 'iconDirectionRow', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDotChart', + exportName: 'iconDotChart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDotIpv4', + exportName: 'iconDotIpv4', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDoubleLeft', + exportName: 'iconDoubleLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDoubleRight', + exportName: 'iconDoubleRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDown', + exportName: 'iconDown', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDownO', + exportName: 'iconDownO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDownload', + exportName: 'iconDownload', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDownloadCloud', + exportName: 'iconDownloadCloud', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDownloadLink', + exportName: 'iconDownloadLink', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconDraft', + exportName: 'iconDraft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEdit', + exportName: 'iconEdit', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEditorTab', + exportName: 'iconEditorTab', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEllipsis', + exportName: 'iconEllipsis', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEmailAdd', + exportName: 'iconEmailAdd', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEmailCircle', + exportName: 'iconEmailCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEnd', + exportName: 'iconEnd', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconError', + exportName: 'iconError', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEspace', + exportName: 'iconEspace', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEspaceAuto', + exportName: 'iconEspaceAuto', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconExcel', + exportName: 'iconExcel', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconException', + exportName: 'iconException', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconExclamation', + exportName: 'iconExclamation', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconExport', + exportName: 'iconExport', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconExpressSearch', + exportName: 'iconExpressSearch', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEyeclose', + exportName: 'iconEyeclose', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconEyeopen', + exportName: 'iconEyeopen', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFile', + exportName: 'iconFile', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFileCloudupload', + exportName: 'iconFileCloudupload', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFileExcel', + exportName: 'iconFileExcel', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFiles', + exportName: 'iconFiles', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFilesCircle', + exportName: 'iconFilesCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFiletext', + exportName: 'iconFiletext', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFileupload', + exportName: 'iconFileupload', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFiltered', + exportName: 'iconFiltered', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFlag', + exportName: 'iconFlag', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFolderClosed', + exportName: 'iconFolderClosed', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFolderOpened', + exportName: 'iconFolderOpened', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFontColor', + exportName: 'iconFontColor', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFontFamily', + exportName: 'iconFontFamily', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFontSize', + exportName: 'iconFontSize', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFontStyle', + exportName: 'iconFontStyle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFontWeight', + exportName: 'iconFontWeight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFreezeLeft', + exportName: 'iconFreezeLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFreezeRight', + exportName: 'iconFreezeRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFrown', + exportName: 'iconFrown', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFrownO', + exportName: 'iconFrownO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconFullscreen', + exportName: 'iconFullscreen', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconGrade', + exportName: 'iconGrade', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconGroup', + exportName: 'iconGroup', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconGroupTransfer', + exportName: 'iconGroupTransfer', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHalfchecked', + exportName: 'iconHalfchecked', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHalfselect', + exportName: 'iconHalfselect', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHeartempty', + exportName: 'iconHeartempty', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHelp', + exportName: 'iconHelp', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHelpCircle', + exportName: 'iconHelpCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHelpQuery', + exportName: 'iconHelpQuery', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHelpSolid', + exportName: 'iconHelpSolid', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHelpful', + exportName: 'iconHelpful', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHideLeft', + exportName: 'iconHideLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHideRight', + exportName: 'iconHideRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconHideTopleft', + exportName: 'iconHideTopleft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconImport', + exportName: 'iconImport', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconInfo', + exportName: 'iconInfo', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconInfoCircle', + exportName: 'iconInfoCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconInfoSolid', + exportName: 'iconInfoSolid', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconInformation', + exportName: 'iconInformation', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconJs', + exportName: 'iconJs', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconJusitfyCenter', + exportName: 'iconJusitfyCenter', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconJusitfyFlexEnd', + exportName: 'iconJusitfyFlexEnd', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconJusitfySpaceAround', + exportName: 'iconJusitfySpaceAround', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconJusitfySpaceBetween', + exportName: 'iconJusitfySpaceBetween', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconJustitfyFlexStart', + exportName: 'iconJustitfyFlexStart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLanguage', + exportName: 'iconLanguage', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLeave', + exportName: 'iconLeave', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLeft', + exportName: 'iconLeft', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLeftFrozen', + exportName: 'iconLeftFrozen', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLeftO', + exportName: 'iconLeftO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLeftWard', + exportName: 'iconLeftWard', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLineChart', + exportName: 'iconLineChart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLineHeight', + exportName: 'iconLineHeight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLineThrought', + exportName: 'iconLineThrought', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLink', + exportName: 'iconLink', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLoading', + exportName: 'iconLoading', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconLock', + exportName: 'iconLock', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMail', + exportName: 'iconMail', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMailContent', + exportName: 'iconMailContent', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMale', + exportName: 'iconMale', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMarkOn', + exportName: 'iconMarkOn', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMeh', + exportName: 'iconMeh', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMessageCircle', + exportName: 'iconMessageCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMinscreen', + exportName: 'iconMinscreen', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMinus', + exportName: 'iconMinus', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMinusCircle', + exportName: 'iconMinusCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMinusSquare', + exportName: 'iconMinusSquare', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMobile', + exportName: 'iconMobile', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMobileView', + exportName: 'iconMobileView', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconMore', + exportName: 'iconMore', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconNew', + exportName: 'iconNew', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconNoPremission', + exportName: 'iconNoPremission', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconNode', + exportName: 'iconNode', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconNodeOpen', + exportName: 'iconNodeOpen', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconNodejs', + exportName: 'iconNodejs', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconNone', + exportName: 'iconNone', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconOffLine', + exportName: 'iconOffLine', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconOnLine', + exportName: 'iconOnLine', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconOperationfaild', + exportName: 'iconOperationfaild', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconOperationfaildL', + exportName: 'iconOperationfaildL', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconOuterLink', + exportName: 'iconOuterLink', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPagelink', + exportName: 'iconPagelink', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPagerFirst', + exportName: 'iconPagerFirst', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPagerLast', + exportName: 'iconPagerLast', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPagerNext', + exportName: 'iconPagerNext', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPagerPrev', + exportName: 'iconPagerPrev', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPanelMax', + exportName: 'iconPanelMax', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPanelMini', + exportName: 'iconPanelMini', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPanelNormal', + exportName: 'iconPanelNormal', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPause', + exportName: 'iconPause', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPauseCircle', + exportName: 'iconPauseCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPicture', + exportName: 'iconPicture', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPieChart', + exportName: 'iconPieChart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPlus', + exportName: 'iconPlus', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPlusCircle', + exportName: 'iconPlusCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPlusSquare', + exportName: 'iconPlusSquare', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPopup', + exportName: 'iconPopup', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPreChecked', + exportName: 'iconPreChecked', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPrintPreview', + exportName: 'iconPrintPreview', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconPushpin', + exportName: 'iconPushpin', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRadio', + exportName: 'iconRadio', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRadioselected', + exportName: 'iconRadioselected', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconReactjs', + exportName: 'iconReactjs', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRedo', + exportName: 'iconRedo', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRefres', + exportName: 'iconRefres', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRenew', + exportName: 'iconRenew', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRepeat', + exportName: 'iconRepeat', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconReplace', + exportName: 'iconReplace', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconReplies', + exportName: 'iconReplies', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRight', + exportName: 'iconRight', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRightFrozen', + exportName: 'iconRightFrozen', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRightO', + exportName: 'iconRightO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRightward', + exportName: 'iconRightward', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconRowReverse', + exportName: 'iconRowReverse', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSandwichCollapse', + exportName: 'iconSandwichCollapse', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSandwichExpand', + exportName: 'iconSandwichExpand', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSave', + exportName: 'iconSave', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconScissor', + exportName: 'iconScissor', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSearch', + exportName: 'iconSearch', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSelect', + exportName: 'iconSelect', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSent', + exportName: 'iconSent', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSeparate', + exportName: 'iconSeparate', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSetting', + exportName: 'iconSetting', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconShare', + exportName: 'iconShare', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconShoppingCard', + exportName: 'iconShoppingCard', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSmile', + exportName: 'iconSmile', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSmileO', + exportName: 'iconSmileO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSort', + exportName: 'iconSort', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSortDefault', + exportName: 'iconSortDefault', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStarActive', + exportName: 'iconStarActive', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStarDisable', + exportName: 'iconStarDisable', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStarO', + exportName: 'iconStarO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStart', + exportName: 'iconStart', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStartCircle', + exportName: 'iconStartCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStatistics', + exportName: 'iconStatistics', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStop', + exportName: 'iconStop', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconStreamSolid', + exportName: 'iconStreamSolid', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSuccess', + exportName: 'iconSuccess', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconSuccessful', + exportName: 'iconSuccessful', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTabletView', + exportName: 'iconTabletView', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTaskCooperation', + exportName: 'iconTaskCooperation', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTelephone', + exportName: 'iconTelephone', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTelephoneCircle', + exportName: 'iconTelephoneCircle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconText', + exportName: 'iconText', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTextAlign', + exportName: 'iconTextAlign', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTextDecoration', + exportName: 'iconTextDecoration', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTextTab', + exportName: 'iconTextTab', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTime', + exportName: 'iconTime', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTotal', + exportName: 'iconTotal', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconTriangleDown', + exportName: 'iconTriangleDown', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUndelete', + exportName: 'iconUndelete', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUnderline', + exportName: 'iconUnderline', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUndo', + exportName: 'iconUndo', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUnfilter', + exportName: 'iconUnfilter', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUnfreeze', + exportName: 'iconUnfreeze', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUnknow', + exportName: 'iconUnknow', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUnlock', + exportName: 'iconUnlock', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUnsent', + exportName: 'iconUnsent', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUp', + exportName: 'iconUp', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUpO', + exportName: 'iconUpO', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUpload', + exportName: 'iconUpload', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconUser', + exportName: 'iconUser', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconVersiontree', + exportName: 'iconVersiontree', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconView', + exportName: 'iconView', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconVuejs', + exportName: 'iconVuejs', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconWarning', + exportName: 'iconWarning', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconWarningTriangle', + exportName: 'iconWarningTriangle', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconWebPlus', + exportName: 'iconWebPlus', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconWriting', + exportName: 'iconWriting', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconYes', + exportName: 'iconYes', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconZoomIn', + exportName: 'iconZoomIn', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyIconZoomOut', + exportName: 'iconZoomOut', + package: '@opentiny/vue-icon', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyInput', + exportName: 'Input', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyModal', + exportName: 'Modal', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyNumeric', + exportName: 'Numeric', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyPager', + exportName: 'Pager', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyPopeditor', + exportName: 'Popeditor', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyPopover', + exportName: 'Popover', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyRadio', + exportName: 'Radio', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyRow', + exportName: 'Row', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinySearch', + exportName: 'Search', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinySelect', + exportName: 'Select', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinySwitch', + exportName: 'Switch', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyTabs', + exportName: 'Tabs', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyTabItem', + exportName: 'TabItem', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyTimeLine', + exportName: 'TimeLine', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyTooltip', + exportName: 'Tooltip', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + }, + { + componentName: 'TinyTree', + exportName: 'Tree', + package: '@opentiny/vue', + version: '^3.10.0', + destructuring: true + } +] + +// 内置组件映射关系 +const BUILTIN_COMPONENTS_MAP = [ + { + componentName: 'CanvasRow', + exportName: 'CanvasRow', + package: '@opentiny/tiny-engine-builtin-component', + version: '^0.1.0', + destructuring: true + }, + { + componentName: 'CanvasCol', + exportName: 'CanvasCol', + package: '@opentiny/tiny-engine-builtin-component', + version: '^0.1.0', + destructuring: true + }, + { + componentName: 'CanvasRowColContainer', + exportName: 'CanvasRowColContainer', + package: '@opentiny/tiny-engine-builtin-component', + version: '^0.1.0', + destructuring: true + } +] + +/** + * 内部保留组件名称,出码时可能需要特殊处理 + */ +const BUILTIN_COMPONENT_NAME = { + PAGE: 'Page', + BLOCK: 'Block', + TEMPLATE: 'Template', + SLOT: 'Slot', + COLLECTION: 'Collection', + TEXT: 'Text', + ICON: 'Icon' +} + +/** + * 图标组件名,统一前缀为 TinyIcon,与从组件库引入的方法名 iconXxx 区分开 + */ +const TINY_ICON = 'TinyIcon' + +/** + * 占位标识,用于解开字符串的双引号,输出原始表达式 + */ +const UNWRAP_QUOTES = { + start: '#QUOTES_START#', + end: '#QUOTES_END#' +} + +/** + * 协议中的类型 + */ +export const [JS_EXPRESSION, JS_FUNCTION, JS_I18N, JS_RESOURCE, JS_SLOT] = [ + 'JSExpression', + 'JSFunction', + 'i18n', + 'JSResource', + 'JSSlot' +] + +export { DEFAULT_COMPONENTS_MAP, BUILTIN_COMPONENT_NAME, TINY_ICON, UNWRAP_QUOTES, BUILTIN_COMPONENTS_MAP } diff --git a/dl-flow-frontend/packages/vue-generator/src/generator/index.js b/dl-flow-frontend/packages/vue-generator/src/generator/index.js new file mode 100644 index 0000000..e852c70 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/generator/index.js @@ -0,0 +1,15 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { generateCode, generateBlocksCode, generatePageCode } from './page' + +export { generateCode, generateBlocksCode, generatePageCode } diff --git a/dl-flow-frontend/packages/vue-generator/src/generator/page.js b/dl-flow-frontend/packages/vue-generator/src/generator/page.js new file mode 100644 index 0000000..fad6884 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/generator/page.js @@ -0,0 +1,523 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { capitalize, hyphenate } from '@vue/shared' +import { + getTypeOfSchema, + avoidDuplicateString, + toPascalCase, + prettierOpts, + isOn, + toEventKey, + addAccessorRecord, + addIconRecord, + handleIconInProps +} from '../utils' +import { validateByParse, validateByCompile } from '../utils/vue-sfc-validator' +import { traverse as traverseState, unwrapExpression } from '../parser/state' +import { preProcess } from '../pre-processor' +import { + DEFAULT_COMPONENTS_MAP, + BUILTIN_COMPONENT_NAME, + JS_FUNCTION, + JS_RESOURCE, + JS_SLOT, + TINY_ICON, + BUILTIN_COMPONENTS_MAP +} from '../constant' + +function recurseChildren(children, state, description, result) { + if (Array.isArray(children)) { + const subTemplate = children.map((child) => generateTemplate(child, state, description)).join('') + result.push(subTemplate) + } else if (children?.type === 'JSExpression') { + result.push(`{{ ${children.value.replace(/this\.(props\.)?/g, '')} }}`) + + Object.keys(description.jsResource).forEach((key) => { + description.jsResource[key] = description.jsResource[key] || children.value.includes(`.${key}.`) + }) + } else if (children?.type === 'i18n') { + result.push(`{{ t('${children.key}') }}`) + } else { + result.push(children || '') + } + + return result +} + +const isEmptySlot = (componentName, children) => + componentName === BUILTIN_COMPONENT_NAME.TEMPLATE && !(children?.length || children?.type) + +function handleSlotBinding(item) { + const { name, params } = item + let slot = `#${name || item}` + + if (Array.isArray(params)) { + slot = `#${name}="{ ${params.join(',')} }"` + } else if (typeof params === 'string') { + slot = `#${name}="${params}"` + } + return slot +} + +const handleEventBinding = (key, item) => { + const eventKey = toEventKey(key) + let eventBinding = '' + + // vue 事件绑定,仅支持:内联事件处理器 or 方法事件处理器(绑定方法名或对某个方法的调用) + if (item?.type === 'JSExpression') { + const eventHandler = item.value.replace(/this\.(props\.)?/g, '') + + // Vue Template 中,为事件处理函数传递额外的参数时,需要使用内联箭头函数 + if (item.params?.length) { + const extendParams = item.params.join(',') + eventBinding = `@${eventKey}="(...eventArgs) => ${eventHandler}(eventArgs, ${extendParams})"` + } else { + eventBinding = `@${eventKey}="${eventHandler}"` + } + } + + return eventBinding +} + +const handleLiteralBinding = ({ key, item, attrsArr, description, state }) => { + // 字面量 + // string 直接静态绑定 + if (typeof item === 'string') return attrsArr.push(`${key}="${item.replace(/"/g, '"')}"`) + + if (item?.componentName === BUILTIN_COMPONENT_NAME.ICON) { + const iconName = handleIconInProps(description, item) + + return attrsArr.push(`:${key}="${iconName}"`) + } + + // 复杂类型(not null),解析协议(如:i18n)后,使用 v-bind 绑定,注意:双引号与单引号的处理 + if (typeof item === 'object') { + traverseState(item, description) + const canotBind = + description.internalTypes.has(JS_FUNCTION) || + description.internalTypes.has(JS_RESOURCE) || + description.internalTypes.has(JS_SLOT) + + // 不能直接绑定的,新建临时变量,以 state 变量的形式绑定 + if (canotBind) { + description.internalTypes = new Set() + const valueKey = avoidDuplicateString(Object.keys(state), key) + state[valueKey] = item + + return attrsArr.push(`:${key}="state.${valueKey}"`) + } + const parsedValue = unwrapExpression(JSON.stringify(item)).replace(/props\./g, '') + + return attrsArr.push(`:${key}="${parsedValue.replace(/"/g, '"')}"`) + } + + // number/boolean/expression 使用 v-bind 绑定 + return attrsArr.push(`:${key}="${item}"`) +} + +function handleBinding(props, attrsArr, description, state) { + Object.entries(props).forEach(([key, item]) => { + // 处理 className + if (key === 'className') { + key = 'class' + } + + // 处理 slot + if (key === 'slot') { + let slot = handleSlotBinding(item) + + return attrsArr.push(slot) + } + + const propType = item?.type || 'literal' + + // 事件名,协议约定以 on 开头的 camelCase 形式,template 中使用 kebab-case 形式 + if (isOn(key)) { + const eventBinding = handleEventBinding(key, item) + + return attrsArr.push(eventBinding) + } + + if (propType === 'literal') { + return handleLiteralBinding({ key, item, attrsArr, description, state }) + } + + if (propType === 'JSExpression') { + // 支持带参数的 v-model + if (item.model) { + const modelArgs = item.model?.prop ? `:${item.model.prop}` : '' + return attrsArr.push(`v-model${modelArgs}="${item.value.replace(/this\.(props\.)?/g, '')}"`) + } + + // expression 使用 v-bind 绑定 + return attrsArr.push(`:${key}="${item.value.replace(/this\.(props\.)?/g, '')}"`) + } + + if (propType === 'i18n') { + const tArguments = [`'${item.key}'`] + const i18nParams = JSON.stringify(item.params)?.replace(/"/g, "'") + + i18nParams && tArguments.push(i18nParams) + + return attrsArr.push(`:${key}="t(${tArguments.join(',')})"`) + } + + return attrsArr + }) +} + +function generateTemplate(schema, state, description, isRootNode = false) { + const result = [] + const { componentName, fileName, loop, loopArgs = ['item'], condition, props = {}, children } = schema + + // // 不生成空 div 作为根节点,兼容支持有页面属性的 div 根节点 + // if (isEmptyRoot(isRootNode, props)) { + // return recurseChildren(children, description, result) + // } + + // 不生成空插槽,否则会影响插槽的默认内容 + if (isEmptySlot(componentName, children)) { + return '' + } + + let component = '' + if (isRootNode) { + component = 'div' + } else if (componentName === BUILTIN_COMPONENT_NAME.BLOCK && fileName) { + component = hyphenate(fileName) + description.blockSet.add(fileName) + } else { + component = hyphenate(componentName || 'div') + description.componentSet.add(componentName) + } + + result.push(`\n<${component} `) + + const attrsArr = [] + + // 循环渲染 v-for, 循环数据支持:变量表达式、数组/对象字面量 + if (loop) { + const loopData = loop.type + ? loop.value.replace(/this\.(props\.)?/g, '') + : JSON.stringify(loop).replace(/"/g, '"') + + attrsArr.push(`v-for="(${loopArgs.join(',')}) in ${loopData}"`) + } + + // 处理 condition, 条件渲染 + if (typeof condition === 'object' || typeof condition === 'boolean') { + const conditionValue = condition?.type ? condition.value.replace(/this\.(props\.)?/g, '') : condition + const directive = condition?.kind || 'if' + const conditionStr = directive === 'else' ? 'v-else' : `v-${directive}="${conditionValue}"` + + attrsArr.push(conditionStr) + } + + handleBinding(props, attrsArr, description, state) + + result.push(attrsArr.join(' ')) + + // 处理 Void elements: 使用自闭合标签,如: + const VOID_ELEMENTS = ['img', 'input', 'br', 'hr', 'link'] + if (VOID_ELEMENTS.includes(component)) { + result.push(' />') + } else { + result.push('>') + + recurseChildren(children, state, description, result) + + result.push(``) + } + + return result.join('') +} + +const generateImports = (description, moduleName, type, componentsMap) => { + const { blockSet, componentSet } = description + const imports = [] + + const importsFromVue = [ + 'import * as vue from "vue"', + 'import { defineProps, defineEmits } from "vue"', + 'import { I18nInjectionKey } from "vue-i18n"' + ] + + imports.push(importsFromVue.join('\n')) + + // import components, support alias import, import from multi packages + const componentsInSFC = [...componentSet] + const componentDeps = componentsMap.filter((item) => componentsInSFC.includes(item.componentName)) + const componentPacks = {} + + componentDeps.forEach((item) => { + const { package: pkg } = item + + if (!componentPacks[pkg]) { + componentPacks[pkg] = [] + } + + componentPacks[pkg].push(item) + }) + + Object.entries(componentPacks).forEach(([pkgName, deps]) => { + const items = deps.map((dep) => { + const { componentName, exportName } = dep + + if (componentName.startsWith(TINY_ICON)) { + addIconRecord(description, componentName) + + return exportName + } + + return exportName && exportName !== componentName ? `${exportName} as ${componentName}` : `${componentName}` + }) + + imports.push(`import { ${items.join(',')} } from '${pkgName}'`) + }) + + // import blocks, support PascalCase or kebab-case of blockName + const importBlocks = [...blockSet] + const blocksName = importBlocks.map((item) => toPascalCase(item)) + const blocks = [] + + const blocksPathMap = componentsMap + .filter((item) => !item.package && typeof item.main === 'string') + .reduce((acc, { componentName: block, main: path }) => ({ ...acc, [block]: path }), {}) + const componentNames = componentsMap.map(({ componentName }) => componentName) + const needImportBlocks = blocksName.filter((name) => componentNames.includes(name)) + + needImportBlocks.forEach((block) => { + const { [moduleName]: fromPath, [block]: toPath } = blocksPathMap + + if (typeof toPath === 'string') { + let depPath = toPath || '.' + + if (typeof fromPath !== 'string') { + depPath = toPath || '.' + } else if (toPath === fromPath) { + depPath = '.' + } else { + const path = require('path') + const relativePath = path?.relative(fromPath, toPath).replace(/\\/g, '/') + depPath = relativePath.startsWith('.') ? relativePath : `./${relativePath}` + } + + blocks.push(`import ${block} from '${depPath}/${block}.vue'`) + } else { + const blockDefaultPath = + type === 'Block' ? `import ${block} from './${block}.vue'` : `import ${block} from '../components/${block}.vue'` + + blocks.push(blockDefaultPath) + } + }) + + imports.push(...blocks) + + return { imports } +} + +const generateVueCode = ({ schema, name, type, componentsMap }) => { + const { css = '', schema: { properties = [], events = {} } = {}, state = {}, lifeCycles = {}, methods = {} } = schema + const description = { + blockSet: new Set(), + componentSet: new Set(), + iconComponents: { componentNames: [], exportNames: [] }, + stateAccessor: [], + internalTypes: new Set(), + hasJSX: false, + jsResource: { utils: false, bridge: false } + } + + const template = generateTemplate(schema, state, description, true) + + const propsArr = [] + const propsAccessor = [] + properties.forEach(({ content = [] }) => { + content.forEach(({ property, type, defaultValue, accessor }) => { + let propType = capitalize(type) + let propValue = defaultValue + + if (propType === 'String') { + propValue = JSON.stringify(defaultValue) + } else if (['Array', 'Object'].includes(propType)) { + propValue = `() => (${JSON.stringify(defaultValue)})` + } else if (propType === 'Function') { + propValue = defaultValue.value + } + + propsArr.push(`${property}: { type: ${propType}, default: ${propValue} }`) + + addAccessorRecord(accessor, propsAccessor) + }) + }) + + const emitsArr = Object.keys(events).map(toEventKey) + + // 转换 state 中的特殊类型 + traverseState(state, description) + + const usedResource = Object.keys(description.jsResource).filter((key) => description.jsResource[key]) + const resourceStatement = usedResource.length + ? `const { ${usedResource.join(',')} } = wrap(function() { return this })()` + : '' + + const reactiveStatement = `const state = vue.reactive(${unwrapExpression(JSON.stringify(state, null, 2))})` + + const allAccessor = [...propsAccessor, ...description.stateAccessor] + const accessorStatement = allAccessor.map((func) => `vue.watchEffect(wrap(${func}))`).join('\n') + + const methodsName = Object.keys(methods) + const methodsArr = Object.entries(methods).map(([key, item]) => `const ${key} = wrap(${item.value})`) + + const { setup, ...restLifecycles } = lifeCycles + const setupStatement = setup ? `const setup = wrap(${setup.value})` : '' + const setupExecution = setup ? 'setup({ props, context: { emit }, state, ...vue })' : '' + + const lifecycles = Object.entries(restLifecycles).map(([key, item]) => `vue.${key}(wrap(${item.value}))`) + + const scriptLang = description.hasJSX ? 'lang="jsx"' : '' + + const { imports } = generateImports(description, name, type, componentsMap) + const { componentNames, exportNames } = description.iconComponents + const iconStatement = componentNames.length + ? `const [${componentNames.join(',')}] = [${exportNames.map((name) => `${name}()`).join(',')}]` + : '' + + const contextArr = ['stores', 'state', ...methodsName] + + const result = ` + + + + + +` + return result +} + +const getFilePath = (type = 'page', name = '', componentsMap) => { + const blocksPathMap = componentsMap + .filter((item) => !item.package && typeof item.main === 'string') + .reduce((acc, { componentName: block, main: path }) => ({ ...acc, [block]: path }), {}) + + const path = blocksPathMap[name] + const defaultPathMap = { Block: 'components', Page: 'views' } + + return path ? path : defaultPathMap[type] || name +} + +const generatePageCode = ({ pageInfo, componentsMap, isEntry = true }) => { + const { schema: originSchema, name } = pageInfo + + // 深拷贝,避免副作用改变传入的 schema 值 + const schema = JSON.parse(JSON.stringify(originSchema)) + preProcess(schema) + + const type = getTypeOfSchema(schema) + const vueCode = generateVueCode({ schema, name, type, componentsMap }) + + const panels = [ + { + panelName: `${name}.vue`, + panelValue: vueCode, + panelType: 'vue', + prettierOpts: prettierOpts.vue, + type, + index: isEntry, + filePath: getFilePath(type, name, componentsMap) + } + ] + + const result = panels.map((panel) => { + const { panelName, panelValue, panelType } = panel + let errors = [] + + if (panelType === 'vue') { + errors = validateByParse(panelValue) + + if (!errors.length) { + errors = validateByCompile(panelName, panelValue) + } + } + + return { ...panel, errors } + }) + + return result +} + +const generateBlocksCode = ({ blocksData, componentsMap }) => { + const result = {} + blocksData.forEach((block) => { + if (!block.label || !block.content) return + const name = toPascalCase(block.label) + const pageInfo = { name, schema: block.content } + const pageCodeResult = generatePageCode({ pageInfo, componentsMap, isEntry: false }) + result[block.label] = pageCodeResult + }) + return result +} + +const generateCode = ({ pageInfo, componentsMap = [], blocksData = [] }) => { + // 过滤外部传入的无效 componentMap,比如:可能传入 HTML 原生标签 package: '' + // 注意区分区块 package: undefined, main: string(区块路径 main,空字符串表示当前目录,等价于 './') + const validComponents = componentsMap.filter( + ({ componentName, package: pkg, main }) => componentName && (pkg || typeof main === 'string') + ) + const allComponents = [...validComponents, ...DEFAULT_COMPONENTS_MAP, ...BUILTIN_COMPONENTS_MAP] + + // 对象数组,去重 + const allComponentsMap = new Map() + allComponents.forEach( + (item) => !allComponentsMap.has(item.componentName) && allComponentsMap.set(item.componentName, item) + ) + const componentDepsPath = [...allComponentsMap.values()] + + const blocksCode = generateBlocksCode({ blocksData, componentsMap: componentDepsPath }) + const pagesCode = generatePageCode({ pageInfo, componentsMap: componentDepsPath }) + + return [...pagesCode, ...Object.values(blocksCode).flat()] +} + +export { generateCode, generateBlocksCode, generatePageCode } diff --git a/dl-flow-frontend/packages/vue-generator/src/index.js b/dl-flow-frontend/packages/vue-generator/src/index.js new file mode 100644 index 0000000..4da0c2d --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/index.js @@ -0,0 +1,15 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { generateCode, generateBlocksCode, generatePageCode } from './generator' + +export { generateCode, generateBlocksCode, generatePageCode } diff --git a/dl-flow-frontend/packages/vue-generator/src/parser/jsx-slot.js b/dl-flow-frontend/packages/vue-generator/src/parser/jsx-slot.js new file mode 100644 index 0000000..6d3639b --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/parser/jsx-slot.js @@ -0,0 +1,118 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { BUILTIN_COMPONENT_NAME, TINY_ICON } from '../constant' +import { addIconRecord, handleIconInProps } from '../utils' + +function handleExprBinding(key, item, attrsArr) { + const propValue = item.value.replace(/this\./g, '') + + if (item.model) { + const modelArgs = item.model?.prop ? `:${item.model.prop}` : '' + return attrsArr.push(`v-model${modelArgs}={${propValue}}`) + } + + // JSX 中,为事件处理函数传递额外的参数时,需要使用内联箭头函数 + if (item.params?.length) { + const extendParams = item.params.join(',') + + return attrsArr.push(`${key}={(...eventArgs) => ${propValue}(eventArgs, ${extendParams})}`) + } + + return attrsArr.push(`${key}={${propValue}}`) +} + +function handleBinding(props, attrsArr, description) { + Object.entries(props).map(([key, item]) => { + const propType = item?.type || 'literal' + + if (['JSExpression', 'JSFunction'].includes(propType)) { + return handleExprBinding(key, item, attrsArr) + } + + // 字面量 + if (propType === 'literal') { + if (item?.componentName === BUILTIN_COMPONENT_NAME.ICON) { + const iconName = handleIconInProps(description, item) + + return attrsArr.push(`${key}={${iconName}}`) + } + + if (typeof item === 'string') return attrsArr.push(`${key}="${item}"`) + if (typeof item === 'boolean') return attrsArr.push(item ? key : '') + } + + if (propType === 'i18n') { + return attrsArr.push(`${key}={t('${item.key}')}`) + } + + return attrsArr.push(`${key}={${JSON.stringify(item)}}`) + }) +} + +const generateJSXTemplate = (item, description) => { + const result = [] + const { componentName, fileName, props = {}, children, condition } = item + + let component = '' + if (componentName === BUILTIN_COMPONENT_NAME.BLOCK && fileName) { + component = fileName + description.blockSet.add(fileName) + } else { + component = componentName || item.component || 'div' + description.componentSet.add(component) + + if (componentName?.startsWith(TINY_ICON)) { + addIconRecord(description, componentName) + } + } + + const attrsArr = [] + + // 处理 condition, 条件渲染 + if (condition) { + const conditionValue = condition?.type ? condition.value.replace(/this\./g, '') : condition + result.push(`{ ${conditionValue} && `) + } + + result.push(`<${component} `) + + handleBinding(props, attrsArr, description) + + result.push(attrsArr.join(' ')) + + // 处理 Void elements: 使用自闭合标签,如: + const VOID_ELEMENTS = ['img', 'input', 'br', 'hr', 'link'] + if (VOID_ELEMENTS.includes(component)) { + result.push(' />') + } else { + result.push('>') + + if (Array.isArray(children)) { + const subTemplate = children.map((child) => generateJSXTemplate(child, description)).join('') + result.push(subTemplate) + } else if (children?.type === 'JSExpression') { + result.push(`{ ${children.value.replace(/this\./g, '')} }`) + } else if (children?.type === 'i18n') { + result.push(`{t('${children.key}')}`) + } else { + result.push(children || '') + } + + result.push(``) + } + condition && result.push(' }') + + return result.join('') +} + +export { generateJSXTemplate } diff --git a/dl-flow-frontend/packages/vue-generator/src/parser/state-type.js b/dl-flow-frontend/packages/vue-generator/src/parser/state-type.js new file mode 100644 index 0000000..c78645d --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/parser/state-type.js @@ -0,0 +1,82 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { UNWRAP_QUOTES, JS_EXPRESSION, JS_FUNCTION, JS_I18N, JS_RESOURCE, JS_SLOT } from '../constant' +import { getFunctionInfo, hasAccessor, addAccessorRecord } from '../utils' +import { preProcess } from '../pre-processor' +import { generateJSXTemplate } from './jsx-slot' + +const { start, end } = UNWRAP_QUOTES + +const strategy = { + [JS_EXPRESSION]: ({ value, computed }) => { + if (computed) { + return `${start}vue.computed(${value.replace(/this\./g, '')})${end}` + } + + return `${start}${value.replace(/this\./g, '')}${end}` + }, + + [JS_FUNCTION]: ({ value }) => { + const { type, params, body } = getFunctionInfo(value) + const inlineFunc = `${type} (${params.join(',')}) => { ${body.replace(/this\./g, '')} }` + + return `${start}${inlineFunc}${end}` + }, + + [JS_I18N]: ({ key }) => `${start}t("${key}")${end}`, + + [JS_RESOURCE]: ({ value }, description) => { + const resourceType = value.split('.')[1] + + if (Object.prototype.hasOwnProperty.call(description.jsResource, resourceType)) { + description.jsResource[resourceType] = true + } + + return `${start}${value.replace(/this\./g, '')}${end}` + }, + + [JS_SLOT]: ({ value = [], params = ['row'] }, description) => { + description.hasJSX = true + + // 处理协议中的特殊情况,如:Icon 协议转换、Collection 使用 div 渲染 + value.forEach(preProcess) + const slotValues = value.map((item) => generateJSXTemplate(item, description)).join('') + + // 默认解构参数 row,因为jsx slot 必须有第二个参数 h + return `${start}({ ${params.join(',')} }, h) => ${slotValues}${end}` + } +} + +/** + * 对协议中的类型做特殊处理,相应转换为字符串 + * @param {*} current 原始对象 + * @param {*} prop 当前对象的属性字段 + * @param {*} description 记录使用到的外部资源 + */ +const transformType = (current, prop, description) => { + const builtInTypes = [JS_EXPRESSION, JS_FUNCTION, JS_I18N, JS_RESOURCE, JS_SLOT] + const { type, accessor, defaultValue } = current[prop] || {} + + if (builtInTypes.includes(type)) { + description.internalTypes.add(type) + current[prop] = strategy[type](current[prop], description) + } + + if (hasAccessor(accessor)) { + current[prop] = defaultValue + + addAccessorRecord(accessor, description.stateAccessor) + } +} + +export { transformType } diff --git a/dl-flow-frontend/packages/vue-generator/src/parser/state.js b/dl-flow-frontend/packages/vue-generator/src/parser/state.js new file mode 100644 index 0000000..9d37568 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/parser/state.js @@ -0,0 +1,39 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { UNWRAP_QUOTES } from '../constant' +import { transformType } from './state-type' + +const traverse = (current, description) => { + if (typeof current !== 'object') return + + if (Array.isArray(current)) { + current.forEach((prop) => traverse(prop, description)) + } else if (typeof current === 'object') { + Object.keys(current || {}).forEach((prop) => { + if (Object.prototype.hasOwnProperty.call(current, prop)) { + // 解析协议中的类型 + transformType(current, prop, description) + traverse(current[prop], description) + } + }) + } +} + +const { start, end } = UNWRAP_QUOTES + +const unwrapExpression = (slotsValue) => + slotsValue.replace(new RegExp(`"${start}(.*?)${end}"`, 'g'), (match, p1) => + p1.replace(/\\"/g, '"').replace(/\\r\\n|\\r|\\n/g, '') + ) + +export { traverse, unwrapExpression } diff --git a/dl-flow-frontend/packages/vue-generator/src/pre-processor/index.js b/dl-flow-frontend/packages/vue-generator/src/pre-processor/index.js new file mode 100644 index 0000000..331910b --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/pre-processor/index.js @@ -0,0 +1,94 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { BUILTIN_COMPONENT_NAME, TINY_ICON } from '../constant' + +const text2Span = (schema) => { + const { componentName, props = {} } = schema + + if (componentName === BUILTIN_COMPONENT_NAME.TEXT) { + schema.componentName = 'span' + + if (props.text) { + schema.children = props.text + delete props.text + } + } + + return schema +} + +const tinyIcon = (schema) => { + const { componentName, props = {} } = schema + + if (componentName === BUILTIN_COMPONENT_NAME.ICON && props.name) { + // 图标组件名,统一前缀为 TinyIcon,与从组件库引入的方法名 iconXxx 区分开 + const iconName = props.name.startsWith(TINY_ICON) ? props.name : `Tiny${props.name}` + schema.componentName = iconName + delete props.name + } + + return schema +} + +const tinyGrid = (schema) => { + const { componentName, props = {} } = schema + + if (componentName === 'TinyGrid' && props.data && props.fetchData) { + delete props.data + } + + return schema +} + +const collection2Div = (schema) => { + const { componentName } = schema + + if (componentName === BUILTIN_COMPONENT_NAME.COLLECTION) { + schema.componentName = 'div' + } + + return schema +} + +const component2Block = (schema) => { + const { componentType, componentName, fileName } = schema + + if (componentType === BUILTIN_COMPONENT_NAME.BLOCK) { + schema.fileName = componentName + schema.componentName = BUILTIN_COMPONENT_NAME.BLOCK + } + + if (componentName && componentName === fileName) { + schema.componentName = BUILTIN_COMPONENT_NAME.BLOCK + } + + return schema +} + +const preProcess = (schema) => { + const { children } = schema + + text2Span(schema) + tinyIcon(schema) + tinyGrid(schema) + collection2Div(schema) + component2Block(schema) + + if (Array.isArray(children)) { + children.forEach(preProcess) + } + + return schema +} + +export { preProcess, tinyIcon } diff --git a/dl-flow-frontend/packages/vue-generator/src/utils/index.js b/dl-flow-frontend/packages/vue-generator/src/utils/index.js new file mode 100644 index 0000000..e39e9f1 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/utils/index.js @@ -0,0 +1,163 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { capitalize, hyphenate } from '@vue/shared' +import { tinyIcon as unifyIconName } from '../pre-processor' +import { TINY_ICON, JS_FUNCTION } from '../constant' + +const getTypeOfSchema = (schema) => schema.componentName + +const getFunctionInfo = (fnStr) => { + const fnRegexp = /(async)?.*?(\w+) *\(([\s\S]*?)\) *\{([\s\S]*)\}/ + const result = fnRegexp.exec(fnStr) + if (result) { + return { + type: result[1] || '', + name: result[2], + params: result[3] + .split(',') + .map((item) => item.trim()) + .filter((item) => Boolean(item)), + body: result[4] + } + } + return null +} + +const safeRandom = () => { + const mathConstructor = Math + + return mathConstructor.random +} + +const randomString = (length = 4, chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') => { + let result = '' + for (let i = length; i > 0; --i) { + result += chars[Math.floor(safeRandom() * chars.length)] + } + return result +} + +const avoidDuplicateString = (existings, str) => { + let result = str + let suffix = 1 + + while (existings.includes(result)) { + result = `${str}${suffix}` + suffix++ + } + + return result +} + +const lowerFirst = (str) => str[0].toLowerCase() + str.slice(1) + +/** + * 将输入字符串转换为 PascalCase 风格, 默认可转换 kebab-case/camelCase + * @param {string} input 源字符串 + * @param {string} delimiter 定界符。默认使用连字符,以支持转换 kebab-case + * @returns {string} PascalCase 风格的字符串 + */ +const toPascalCase = (input, delimiter = '-') => input.split(delimiter).map(capitalize).join('') + +const commonOpts = { + printWidth: 120, + semi: false, + singleQuote: true, + trailingComma: 'none' +} +const prettierOpts = { + vue: { ...commonOpts, parser: 'vue', htmlWhitespaceSensitivity: 'ignore' }, + js: { ...commonOpts, parser: 'typescript' } +} + +const onRE = /^on([A-Z]\w*)/ +const onUpdateRE = /^on(Update:\w+)/ + +const isOn = (key) => onRE.test(key) +const isOnUpdate = (key) => onUpdateRE.test(key) + +const toEventKey = (str) => { + const strRemovedPrefix = str.replace(onRE, '$1') + + if (isOnUpdate(str)) { + return lowerFirst(strRemovedPrefix) + } + + return hyphenate(strRemovedPrefix) +} + +const isGetter = (accessor) => accessor?.getter?.type === JS_FUNCTION +const isSetter = (accessor) => accessor?.setter?.type === JS_FUNCTION +const hasAccessor = (accessor) => isGetter(accessor) || isSetter(accessor) + +const addAccessorRecord = (accessor, record) => { + if (isGetter(accessor)) { + record.push(accessor.getter.value) + } + + if (isSetter(accessor)) { + record.push(accessor.setter.value) + } +} + +/** + * TinyIcon 需要从方法返回图标组件,所以需要记录生成图标定义语句所需信息 + * @param {Object} description 记录中间产物的描述信息 + * @param {Object} description.iconComponents 记录定义图标组件所需属性,componentNames/exportNames 要保持对应关系 + * @param {string[]} description.iconComponents.componentNames 模板中的图标组件名集合 + * @param {string[]} description.iconComponents.exportNames 与 componentNames 对应的 TinyVue 组件库中图标组件名集合 + * @param {string} componentName 模板中的图标组件名,前缀为 TinyIcon + */ +const addIconRecord = (description, componentName) => { + const { componentNames, exportNames } = description.iconComponents + + if (!componentNames.includes(componentName)) { + const exportName = componentName.replace(TINY_ICON, 'icon') + + componentNames.push(componentName) + exportNames.push(exportName) + } +} + +/** + * 处理组件中的 icon 属性绑定 + * @param {Object} description 记录中间产物的描述信息 + * @param {Set} description.componentSet 记录 SFC 中的组件 + * @param {Object} iconProp icon 属性值描述 + * @returns {string} iconName 用于属性绑定的图标组件名,前缀为 TinyIcon + */ +const handleIconInProps = (description, iconProp) => { + const { componentName: iconName } = unifyIconName(iconProp) + + description.componentSet.add(iconName) + addIconRecord(description, iconName) + + return iconName +} + +export { + getTypeOfSchema, + getFunctionInfo, + safeRandom, + randomString, + avoidDuplicateString, + lowerFirst, + toPascalCase, + prettierOpts, + isOn, + toEventKey, + hasAccessor, + addAccessorRecord, + addIconRecord, + handleIconInProps +} diff --git a/dl-flow-frontend/packages/vue-generator/src/utils/vue-sfc-validator.js b/dl-flow-frontend/packages/vue-generator/src/utils/vue-sfc-validator.js new file mode 100644 index 0000000..0b7bbe3 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/src/utils/vue-sfc-validator.js @@ -0,0 +1,155 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { parse as parseSFC, compileScript, compileStyle, compileTemplate } from '@vue/compiler-sfc' +import { generateCodeFrame } from '@vue/shared' +import { randomString } from '.' + +/** + * 使用 vue-eslint-parser,校验 vue sfc 是否有效 + * @param {string} code 源码 + * @returns {Error[]} 校验出的报错信息 + */ +export function validateByParse(code) { + const { parse: parseVue } = require('vue-eslint-parser') + let errors = [] + + try { + const { templateBody, errors: parseErrors } = parseVue(code, { + ecmaVersion: 'latest', + sourceType: 'module', + ecmaFeatures: { + jsx: true + } + }) + errors = templateBody?.errors || parseErrors || [] + } catch (error) { + // 此处可捕获到 SyntaxError,如:嵌套双引号未转义的问题 + errors.push(unify(error)) + } + + return errors.map(({ message, lineNumber: line, column }) => { + if (line && column) { + return locateErrorMessage(code, { message, loc: { start: { line, column } } }) + } + + return { message } + }) +} + +/** + * 使用 @vue/compiler-sfc, 校验 vue sfc 是否有效 + * @param {string} filename 文件名称 + * @param {string} code 源码 + * @returns {Error[]} 校验出的错误信息 + */ +export function validateByCompile(filename, code) { + // validate via parse + const { errors, descriptor } = parseSFC(code, { + filename, + sourceMap: false + }) + + if (errors.length) { + return errors.map((error) => locateErrorMessage(code, error)) + } + + const id = randomString() + + // validate via compile script + let bindingMetadata + try { + const scriptResult = compileScript(descriptor, { id }) + bindingMetadata = scriptResult.bindings + } catch (error) { + // error 可能的类型 string | ParseError (@babel/parser) | CompilerError (compileScript 使用 inlineTemplate 模式时) + const scriptError = unify(error) + + // 如果是 ParseError 类型,转换为 locateErrorMessage 可接受的 CompilerError 类型传入 + if (!scriptError?.loc?.start && scriptError?.loc?.line) { + // 只截取原 message 的第一行,后面行数可能已经包含错误的定位信息,避免拼接重复 + const message = scriptError.message.match(/.*/)[0] + const { line, column } = scriptError.loc + + // compileScript 内部抛错误时,可能已定位编译报错信息,但报错所在的行可能有大量字符,此处精简一下 + return [locateErrorMessage(code, { message, loc: { start: { line, column } } })] + } + + return [{ message: scriptError.message }] + } + + // validate via compile template + const { styles, template, slotted } = descriptor + const scoped = styles.some((s) => s.scoped) + + const templateResult = compileTemplate({ + source: template.content, + filename, + id, + scoped, + slotted, + compilerOptions: { bindingMetadata } + }) + + if (templateResult.errors.length) { + return templateResult.errors.map(unify).map((error) => locateErrorMessage(code, error)) + } + + // validate via compile style + // 目前暂时没有预处理器,如:less + const stylesResult = styles.map(({ content, module }) => + compileStyle({ source: content, filename, id, scoped, modules: Boolean(module) }) + ) + const errorsInStyles = stylesResult + .filter(({ errors }) => errors.length) + .map(({ errors }) => errors) + .flat() + + return errorsInStyles +} + +/** + * 统一报错的格式 + * @param {(string | Error)} error 原始错误信息 + * @returns {Error} 统一格式后的错误信息 + */ +function unify(error) { + if (typeof error === 'string') { + return { message: error } + } + + return error +} + +/** + * 定位报错信息,如果包含报错位置,则追加到 message 中输出 + * @param {string} originalSource 原始代码 + * @param {(Error | CompilerError)} error 错误信息 + * @returns {{message: string}} 可能包含报错位置的错误信息 + */ +function locateErrorMessage(originalSource, error) { + let { loc, message } = error + + if (loc?.start) { + const { line, column } = loc.start + const errorLineCode = originalSource.split(/\r?\n/)[line - 1] + + // 源码字符串未经格式化,报错所在的行可能有大量字符,截取报错位置附近范围的错误信息,比如:前后 50 字符内 + const SCOPE = 50 + const scopeStartIndex = Math.max(0, column - SCOPE) + const scopeCode = errorLineCode.slice(scopeStartIndex, column + SCOPE) + + message = `${message} \n ${generateCodeFrame(scopeCode, column - scopeStartIndex)}` + } + + return { message } +} diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/blocks.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/blocks.schema.json new file mode 100644 index 0000000..f6de5ae --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/blocks.schema.json @@ -0,0 +1,212 @@ +[ + { + "label": "ImageTitle", + "content": { + "componentName": "Block", + "fileName": "ImageTitle", + "css": ".image-title {\n margin-right: 15px;\ndisplay: flex;\n align-items: center; \n}\n.crm-title {\n margin-left: 8px;\n font-family: PingFangSC-Regular; \nfont-size: 22px; \ncolor: #333333; \nline-height: 30px; \n}\n.split {\r\n align-self: center;\r\n width: 1px;\r\n height: 20px;\r\n background-color: #dddee4;\r\n margin-left: 20px;\r\n}\r\n", + "props": {}, + "lifeCycles": {}, + "children": [ + { + "componentName": "div", + "id": "ImageTitleizk3", + "props": { + "className": "image-title", + "onClick": { + "type": "JSExpression", + "value": "this.handleClick" + } + }, + "children": [ + { + "componentName": "img", + "id": "imageizk3", + "props": { + "src": { + "type": "JSExpression", + "value": "this.props.src" + } + } + }, + { + "componentName": "span", + "id": "spanizk3", + "props": { + "className": "crm-title" + }, + "children": { + "type": "JSExpression", + "value": "this.props.text" + } + }, + { + "componentName": "span", + "id": "spanizk4", + "condition": { + "type": "JSExpression", + "value": "this.props.hasSplitLine" + }, + "props": { + "className": "split" + } + } + ] + } + ], + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "handleClick", + "type": "Function", + "defaultValue": { + "type": "Function", + "value": "function handleClick(event) { return event }" + }, + "label": { + "text": { + "zh_CN": "点击Image触发事件" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "options", + "type": "Array", + "defaultValue": [], + "label": { + "text": { + "zh_CN": "选项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaCodeEditor", + "props": { + "modelValue": [] + } + } + }, + { + "property": "src", + "type": "string", + "defaultValue": "https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/TinyLowCode/crm/img/bussiness/businessmanage.svg", + "label": { + "text": { + "zh_CN": "图片地址" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": { + "modelValue": "https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/TinyLowCode/crm/img/bussiness/businessmanage.svg" + } + } + }, + { + "property": "text", + "type": "String", + "defaultValue": "商务管理", + "label": { + "text": { + "zh_CN": "标题文本" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": { + "modelValue": "商务管理" + } + } + }, + { + "property": "hasSplitLine", + "type": "Boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否添加分割线" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": { + "modelValue": true + } + } + } + ] + } + ], + "events": { + "onClickLogo": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "通常用于配置处理点击跳转" + } + } + } + }, + "state": { + "activeMethod": { + "type": "JSFunction", + "value": "function() {\n return this.props.isEdit;\r\n}" + } + }, + "methods": { + "handleClick": { + "type": "JSFunction", + "value": "function() { this.emit('click-logo') }" + } + } + } + } +] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/components-map.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/components-map.json new file mode 100644 index 0000000..41c01dd --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/components-map.json @@ -0,0 +1,28 @@ +[ + { + "componentName": "TinyButton", + "exportName": "Button", + "package": "@opentiny/vue", + "version": "^3.10.0", + "destructuring": true + }, + { + "componentName": "Img", + "exportName": "", + "package": "", + "version": "1.0.0", + "destructuring": true + }, + { + "componentName": "FormTable", + "main": "./views" + }, + { + "componentName": "ImageTitle", + "main": "./components" + }, + { + "componentName": "CrmQuoteListGridStatus", + "main": "./views/crm/quote-list" + } +] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/page.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/page.schema.json new file mode 100644 index 0000000..bda02c6 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/input/page.schema.json @@ -0,0 +1,715 @@ +{ + "version": "1.1", + "componentName": "Page", + "fileName": "FormTable", + "css": ".overflow-container .card {\n padding-bottom: 8px;\n}\n.main-body {\n display: flex;\n flex: 1;\n flex-direction: column;\n margin: 20px 20px 9px 20px;\n}\n.card {\n padding: 20px 20px;\n background-color: #ffffff;\n box-shadow: 0 2px 10px 0 rgb(0 0 0 / 6%);\n border-radius: 2px;\n}\n.manage-list {\n margin-bottom: 60px !important;\n} .crm-title-wrapper{\n display: flex;\n justify-content: start;\n align-items: center;\n margin-bottom: 20px;\n gap: 20px;\n}\n .crm-import-button:not(:last-child) {\n margin-right: 10px;\n}", + "props": {}, + "children": [ + { + "componentName": "Text", + "props": { + "style": "background: url(\"**/public/logo.png\");", + "className": "page-header", + "text": "标题区" + } + }, + { + "componentName": "Text", + "props": { + "style": "background: url('**/public/background.png');", + "text": "副标题区" + } + }, + { + "componentName": "Template", + "props": { + "text": "空插槽,出码会跳过此节点" + }, + "children": [] + }, + { + "componentName": "ImageTitle", + "fileName": "ImageTitle", + "props": { + "className": { + "type": "JSExpression", + "value": "['basic-info', {'form-fixed-layout': this.props.isFixed}, {'form-auto-layout': this.props.isAuto}]" + }, + "text": "配置报价", + "hasSplitLine": false, + "onClickLogo": { + "type": "JSExpression", + "value": "this.handleReset", + "params": ["state.flag"] + } + } + }, + { + "componentName": "TinyForm", + "props": { + "inline": true, + "style": { + "margin": "12px" + }, + "className": "form" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": { + "type": "i18n", + "key": "company.name" + } + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "disabled": false, + "value": { + "type": "JSExpression", + "value": "state.companyName" + } + } + } + ] + }, + { + "componentName": "TinyFormItem", + "condition": { + "type": "JSExpression", + "value": "state.cityOptions.length" + }, + "children": [ + { + "componentName": "Template", + "props": { + "slot": "label" + }, + "children": "城市" + }, + { + "componentName": "TinySelect", + "props": { + "value": { + "type": "JSExpression", + "value": "state.companyCity" + }, + "options": [ + { + "label": { + "type": "i18n", + "key": "city.foochow", + "zh_CN": "福州", + "en_US": "Foochow" + }, + "value": 0 + }, + { + "label": "深'i'圳", + "value": 1 + }, + { + "label": "中山", + "value": 2 + }, + { + "label": "龙岩", + "value": 3 + }, + { + "label": "韶关", + "value": 4 + }, + { + "label": "黄冈", + "value": 5 + }, + { + "label": "赤壁", + "value": 6 + }, + { + "label": "厦门", + "value": 7 + } + ] + } + } + ] + }, + { + "componentName": "TinyFormItem", + "props": {}, + "children": [ + { + "componentName": "Text", + "props": { + "className": "form-footer", + "text": "表单提交区" + } + }, + { + "componentName": "TinyButton", + "props": { + "type": "primary", + "icon": { + "componentName": "Icon", + "props": { + "name": "IconSearch" + } + }, + "onClick": { + "type": "JSExpression", + "value": "this.handleSearch" + } + }, + "children": "搜索" + }, + { + "componentName": "TinyButton", + "props": { + "onClick": { + "type": "JSExpression", + "value": "this.handleReset" + } + }, + "children": { + "type": "i18n", + "key": "operation.reset" + } + } + ] + } + ] + }, + { + "componentName": "Collection", + "props": { + "dataSource": "a5f6ef4f" + }, + "children": [ + { + "componentName": "TinyGrid", + "props": { + "columns": { + "type": "JSExpression", + "value": "state.columns" + }, + "data": { + "type": "JSExpression", + "value": "state.tableData" + }, + "fetchData": { + "type": "JSExpression", + "value": "{ api: getTableData }" + } + } + } + ] + }, + { + "componentName": "Collection", + "props": { + "dataSource": "a5f6ef4f" + }, + "children": [ + { + "componentName": "TinyGrid", + "props": { + "columns": [ + { "type": "index", "width": 60, "title": "" }, + { "type": "selection", "width": 60 }, + { + "field": "employees", + "title": "员工数", + "slots": { + "default": { + "type": "JSSlot", + "params": ["row", "rowIndex"], + "value": [{ "componentName": "TinyInput", "props": {}, "id": "49e232ce" }] + } + } + }, + { "field": "city", "title": "城市" }, + { + "title": "产品", + "slots": { + "default": { + "type": "JSSlot", + "params": ["row"], + "value": [ + { + "componentName": "div", + "id": "592fbc05", + "children": [{ "componentName": "TinySwitch", "props": { "modelValue": "" }, "id": "46a60c6f" }] + } + ] + } + } + }, + { + "title": "操作", + "slots": { + "default": { + "type": "JSSlot", + "value": [ + { + "componentName": "TinyButton", + "props": { + "text": "删除", + "icon": { + "componentName": "Icon", + "props": { + "name": "IconDel" + } + }, + "onClick": { + "type": "JSExpression", + "value": "this.emit", + "params": ["row"] + } + } + } + ] + } + } + } + ], + "data": { + "type": "JSExpression", + "value": "state.tableData" + }, + "fetchData": { + "type": "JSExpression", + "value": "{ api: getTableData }" + } + } + } + ] + }, + { + "componentName": "div", + "props": { + "style": { + "width": { + "type": "JSExpression", + "value": "this.props.quotePopWidth" + } + } + }, + "children": "循环渲染:" + }, + { + "componentName": "Icon", + "condition": false, + "props": { + "name": "TinyIconHelpCircle" + } + }, + { + "children": [ + { + "componentName": "TinyButton", + "loop": { + "type": "JSExpression", + "value": "state.buttons" + }, + "loopArgs": ["item", "index"], + "props": { + "key": { + "type": "JSExpression", + "value": "item.text" + }, + "type": { + "type": "JSExpression", + "value": "item.type" + }, + "text": { + "type": "JSExpression", + "value": "index + item.text" + } + } + } + ] + }, + { + "componentName": "br" + }, + { + "children": [ + { + "componentName": "TinyButton", + "loop": [ + { + "type": "primary", + "text": "字面量" + }, + { + "type": "success", + "text": "字面量" + }, + { + "type": "danger", + "text": "危险操作" + } + ], + "loopArgs": ["item"], + "props": { + "key": { + "type": "JSExpression", + "value": "item.text" + }, + "type": { + "type": "JSExpression", + "value": "item.type" + }, + "text": { + "type": "JSExpression", + "value": "item.text" + } + } + } + ] + } + ], + "state": { + "IconPlusSquare": { + "type": "JSResource", + "value": "this.utils.IconPlusSquare()" + }, + "theme": "{ \"id\": 22, \"name\": \"@cloud/tinybuilder-theme-dark\", \"description\": \"黑暗主题\" }", + "companyName": "", + "companyOptions": null, + "companyCity": "", + "cityOptions": [ + { + "label": "福州", + "value": 0 + }, + { + "label": "深圳", + "value": 1 + }, + { + "label": "中山", + "value": 2 + }, + { + "label": "龙岩", + "value": 3 + }, + { + "label": "韶关", + "value": 4 + }, + { + "label": "黄冈", + "value": 5 + }, + { + "label": "赤壁", + "value": 6 + }, + { + "label": "厦门", + "value": 7 + } + ], + "editConfig": { + "trigger": "click", + "mode": "cell", + "showStatus": true, + "activeMethod": { + "type": "JSFunction", + "value": "function() { return this.props.isEdit }" + } + }, + "columns": [ + { + "type": { + "type": "JSExpression", + "value": "this.props.isEdit ? 'selection' : 'index'" + }, + "width": "60", + "title": { + "type": "JSExpression", + "value": "this.props.isEdit ? '' : '序号'" + } + }, + { + "field": "status", + "title": "状态", + "filter": { + "layout": "input,enum,default,extends,base", + "inputFilter": { + "component": { + "type": "JSResource", + "value": "this.utils.Numeric" + }, + "attrs": { "format": "yyyy/MM/dd hh:mm:ss" }, + "relation": "A", + "relations": [ + { + "label": "小于", + "value": "A", + "method": { + "type": "JSFunction", + "value": "function({ value, input }) { return value < input }" + } + }, + { "label": "等于", "value": "equals" }, + { "label": "大于", "value": "greaterThan" } + ] + }, + "extends": [ + { + "label": "我要过滤大于800的数", + "method": { + "type": "JSFunction", + "value": "function({ value }) { return value > 800 }" + } + }, + { + "label": "我要过滤全部的数", + "method": { + "type": "JSFunction", + "value": "function() { return true }" + } + } + ] + }, + "slots": { + "default": { + "type": "JSSlot", + "params": ["row"], + "value": [ + { + "componentName": "div", + "children": [ + { + "componentName": "Icon", + "props": { + "name": "IconEdit" + } + }, + { + "componentName": "Block", + "fileName": "CrmQuoteListGridStatus", + "condition": { + "type": "JSExpression", + "value": "this.props.isEdit" + }, + "props": { + "isEdit": { + "type": "JSExpression", + "value": "this.props.isEdit" + }, + "status": { + "type": "JSExpression", + "value": "row.status" + } + } + } + ] + } + ] + } + } + }, + { + "type": "index", + "width": 60 + }, + { + "type": "selection", + "width": 60 + }, + { + "field": "name", + "title": "公司名称" + }, + { + "field": "employees", + "title": "员工数" + }, + { + "field": "city", + "title": "城市" + }, + { + "title": "操作", + "slots": { + "default": { + "type": "JSSlot", + "value": [ + { + "component": "div", + "props": { + "style": "color: rgb(94,124, 224);cursor:pointer;", + "text": { + "type": "i18n", + "key": "operation.delete" + }, + "prop1": { + "a": 123 + }, + "visible": true, + "onClick": { + "type": "JSExpression", + "value": "this.emit" + } + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "value": { + "type": "JSExpression", + "value": "row.giveamount", + "model": { + "prop": "" + } + } + } + }, + { + "component": "span", + "condition": { + "type": "JSExpression", + "value": "state.cityOptions.length" + }, + "children": { + "type": "i18n", + "key": "operation.hello" + } + }, + { + "componentName": "Icon", + "props": { + "name": "TinyIconHelpCircle", + "style": "margin-left: 6px; cursor: pointer;vertical-align: top;" + } + } + ] + } + ] + } + } + } + ], + "tableData": [ + { + "id": "1", + "name": "GFD科技有限公司", + "city": "福州", + "employees": 800, + "boole": false + }, + { + "id": "2", + "name": "WWW科技有限公司", + "city": "深圳", + "employees": 300, + "boole": true + }, + { + "id": "3", + "name": "RFV有限责任公司", + "city": "中山", + "employees": 1300, + "boole": false + }, + { + "id": "4", + "name": "TGB科技有限公司", + "city": "龙岩", + "employees": 360, + "boole": true + }, + { + "id": "5", + "name": "YHN科技有限公司", + "city": "韶关", + "employees": 810, + "boole": true + }, + { + "id": "6", + "name": "WSX科技有限公司", + "city": "黄冈", + "employees": 800, + "boole": true + }, + { + "id": "7", + "name": "KBG物业有限公司", + "city": "赤壁", + "employees": 400, + "boole": false + }, + { + "id": "8", + "name": "深圳市福德宝网络技术有限公司", + "boole": true, + "city": "厦门", + "employees": 540 + } + ], + "status": { + "type": "JSExpression", + "value": "this.statusData", + "computed": true + }, + "buttons": [ + { + "type": "primary", + "text": "主要操作" + }, + { + "type": "success", + "text": "成功操作" + }, + { + "type": "danger", + "text": { + "type": "i18n", + "key": "operation.danger" + } + } + ] + }, + "lifeCycles": { + "setup": { + "type": "JSFunction", + "value": "function({ props, watch, onMounted }) {\r\n onMounted(() => {\r\n this.getTableDta()\r\n })\r\n watch(\r\n () => props.load,\r\n (load) => {\r\n if (load.isLoad) {\r\n this.getTableDta()\r\n }\r\n },\r\n {\r\n deep: true\r\n }\r\n )\r\n}" + }, + "onBeforeMount": { + "type": "JSFunction", + "value": "function() { return '生命周期:onBeforeMount'; }" + }, + "onMounted": { + "type": "JSFunction", + "value": "function onMounted() { return '生命周期:onMounted'; }" + } + }, + "methods": { + "getTableData": { + "type": "JSFunction", + "value": "function getData({ page, filterArgs }) {\n const { curPage, pageSize } = page;\n const offset = (curPage - 1) * pageSize;\n\n return new Promise((resolve) => {\n setTimeout(() => {\n const { tableData } = this.state;\n let result = [...tableData];\n\n if (filterArgs) {\n result = result.filter((item) => item.city === filterArgs);\n }\n\n const total = result.length;\n result = result.slice(offset, offset + pageSize);\n\n resolve({ result, page: { total } });\n }, 500);\n });\n}" + }, + "handleSearch": { + "type": "JSFunction", + "value": "function(e) { return ['搜索:', this.i18n('operation.search'), e]; }" + }, + "handleReset": { + "type": "JSFunction", + "value": "function handleReset(e) { return ['重置:', e]; }" + }, + "statusData": { + "type": "JSFunction", + "value": "function () {\r\n return [\r\n { name: this.i18n('quotes.common.configure_basic_information'), status: 'ready' },\r\n { name: this.i18n('quotes.quote_list.quote'), status: 'wait' },\r\n { name: this.i18n('quotes.common.complete_configuration_quote'), status: 'wait' }\r\n ]\r\n}" + } + } +} diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/output/components/ImageTitle.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/output/components/ImageTitle.vue new file mode 100644 index 0000000..62550d8 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/output/components/ImageTitle.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/output/views/FormTable.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/output/views/FormTable.vue new file mode 100644 index 0000000..04a4e7c --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case1_normal/output/views/FormTable.vue @@ -0,0 +1,472 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/blocks.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/blocks.schema.json new file mode 100644 index 0000000..ab5444a --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/blocks.schema.json @@ -0,0 +1,155 @@ +[ + { + "label": "PropAccessor", + "content": { + "componentName": "Block", + "fileName": "PropAccessor", + "css": "", + "props": {}, + "state": { + "firstName": "", + "lastName": "" + }, + "methods": {}, + "lifeCycles": {}, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "姓" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入姓氏", + "modelValue": { + "type": "JSExpression", + "value": "this.state.lastName", + "model": true + } + }, + "id": "acdd0030" + } + ], + "id": "6140da6b" + }, + { + "componentName": "TinyFormItem", + "props": { + "label": "名" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入名字", + "modelValue": { + "type": "JSExpression", + "value": "this.state.firstName", + "model": true + } + }, + "id": "f029ce23" + } + ], + "id": "3751a68b" + }, + { + "componentName": "TinyFormItem", + "props": {}, + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "提交", + "type": "primary" + }, + "id": "d2b35138" + }, + { + "componentName": "TinyButton", + "props": { + "text": "重置", + "style": "margin-left: 10px" + }, + "id": "89f92a92" + } + ], + "id": "2e93998e" + } + ], + "id": "88ecfcff" + } + ], + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "全名" + } + }, + "cols": 12, + "rules": [], + "accessor": { + "getter": { + "type": "JSFunction", + "value": "function getter() {\r\n this.emit('update:name', `${this.state.firstName} ${this.state.lastName}`)\r\n}" + }, + "setter": { + "type": "JSFunction", + "value": "function setter() {\r\n const [firstName, lastName] = this.props.name.split(' ')\r\n this.state.firstName = firstName\r\n this.state.lastName = lastName\r\n}" + } + }, + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onUpdate:name": { + "label": { + "zh_CN": "双向绑定的name变化时触发" + }, + "description": { + "zh_CN": "" + } + } + }, + "slots": {} + } + } + } +] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/components-map.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/components-map.json new file mode 100644 index 0000000..b027e56 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/components-map.json @@ -0,0 +1,10 @@ +[ + { + "componentName": "UsePropAccessor", + "main": "./views" + }, + { + "componentName": "PropAccessor", + "main": "./components" + } +] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/page.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/page.schema.json new file mode 100644 index 0000000..4f60b89 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/input/page.schema.json @@ -0,0 +1,46 @@ +{ + "componentName": "Page", + "fileName": "UsePropAccessor", + "css": "", + "props": {}, + "state": { + "fullName": "" + }, + "methods": {}, + "lifeCycles": {}, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "全名" + }, + "children": [ + { + "componentType": "Block", + "componentName": "PropAccessor", + "props": { + "name": { + "type": "JSExpression", + "value": "this.state.fullName", + "model": { + "prop": "name" + } + } + }, + "id": "acdd0030" + } + ], + "id": "6140da6b" + } + ], + "id": "88ecfcff" + } + ] +} diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/output/components/PropAccessor.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/output/components/PropAccessor.vue new file mode 100644 index 0000000..aa41a95 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/output/components/PropAccessor.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/output/views/UsePropAccessor.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/output/views/UsePropAccessor.vue new file mode 100644 index 0000000..8a2b8b8 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case2_prop-accessor/output/views/UsePropAccessor.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/blocks.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/blocks.schema.json new file mode 100644 index 0000000..9daf4f9 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/blocks.schema.json @@ -0,0 +1,163 @@ +[ + { + "label": "StateAccessor", + "content": { + "componentName": "Block", + "fileName": "StateAccessor", + "css": "", + "props": {}, + "state": { + "fullName": { + "defaultValue": "", + "accessor": { + "getter": { + "type": "JSFunction", + "value": "function getter() {\r\n this.state.fullName = `${this.props.firstName} ${this.props.lastName}`\r\n}" + }, + "setter": { + "type": "JSFunction", + "value": "function setter() {\r\n const [firstName, lastName] = this.state.fullName.split(' ')\r\n this.emit('update:firstName', firstName)\r\n this.emit('update:lastName', lastName)\r\n}" + } + } + } + }, + "methods": {}, + "lifeCycles": {}, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "全名" + }, + "children": [ + { + "componentName": "TinyInput", + "props": { + "placeholder": "请输入全名", + "modelValue": { + "type": "JSExpression", + "value": "this.state.fullName", + "model": true + } + }, + "id": "acdd0030" + } + ], + "id": "6140da6b" + }, + { + "componentName": "TinyFormItem", + "props": {}, + "children": [ + { + "componentName": "TinyButton", + "props": { + "text": "提交", + "type": "primary" + }, + "id": "d2b35138" + }, + { + "componentName": "TinyButton", + "props": { + "text": "重置", + "style": "margin-left: 10px" + }, + "id": "89f92a92" + } + ], + "id": "2e93998e" + } + ], + "id": "88ecfcff" + } + ], + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "firstName", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "姓氏" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "lastName", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "名字" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onUpdate:firstName": { + "label": { + "zh_CN": "firstName变化时触发" + }, + "description": { + "zh_CN": "" + } + }, + "onUpdate:lastName": { + "label": { + "zh_CN": "lastName变化时触发" + }, + "description": { + "zh_CN": "" + } + } + }, + "slots": {} + } + } + } +] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/components-map.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/components-map.json new file mode 100644 index 0000000..e74e69f --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/components-map.json @@ -0,0 +1,10 @@ +[ + { + "componentName": "UseStateAccessor", + "main": "./views" + }, + { + "componentName": "StateAccessor", + "main": "./components" + } +] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/page.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/page.schema.json new file mode 100644 index 0000000..6b1ff8d --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/input/page.schema.json @@ -0,0 +1,48 @@ +{ + "componentName": "Page", + "fileName": "UseStateAccessor", + "css": "", + "props": {}, + "state": { + "firstName": "", + "lastName": "" + }, + "methods": {}, + "lifeCycles": {}, + "children": [ + { + "componentName": "TinyForm", + "props": { + "labelWidth": "80px", + "labelPosition": "top" + }, + "children": [ + { + "componentName": "TinyFormItem", + "props": { + "label": "全名" + }, + "children": [ + { + "componentType": "Block", + "componentName": "StateAccessor", + "props": { + "firstName": { + "type": "JSExpression", + "value": "this.state.firstName" + }, + "lastName": { + "type": "JSExpression", + "value": "this.state.lastName" + } + }, + "id": "acdd0030" + } + ], + "id": "6140da6b" + } + ], + "id": "88ecfcff" + } + ] +} diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/output/components/StateAccessor.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/output/components/StateAccessor.vue new file mode 100644 index 0000000..baaeb80 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/output/components/StateAccessor.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/output/views/UseStateAccessor.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/output/views/UseStateAccessor.vue new file mode 100644 index 0000000..e2c6f56 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case3_state-accessor/output/views/UseStateAccessor.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/blocks.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/blocks.schema.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/blocks.schema.json @@ -0,0 +1 @@ +[] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/components-map.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/components-map.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/components-map.json @@ -0,0 +1 @@ +[] diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/page.schema.json b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/page.schema.json new file mode 100644 index 0000000..a66f018 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/input/page.schema.json @@ -0,0 +1,161 @@ +{ + "state": {}, + "methods": {}, + "componentName": "Page", + "fileName": "createVm", + "css": "", + "props": {}, + "lifeCycles": {}, + "children": [ + { + "componentName": "CanvasRowColContainer", + "props": { + "rowGap": "20px" + }, + "children": [ + { + "componentName": "CanvasRow", + "props": { + "rowGap": "20px", + "colGap": "20px" + }, + "children": [ + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "id": "4514b344" + }, + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "children": [], + "id": "3664a254" + } + ], + "id": "63553246" + }, + { + "componentName": "CanvasRow", + "props": { + "rowGap": "20px", + "colGap": "20px" + }, + "children": [ + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "id": "2c13444f", + "children": [ + { + "componentName": "CanvasRow", + "props": { + "rowGap": "20px", + "colGap": "20px" + }, + "children": [ + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "children": [], + "id": "24256327" + } + ], + "id": "56453426" + }, + { + "componentName": "CanvasRow", + "props": { + "rowGap": "20px", + "colGap": "20px" + }, + "children": [ + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "id": "5451f224" + } + ], + "id": "26364626" + }, + { + "componentName": "CanvasRow", + "props": { + "rowGap": "20px", + "colGap": "20px" + }, + "children": [ + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "children": [], + "id": "26232436" + } + ], + "id": "52555445" + } + ] + }, + { + "componentName": "CanvasCol", + "props": { + "rowGap": "20px", + "colGap": "20px", + "grow": true, + "shrink": true, + "widthType": "auto" + }, + "children": [], + "id": "53553563" + } + ], + "id": "53b5fe13" + } + ], + "id": "25452c43" + } + ], + "dataSource": { + "list": [] + }, + "bridge": { + "imports": [] + }, + "inputs": [], + "outputs": [] +} diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/output/BuiltInComponent.vue b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/output/BuiltInComponent.vue new file mode 100644 index 0000000..4ac5f6a --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/case4_canvasrow-component/output/BuiltInComponent.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/index.config.js b/dl-flow-frontend/packages/vue-generator/test/testcases/full/index.config.js new file mode 100644 index 0000000..6d6c8a0 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/index.config.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +module.exports = { + description: + 'full目录出码模块的测试用例,每个case中 input 为页面/区块的schema,output为预期的输出,result为实际的输出(生成的代码)', + cases: [ + { + name: 'case1_normal', + pageName: 'FormTable', + description: '测试代码生成流程' + }, + { + name: 'case2_prop-accessor', + pageName: 'UsePropAccessor', + description: '测试区块的 prop 支持 accessor 协议' + }, + { + name: 'case3_state-accessor', + pageName: 'UseStateAccessor', + description: '测试区块的 state 支持 accessor 协议' + }, + { + name: 'case4_canvasrow-component', + pageName: 'BuiltInComponent', + description: '测试内置组件 CanvasRow、CanvasCol、CanvasRowColContainer' + } + ], + input: { + fileName: 'page.schema.json', + type: 'json' + }, + output: { + fileName: 'output', + type: 'vue' + } +} diff --git a/dl-flow-frontend/packages/vue-generator/test/testcases/full/index.js b/dl-flow-frontend/packages/vue-generator/test/testcases/full/index.js new file mode 100644 index 0000000..7f9d2b8 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/testcases/full/index.js @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +const path = require('path') +const fs = require('fs-extra') +const prettier = require('prettier') +const { execSync } = require('child_process') +const { generateCode } = require('../../../dist/tiny-engine-dsl-vue.cjs') +const { logger } = require('../../utils/logger') + +const getPageData = (testCaseFile) => { + const pageSchema = require(`./${testCaseFile.name}/input/page.schema.json`) + let blocksData = [] + let componentsMap = [] + + if (fs.existsSync(path.resolve(__dirname, `./${testCaseFile.name}/input/blocks.schema.json`))) { + blocksData = require(`./${testCaseFile.name}/input/blocks.schema.json`) + } + + if (fs.existsSync(path.resolve(__dirname, `./${testCaseFile.name}/input/components-map.json`))) { + componentsMap = require(`./${testCaseFile.name}/input/components-map.json`) + } + + return { + pageInfo: { schema: pageSchema, name: testCaseFile.pageName || 'page1' }, + componentsMap, + blocksData + } +} + +const generateFiles = ({ testCaseFile, result }) => { + fs.mkdirSync(path.resolve(__dirname, `./${testCaseFile.name}/result`), { recursive: true }) + + result.forEach((item) => { + const { panelName, panelValue, errors, filePath, prettierOpts } = item + // 真实使用时,如果用到了路径别名,此处要映射处理一下 + // filePath.replace('@crm-block', 'src') + + if (errors.length) { + const messages = errors.map(({ message }) => message).join('\n\n---next error---\n\n') + logger.error(`生成的 vue 源码校验报错: \n${messages}`) + + return + } + + fs.outputFileSync( + path.resolve(__dirname, `./${testCaseFile.name}/result`, filePath, panelName), + prettier.format(panelValue, prettierOpts) + ) + }) +} + +const runEslint = ({ testCaseFile }) => { + const eslintCmd = `node ./node_modules/eslint/bin/eslint.js test/testcases/full/${testCaseFile.name}/result --ext .js,.vue` + execSync(eslintCmd, { cwd: process.cwd(), stdio: [0, 1, 2] }) +} + +const runTestCases = () => { + const testCaseConfig = require(path.resolve(__dirname, 'index.config.js')) + const { cases: testCaseFiles } = testCaseConfig + logger.info(`total test cases: ${testCaseFiles.length} \n`) + for (const testCaseFile of testCaseFiles) { + logger.info(`正在运行测试用例:${testCaseFile.description}`) + // DSL转换 + const result = generateCode(getPageData(testCaseFile)) + // 生成文件 + generateFiles({ testCaseFile, result }) + // eslint + try { + runEslint({ testCaseFile }) + } catch { + logger.error('生成的代码 eslint 静态检查未通过,有以上问题 \n') + } + } +} + +runTestCases() diff --git a/dl-flow-frontend/packages/vue-generator/test/utils/logger/index.js b/dl-flow-frontend/packages/vue-generator/test/utils/logger/index.js new file mode 100644 index 0000000..e73441d --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/test/utils/logger/index.js @@ -0,0 +1,21 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const { createLogger, format, transports } = require('winston') + +const logger = createLogger({ + level: 'info', + format: format.combine(format.colorize({ all: true }), format.simple()), + transports: [new transports.Console()] +}) + +module.exports = { logger } diff --git a/dl-flow-frontend/packages/vue-generator/vite.config.js b/dl-flow-frontend/packages/vue-generator/vite.config.js new file mode 100644 index 0000000..69ea635 --- /dev/null +++ b/dl-flow-frontend/packages/vue-generator/vite.config.js @@ -0,0 +1,25 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { defineConfig } from 'vite' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: path.resolve(__dirname, './src/index.js'), + formats: ['cjs'] + }, + sourcemap: true + } +}) diff --git a/dl-flow-frontend/packages/webcomponent/README.md b/dl-flow-frontend/packages/webcomponent/README.md new file mode 100644 index 0000000..4f6b9df --- /dev/null +++ b/dl-flow-frontend/packages/webcomponent/README.md @@ -0,0 +1,2 @@ +# lowcode-webcomponent + diff --git a/dl-flow-frontend/packages/webcomponent/package.json b/dl-flow-frontend/packages/webcomponent/package.json new file mode 100644 index 0000000..4e6ce37 --- /dev/null +++ b/dl-flow-frontend/packages/webcomponent/package.json @@ -0,0 +1,47 @@ +{ + "name": "@opentiny/tiny-engine-webcomponent-core", + "version": "1.0.3", + "publishConfig": { + "access": "public" + }, + "description": "webcomponent vue core", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext .js,.vue --fix", + "format": "prettier --write **/*{.vue,.js,.ts,.html,.json}", + "publish:npm": "npm run build && npm publish --verbose" + }, + "files": [ + "dist" + ], + "main": "dist/tiny-engine-webcomponent-core.umd.js", + "module": "dist/tiny-engine-webcomponent-core.es.js", + "repository": { + "type": "git", + "url": "https://github.com/opentiny/tiny-engine", + "directory": "packages/webcomponent" + }, + "bugs": { + "url": "https://github.com/opentiny/tiny-engine/issues" + }, + "author": "OpenTiny Team", + "license": "MIT", + "homepage": "https://opentiny.design/tiny-engine", + "dependencies": { + "@vue/shared": "^3.3.4", + "vue": "^3.2.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^2.2.0", + "babel-eslint": "^10.1.0", + "eslint": "^7.32.0", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-standard": "^4.0.0", + "eslint-plugin-vue": "^7.17.0", + "prettier": "^2.4.0", + "vite": "^2.9.1" + } +} diff --git a/dl-flow-frontend/packages/webcomponent/src/defineCustomElement.js b/dl-flow-frontend/packages/webcomponent/src/defineCustomElement.js new file mode 100644 index 0000000..e83123a --- /dev/null +++ b/dl-flow-frontend/packages/webcomponent/src/defineCustomElement.js @@ -0,0 +1,277 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import { defineComponent, render, nextTick, createVNode } from 'vue' +import { camelize, hyphenate, toNumber, extend, isArray } from '@vue/shared' + +const BaseLowcodeClass = typeof HTMLElement !== 'undefined' ? HTMLElement : class {} + +class LowcodeVueElement extends BaseLowcodeClass { + constructor(_def, _props = {}) { + super() + this._def = _def + this._props = _props + + /** + * @internal + */ + this._numberProps = null + this._cbConnected = false + this._instance = null + this._resolved = false + + this.attachShadow({ mode: 'open' }) + } + + disconnectedCallback() { + this._cbConnected = false + + nextTick(() => { + if (!this._cbConnected) { + render(null, this.shadowRoot) + this._instance = null + } + }) + } + + connectedCallback() { + this._cbConnected = true + + if (!this._instance) { + this._resolveLowcodeDef() + } + } + + _resolveLowcodeDef() { + if (this._resolved) { + return + } + + this._resolved = true + + const attributes = [...this.attributes] + + attributes.forEach(({ name }) => { + this._setAttr(name) + }) + + new MutationObserver((mutations) => { + for (const m of mutations) { + this._setAttr(m.attributeName) + } + }).observe(this, { attributes: true }) + + const resolve = (def) => { + const { props, styles, links } = def + const hasOptions = props && !isArray(props) + const realProps = hasOptions ? Object.keys(props) : props + const propsKeys = props ? realProps : [] + let numberProps + + if (hasOptions) { + for (const key in this._props) { + if (Object.prototype.hasOwnProperty.call(this._props, key)) { + const opt = props[key] + + if (opt === Number || (opt && opt.type === Number)) { + this._props[key] = toNumber(this._props[key]) + ;(numberProps || (numberProps = Object.create(null)))[key] = true + } + } + } + } + + this._numberProps = numberProps + + for (const key of Object.keys(this)) { + if (key[0] !== '_') { + this._setProp(key, this[key], true, false) + } + } + + for (const key of propsKeys.map(camelize)) { + Object.defineProperty(this, key, { + get() { + return this._getDefProp(key) + }, + set(value) { + this._setProp(key, value) + } + }) + } + + this._addStyles(styles) + this._applyLinks(links) + this._update() + } + + const asyncDef = this._def.__asyncLoader + + if (asyncDef) { + asyncDef().then(resolve) + } else { + resolve(this._def) + } + } + + _setAttr(key) { + let value = this.getAttribute(key) + + if (this._numberProps && this._numberProps[key]) { + value = toNumber(value) + } + + this._setProp(camelize(key), value, false) + } + + /** + * @internal + */ + _getDefProp(key) { + return this._props[key] + } + + _setProp(key, value, shouldReflect = true, shouldUpdate = true) { + if (value !== this._props[key]) { + if (value === 'true') { + value = true + } + if (value === 'false') { + value = false + } + + this._props[key] = value + + if (shouldUpdate && this._instance) { + this._update() + } + + // reflect + if (shouldReflect) { + if (value === true) { + this.setAttribute(hyphenate(key), '') + } else if (typeof value === 'string' || typeof value === 'number') { + this.setAttribute(hyphenate(key), String(value)) + } else if (!value) { + this.removeAttribute(hyphenate(key)) + } + } + } + } + + _setProps(props, shouldReflect = true, shouldUpdate = true) { + let bChange = false + + Object.entries(props).forEach(([key, value]) => { + if (value !== this._props[key]) { + bChange = true + + this._setProp(key, value, shouldReflect, false) + } + }) + + if (bChange && shouldUpdate && this._instance) { + this._update() + } + } + + _update() { + render(this._createLowcodeVNode(), this.shadowRoot) + } + + _createLowcodeVNode() { + const vnode = createVNode(this._def, extend({}, this._props)) + + if (!this._instance) { + const dom = this + + vnode.ce = (instance) => { + this._instance = instance + instance.isCE = true + // HMR + instance.ceReload = (styles) => { + if (this._styles) { + this._styles.forEach((s) => this.shadowRoot.removeChild(s)) + this._styles.length = 0 + } + this._addStyles(styles) + if (!this._def.__asyncLoader) { + this._instance = null + this._update() + } + } + instance.emit = (event, ...args) => { + this.dispatchEvent( + new CustomEvent(event, { + detail: args + }) + ) + } + instance.updateProp = (key, value) => { + dom[key] = value + dom._props[key] = value + instance.attrs[key] = value + } + instance.domProps = dom._props + let parent = this + + while ((parent = parent && (parent.parentNode || parent.host))) { + if (parent instanceof LowcodeVueElement) { + instance.parent = parent._instance + + break + } + } + } + } + return vnode + } + + _addStyles(styles) { + if (styles) { + styles.forEach((css) => { + const s = document.createElement('style') + + s.textContent = css + this.shadowRoot.appendChild(s) + ;(this._styles || (this._styles = [])).push(s) + }) + } + } + + _applyLinks(links) { + const appendStyle = (href) => { + const l = document.createElement('link') + l.href = href + l.rel = 'stylesheet' + this.shadowRoot.appendChild(l) + } + + // 支持在组件中指定样式文件 links + if (links && isArray(links)) { + links.forEach(appendStyle) + } + } +} + +export default function defineCustomElement(options) { + const Component = defineComponent(options) + class LowcodeVueCustomElement extends LowcodeVueElement { + constructor(props) { + super(Component, props) + } + } + + LowcodeVueCustomElement.def = Component + + return LowcodeVueCustomElement +} diff --git a/dl-flow-frontend/packages/webcomponent/src/lib.js b/dl-flow-frontend/packages/webcomponent/src/lib.js new file mode 100644 index 0000000..63f37ea --- /dev/null +++ b/dl-flow-frontend/packages/webcomponent/src/lib.js @@ -0,0 +1,15 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +import defineCustomElement from './defineCustomElement' + +export { defineCustomElement } diff --git a/dl-flow-frontend/packages/webcomponent/vite.config.js b/dl-flow-frontend/packages/webcomponent/vite.config.js new file mode 100644 index 0000000..c65f96e --- /dev/null +++ b/dl-flow-frontend/packages/webcomponent/vite.config.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], + define: {}, + build: { + minify: false, + emptyOutDir: true, + lib: { + entry: path.resolve(__dirname, './src/lib.js'), + name: 'LowcodeDesignWebcomponentCore', + formats: ['es', 'umd'], + fileName: (format) => `tiny-engine-webcomponent-core.${format}.js` + }, + commonjsOptions: { + transformMixedEsModules: true + }, + rollupOptions: { + // 确保外部化处理那些你不想打包进库的依赖 + external: ['vue', 'vue-i18n'], + output: { + // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 + globals: { + vue: 'Vue', + 'vue-i18n': 'VueI18n' + } + } + } + } +}) diff --git a/dl-flow-frontend/pnpm-workspace.yaml b/dl-flow-frontend/pnpm-workspace.yaml new file mode 100644 index 0000000..a19b4b4 --- /dev/null +++ b/dl-flow-frontend/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - 'packages/**' + - 'mockServer' \ No newline at end of file diff --git a/dl-flow-frontend/scripts/buildComponentSchemas.js b/dl-flow-frontend/scripts/buildComponentSchemas.js new file mode 100644 index 0000000..d28ed13 --- /dev/null +++ b/dl-flow-frontend/scripts/buildComponentSchemas.js @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ + +const { resolve } = require('path') +const { readdirSync, readFileSync, existsSync, mkdirSync, rmSync, writeFileSync } = require('fs') + +const dir = resolve(__dirname, '../packages/settings/design/src/assets/materials/ng-components') +const files = readdirSync(dir) +const schemas = [] + +files.forEach((fileName) => { + if (/\.json$/.test(fileName)) { + const content = readFileSync(resolve(dir, fileName)).toString() + schemas.push(JSON.parse(content)) + } +}) + +const outDir = resolve(__dirname, '../dist') +const outFile = resolve(outDir, 'componentSchemas.json') + +if (!existsSync(outDir)) { + mkdirSync(outDir) +} + +if (existsSync(outFile)) { + rmSync(outFile) +} + +writeFileSync(outFile, JSON.stringify(schemas, null, 2)) diff --git a/dl-flow-frontend/scripts/buildMaterials.mjs b/dl-flow-frontend/scripts/buildMaterials.mjs new file mode 100644 index 0000000..63f8619 --- /dev/null +++ b/dl-flow-frontend/scripts/buildMaterials.mjs @@ -0,0 +1,199 @@ +import fsExtra from 'fs-extra' +import path from 'node:path' +import chokidar from 'chokidar' +import fg from 'fast-glob' +import MysqlConnection from './connection.mjs' +import Logger from './logger.mjs' + +const logger = new Logger('buildMaterials') +// 物料文件存放文件夹名称 +const materialsDir = 'materials' +// 物料资产包 +const bundlePath = path.join(process.cwd(), '/packages/design-core/public/mock/bundle.json') +// mockServer应用数据 +const appInfoPath = path.join(process.cwd(), '/mockServer/src/services/appinfo.json') +const appInfo = fsExtra.readJSONSync(appInfoPath) + +const connection = new MysqlConnection() + +/** + * 更新物料资产包和应用mock数据 + */ +const write = (bundle) => { + fsExtra.outputJSONSync(bundlePath, bundle, { spaces: 2 }) + fsExtra.outputJSONSync(appInfoPath, appInfo, { spaces: 2 }) +} + +/** + * 校验组件文件数据 + * @param {string} file 组件文件路径 + * @param {object} component 组件数据 + * @returns + */ +const validateComponent = (file, component) => { + const requiredFields = ['component'] + const fields = Object.keys(component) + const requiredList = requiredFields.filter((field) => !fields.includes(field)) + + if (requiredList.length) { + logger.error(`组件文件 ${file} 缺少必要字段:${requiredList.join('、')}。`) + + return false + } + + if (!component.npm) { + logger.warn(`组件文件 ${file} 缺少 npm 字段,出码时将不能通过import语句导入组件。`) + + return false + } + + return true +} + +/** + * 校验区块文件数据 + * @param {string} file 区块文件路径 + * @param {object} block 区块数据 + * @returns + */ +const validateBlock = (file, block) => { + const requiredFields = ['label', 'assets'] + const fields = Object.keys(block) + const requiredList = requiredFields.filter((field) => !fields.includes(field)) + + if (requiredList.length) { + logger.error(`区块文件 ${file} 缺少必要字段:${requiredList.join('、')}。`) + + return false + } + + return true +} + +/** + * 读取materials目录下的json文件,执行下列操作 + * 1. 合并生成物料资产包 + * 2. 更新应用的组件数据componentsMap + * 3. 连接上数据库后,将组件数据写入数据库(新增或更新) + */ +const generateComponents = () => { + try { + fg([`${materialsDir}/**/*.json`]).then((files) => { + if(!files.length) { + logger.warn('物料文件夹为空,请先执行`pnpm splitMaterials`命令拆分物料资产包') + } + + const bundle = { + data: { + framework: 'Vue', + materials: { + components: [], + blocks: [], + snippets: [] + } + } + } + const { components = [], snippets = [], blocks = [] } = bundle.data.materials + const componentsMap = [] + const appInfoBlocksLabels = appInfo.blockHistories.map((item) => item.label) + + files.forEach((file) => { + const material = fsExtra.readJsonSync(file, { throws: false }) + + if (!material) { + logger.error(`读取物料文件 ${file} 失败`) + + return + } + + if (file.includes('/blocks/')) { + const valid = validateBlock(file, material) + + if (!valid) return + + blocks.push(material) + + if (!appInfoBlocksLabels.includes(material.label)) { + appInfo.blockHistories.push(material) + } + + return + } + + const valid = validateComponent(file, material) + + if (!valid) return + + const { snippets: componentSnippets, category, ...componentInfo } = material + + components.push(componentInfo) + + const snippet = snippets.find((item) => item.group === category) + + if (snippet) { + componentSnippets && snippet.children.push(componentSnippets[0]) + } else if (category && componentInfo) { + snippets.push({ + group: category, + children: componentSnippets || [] + }) + } + + const { component, npm = {} } = componentInfo + + componentsMap.push({ component, npm }) + + if (connection.connected) { + connection.initDB(material) + } + }) + + appInfo.materialHistory.components = componentsMap + + write(bundle) + }) + + logger.success('构建物料资产包成功') + } catch (error) { + logger.error(`构建物料资产包失败:${error}`) + } +} + +// 监听materials下json文件的变化 +const watcher = chokidar.watch(`${materialsDir}/**/*.json`, { ignoreInitial: true }) + +watcher.on('all', (event, file) => { + const eventMap = { + add: '新增', + change: '更新', + unlink: '删除' + } + + logger.info(`${eventMap[event]}组件文件 ${file}`) + + // 监听物料文件变化,更新物料资产包 + generateComponents() + + if (!connection.connected || event === 'unlink') return + + const component = fsExtra.readJsonSync(path.join(process.cwd(), file)) + + if (event === 'change') { + connection.updateComponent(component) + } else if (event === 'add') { + connection.insertComponent(component) + } +}) + +// 连接数据库 +connection + .connect() + .then(() => { + connection.initUserComponentsTable().finally(() => { + generateComponents() + }) + }) + .catch(() => { + // 未能连接数据库也可以执行更新本地mock数据 + generateComponents() + }) diff --git a/dl-flow-frontend/scripts/connection.mjs b/dl-flow-frontend/scripts/connection.mjs new file mode 100644 index 0000000..08b1a44 --- /dev/null +++ b/dl-flow-frontend/scripts/connection.mjs @@ -0,0 +1,371 @@ +import mysql from 'mysql' +import Logger from './logger.mjs' +import fs from 'node:fs' +import path from 'node:path' +import dotenv from 'dotenv' + +const logger = new Logger('buildMaterials') + +// 先构造出.env*文件的绝对路径 +const appDirectory = fs.realpathSync(process.cwd()) +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath) +const pathsDotenv = resolveApp('.env') +// 加载.env.local +dotenv.config({ path: `${pathsDotenv}.local` }) +const { SQL_HOST, SQL_PORT, SQL_USER, SQL_PASSWORD, SQL_DATABASE } = process.env + +// 组件表名称 +const componentsTableName = 'user_components' +// 组件关联到物料资产包的id +const materialHistoryId = 639 +// 数据库配置 +const mysqlConfig = { + host: SQL_HOST, // 主机名(服务器地址) + port: SQL_PORT, // 端口号 + user: SQL_USER, // 用户名 + password: SQL_PASSWORD, // 密码 + database: SQL_DATABASE // 数据库名称 +} +class MysqlConnection { + constructor(config) { + this.config = config || mysqlConfig + // 是否连接上了数据库 + this.connected = false + this.connection = mysql.createConnection(this.config) + } + + connect() { + return new Promise((resolve, reject) => { + this.connection.connect((error) => { + if (error) { + logger.warn('未能连接到数据库,请查看数据库配置是否正确') + reject() + } else { + logger.success('连接数据库成功') + this.connected = true + resolve() + } + }) + }) + } + + /** + * 执行sql语句,更新数据库 + * @param {string} sql sql语句 + * @param {string} componentName 组件名称 + */ + query(sql) { + return new Promise((resolve, reject) => { + this.connection.query(sql, (error, result) => { + if (error) { + reject(error) + } else { + resolve(result) + } + }) + }) + } + + /** + * 组件字段映射 + * @param {string} field 字段名 + * @returns 映射后的字段名 + */ + fieldTransform(field) { + const fieldMap = { + docUrl: 'doc_url', + devMode: 'dev_mode', + schema: 'schema_fragment' + } + + return fieldMap[field] || field + } + + /** + * 格式化单引号 + * @param {string} str 待格式化的字符串 + * @returns 格式化后的字符串 + */ + formatSingleQuoteValue(str) { + if (typeof str !== 'string') { + return str + } + + return str.replace(/'/g, "\\'") + } + + /** + * 生成更新组件的sql语句 + * @param {object} component 组件数据 + * @returns 更新组件的sql语句 + */ + updateComponent(component) { + const values = [] + let sqlContent = `update ${componentsTableName} set ` + + Object.keys(component).forEach((key) => { + const { [key]: value } = component + const field = this.fieldTransform(key) + let updateContent = '' + + if (['id', 'component'].includes(field)) { + return + } + + if (value === void 0) { + return + } + + if (typeof value === 'string') { + const formatValue = this.formatSingleQuoteValue(value) + + updateContent = `\`${field}\` = '${formatValue}'` + } else if (typeof field === 'number' || field === null) { + updateContent = `\`${field}\` = ${value}` + } else { + const formatValue = this.formatSingleQuoteValue(JSON.stringify(value)) + + updateContent = `\`${field}\` = '${formatValue}'` + } + + values.push(updateContent) + }) + + sqlContent += values.join() + sqlContent += ` where component = '${component.component}';` + + this.query(sqlContent, component.component) + .then(() => { + logger.success(`更新组件 ${component.component} 成功`) + }) + .catch((error) => { + logger.success(`更新组件 ${component.component} 失败:${error}`) + }) + } + + /** + * 新建的组件关联物料资产包 + * @param {number} id 新建的组件id + */ + relationMaterialHistory(id) { + const uniqSql = `SELECT * FROM \`material_histories_components__user_components_mhs\` WHERE \`material-history_id\`=${materialHistoryId} AND \`user-component_id\`=${id}` + this.query(uniqSql).then((result) => { + if (!result.length) { + const sqlContent = `INSERT INTO \`material_histories_components__user_components_mhs\` (\`material-history_id\`, \`user-component_id\`) VALUES (${materialHistoryId}, ${id})` + + this.query(sqlContent) + } + }) + } + + /** + * 生成新增组件的sql语句 + * @param {object} component 组件数据 + * @returns 新增组件的sql语句 + */ + insertComponent(component) { + const defaultNpm = { + package: '', + exportName: '', + version: '1.0.0', + destructuring: true + } + const defaultConfigure = { + loop: true, + condition: true, + styles: true, + isContainer: true, + isModal: false, + nestingRule: { + childWhiteList: '', + parentWhiteList: '', + descendantBlacklist: '', + ancestorWhitelist: '' + }, + isNullNode: false, + isLayout: false, + rootSelector: '', + shortcuts: { + properties: ['value', 'disabled'] + }, + contextMenu: { + actions: ['create symbol'], + disable: ['copy', 'remove'] + } + } + const { + version = '1.0.0', + name, + component: componentName, + icon, + description, + docUrl, + screenshot, + tags, + keywords, + devMode = 'proCode', + npm = defaultNpm, + group, + category = 'general', + priority = 1, + snippets = [{}], + schema = {}, + configure = defaultConfigure, + public: publicRight = 0, + framework = 'vue', + isOfficial = 0, + isDefault = 0, + tiny_reserved = 0, + tenant = 1, + createBy = 86, + updatedBy = 86 + } = component + const values = `('${version}', + '${this.formatSingleQuoteValue(JSON.stringify(name))}', + '${componentName}', + '${icon}', + '${this.formatSingleQuoteValue(description)}', + '${docUrl}', + '${screenshot}', + '${tags}', + '${keywords}', + '${devMode}', + '${this.formatSingleQuoteValue(JSON.stringify(npm))}', + '${group}', + '${category}', + '${priority}', + '${this.formatSingleQuoteValue(JSON.stringify(snippets))}', + '${this.formatSingleQuoteValue(JSON.stringify(schema))}', + '${this.formatSingleQuoteValue(JSON.stringify(configure))}', + '${publicRight}', + '${framework}', + '${isOfficial}', + '${isDefault}', + '${tiny_reserved}', + '${tenant}', + '${createBy}', + '${updatedBy}' + );` + + const sqlContent = `INSERT INTO ${componentsTableName} (version, name, component, icon, description, doc_url, + screenshot, tags, keywords, dev_mode, npm, \`group\`, \`category\`, priority, snippets, + schema_fragment, configure, \`public\`, framework, isOfficial, isDefault, tiny_reserved, + tenant, createdBy, updatedBy) VALUES ${values}`.replace(/\n/g, '') + + this.query(sqlContent, componentName) + .then((result) => { + const id = result.insertId + + logger.success(`新增组件 ${component.component} 成功`) + this.relationMaterialHistory(id) + }) + .catch((error) => { + logger.success(`新增组件 ${component.component} 失败:${error}`) + }) + } + + /** + * 初始化数据库数据,判断是否已存在组件,不存在时执行新增组件 + * @param {object} component 组件数据 + */ + initDB(component) { + const selectSqlContent = `SELECT * FROM ${this.config.database}.${componentsTableName} WHERE component = '${component.component}'` + + this.query(selectSqlContent) + .then((result) => { + if (!result.length) { + this.insertComponent(component) + } + }) + .catch((error) => { + logger.success(`查询组件 ${component.component} 失败:${error}`) + }) + } + + /** + * 创建组件表 + * @returns promise + */ + createUserComponentsTable() { + const sqlContent = ` + CREATE TABLE ${componentsTableName} ( + id int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + version varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + name longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + component varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + icon varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + description varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + doc_url varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + screenshot varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + tags varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + keywords varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + dev_mode varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + npm longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + \`group\` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + category varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + priority int(11) NULL DEFAULT NULL, + snippets longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + schema_fragment longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + configure longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + createdBy int(11) NULL DEFAULT NULL, + updatedBy int(11) NULL DEFAULT NULL, + created_by int(11) NULL DEFAULT NULL, + updated_by int(11) NULL DEFAULT NULL, + created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + public int(11) NULL DEFAULT NULL, + framework varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + isOfficial tinyint(1) NULL DEFAULT NULL, + isDefault tinyint(1) NULL DEFAULT NULL, + tiny_reserved tinyint(1) NULL DEFAULT NULL, + tenant int(11) NULL DEFAULT NULL, + component_metadata longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + library int(11) NULL DEFAULT NULL, + PRIMARY KEY (id) USING BTREE, + UNIQUE INDEX unique_component(createdBy, framework, component, version) USING BTREE + ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC; + `.replace(/\n/g, '') + + return new Promise((resolve, reject) => { + this.query(sqlContent) + .then((result) => { + logger.success(`创建表 ${componentsTableName} 成功`) + resolve(result) + }) + .catch((error) => { + logger.success(`创建表 ${componentsTableName} 失败:${error}`) + reject(error) + }) + }) + } + + /** + * 初始化数据库的组件表 + * @returns promise + */ + initUserComponentsTable() { + return new Promise((resolve, reject) => { + // 查询是否已存在表 + this.query(`SHOW TABLES LIKE '${componentsTableName}'`) + .then((result) => { + if (result.length) { + // 已存在 + resolve() + } else { + this.createUserComponentsTable() + .then(() => { + resolve() + }) + .catch((err) => { + reject(err) + }) + } + }) + .catch((error) => { + reject(error) + }) + }) + } +} + +export default MysqlConnection diff --git a/dl-flow-frontend/scripts/copyToVscode.js b/dl-flow-frontend/scripts/copyToVscode.js new file mode 100644 index 0000000..001f1a7 --- /dev/null +++ b/dl-flow-frontend/scripts/copyToVscode.js @@ -0,0 +1,50 @@ +/** +* Copyright (c) 2023 - present TinyEngine Authors. +* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. +* +* Use of this source code is governed by an MIT-style license. +* +* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, +* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR +* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. +* +*/ + +const path = require('path') +const fse = require('fs-extra') + +const removeDir = (dir) => { + if (fse.existsSync(dir)) { + fse.removeSync(dir) + } +} + +const moveDir = (src, dest) => { + if (fse.existsSync(src)) { + fse.moveSync(src, dest, { + overwrite: true + }) + } +} + +const copyDir = (src, dest) => { + if (fse.existsSync(src)) { + fse.copySync(src, dest, { + overwrite: true + }) + } +} + +const run = () => { + const vscodeDir = path.resolve('/Tiny/lowcode-vscode/packages/vsix-crm/project/public/editor') + + moveDir(path.join(__dirname, '../dist/editor/monaco-workers'), path.join(__dirname, '../dist/monaco-workers')) + removeDir(path.join(__dirname, '../dist/angular')) + removeDir(path.join(__dirname, '../dist/editor')) + removeDir(path.join(__dirname, '../dist/img-crm')) + removeDir(path.join(__dirname, '../dist/mock')) + removeDir(vscodeDir) + copyDir(path.join(__dirname, '../dist'), vscodeDir) +} + +run() diff --git a/dl-flow-frontend/scripts/logger.mjs b/dl-flow-frontend/scripts/logger.mjs new file mode 100644 index 0000000..e7e8657 --- /dev/null +++ b/dl-flow-frontend/scripts/logger.mjs @@ -0,0 +1,43 @@ +import colors from 'picocolors' + +class Logger { + constructor(command) { + this.command = command + } + + output(type, msg) { + const format = () => { + const colorMap = { + info: 'cyan', + warn: 'yellow', + error: 'red', + success: 'green' + } + const time = new Date().toLocaleTimeString() + const colorMsg = colors[colorMap[type]](msg) + + return `[${this.command}] [${colors.dim(time)}] ${colorMsg}` + } + + // eslint-disable-next-line no-console + return console.log(format()) + } + + info(msg) { + this.output('info', msg) + } + + warn(msg) { + this.output('warn', msg) + } + + error(msg) { + this.output('error', msg) + } + + success(msg) { + this.output('success', msg) + } +} + +export default Logger diff --git a/dl-flow-frontend/scripts/setup.js b/dl-flow-frontend/scripts/setup.js new file mode 100644 index 0000000..64a7d1f --- /dev/null +++ b/dl-flow-frontend/scripts/setup.js @@ -0,0 +1,9 @@ +const { exec } = require('child_process') +const fs = require('fs') +const path = require('path') + +fs.access(path.resolve(__dirname, 'packages/vue-generator/dist'), (err) => { + if (err) { + exec('pnpm -F @opentiny/tiny-engine-dsl-vue build') + } +}) diff --git a/dl-flow-frontend/scripts/splitMaterials.mjs b/dl-flow-frontend/scripts/splitMaterials.mjs new file mode 100644 index 0000000..e81143c --- /dev/null +++ b/dl-flow-frontend/scripts/splitMaterials.mjs @@ -0,0 +1,60 @@ +import fs from 'fs-extra' +import path from 'node:path' +import Logger from './logger.mjs' + +const logger = new Logger('splitMaterials') + +// 物料资产包mock数据路径 +const bundlePath = path.join(process.cwd(), '/packages/design-core/public/mock/bundle.json') +// 物料文件存放文件夹名称 +const materialsDir = 'materials' +const bundle = fs.readJSONSync(bundlePath) +const { components, snippets, blocks } = bundle.data.materials + +const capitalize = (str) => `${str.charAt(0).toUpperCase()}${str.slice(1)}` +const toPascalCase = (str) => str.split('-').map(capitalize).join('') + +/** + * 将物料资产包拆分为单个组件 + */ +const splitMaterials = () => { + try { + components.forEach((comp) => { + snippets.some((child) => { + const snippet = child.children.find((item) => { + if (Array.isArray(comp.component)) { + return toPascalCase(comp.component[0]) === toPascalCase(item.snippetName) + } + + return toPascalCase(comp.component) === toPascalCase(item.snippetName) + }) + + if (snippet) { + comp.snippets = [snippet] + comp.category = child.group + + return true + } + + return false + }) + + const fileName = Array.isArray(comp.component) ? comp.component[0] : comp.component + const componentPath = path.join(process.cwd(), materialsDir, 'components', `${toPascalCase(fileName)}.json`) + + fs.outputJsonSync(componentPath, comp, { spaces: 2 }) + }) + + blocks.forEach((block) => { + const blockPath = path.join(process.cwd(), materialsDir, 'blocks', `${block.label}.json`) + + fs.outputJsonSync(blockPath, block, { spaces: 2 }) + }) + + logger.success('拆分物料资产包完成') + } catch (error) { + logger.error(`拆分物料资产包失败: ${error}`) + } +} + +splitMaterials() diff --git a/dl-flow.code-workspace b/dl-flow.code-workspace new file mode 100644 index 0000000..a99003d --- /dev/null +++ b/dl-flow.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "./dl-flow-frontend" + }, + { + "path": "./dl-flow-backend" + } + ] +} diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..d1c04c1 --- /dev/null +++ b/dockerfile @@ -0,0 +1,12 @@ +FROM node:18 as builder +WORKDIR /CODE +ADD . /CODE/ + +RUN npm install pnpm -g && \ + pnpm install && \ + pnpm build:frontend + +FROM nginx as RUNNER +COPY --from=builder /CODE/dl-flow-frontend/packages/design-core/dist /usr/share/nginx/html +VOLUME [ "/etc/nginx/nginx.conf", "/etc/nginx/conf.d", "/var/log/nginx"] +EXPOSE 80 diff --git a/package.json b/package.json new file mode 100644 index 0000000..8862177 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "private": true, + "packageManager": "pnpm@8.15.3", + "devDependencies": { + "concurrently": "^8.2.0", + "rimraf": "^3.0.2" + }, + "scripts": { + "clean:node_modules": "rimraf -V dl-flow-{backend,frontend}/node_modules", + "clean:dist": "rimraf -V dl-flow-{backend,frontend}/dist", + "build:frontend": "pnpm --filter tiny-engine build:plugin && pnpm --filter tiny-engine build:prod", + "build:backend": "pnpm -C dl-flow-backend build", + "test:back": "pnpm -C dl-flow-backend test", + "start:all": "pnpm start", + "start:back": "pnpm -C dl-flow-backend start:dev", + "start:front": "pnpm -C dl-flow-frontend dev", + "start": "concurrently \"pnpm start:back\" \"pnpm start:front\"" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..477c13d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,23868 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + concurrently: + specifier: ^8.2.0 + version: 8.2.2 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + + dl-flow-backend: + dependencies: + '@liaoliaots/nestjs-redis': + specifier: ^9.0.5 + version: 9.0.5(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(ioredis@5.3.2) + '@nestjs/common': + specifier: ^9.0.0 + version: 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^9.0.0 + version: 9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/jwt': + specifier: ^10.2.0 + version: 10.2.0(@nestjs/common@9.4.3) + '@nestjs/mapped-types': + specifier: '*' + version: 2.0.5(@nestjs/common@9.4.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + '@nestjs/mongoose': + specifier: ^10.0.2 + version: 10.0.4(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(mongoose@8.3.0)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^9.0.0 + version: 9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3) + '@nestjs/platform-socket.io': + specifier: ^10.3.2 + version: 10.3.7(@nestjs/common@9.4.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1) + '@nestjs/websockets': + specifier: ^10.3.2 + version: 10.3.7(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(@nestjs/platform-socket.io@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + bcryptjs: + specifier: ^2.4.3 + version: 2.4.3 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.1 + version: 0.14.1 + compressing: + specifier: ^1.10.0 + version: 1.10.0 + ioredis: + specifier: ^5.3.2 + version: 5.3.2 + mongoose: + specifier: ^8.1.1 + version: 8.3.0 + ms: + specifier: ^2.1.3 + version: 2.1.3 + ramda: + specifier: ^0.29.1 + version: 0.29.1 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.14 + rxjs: + specifier: ^7.2.0 + version: 7.8.1 + socket.io: + specifier: ^4.7.4 + version: 4.7.5 + devDependencies: + '@antv/x6': + specifier: ^2.18.1 + version: 2.18.1 + '@golevelup/ts-jest': + specifier: ^0.4.0 + version: 0.4.0 + '@nestjs/cli': + specifier: ^9.0.0 + version: 9.5.0 + '@nestjs/schematics': + specifier: ^9.0.0 + version: 9.2.0(typescript@5.4.3) + '@nestjs/testing': + specifier: ^9.0.0 + version: 9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(@nestjs/platform-express@9.4.3) + '@types/bcryptjs': + specifier: ^2.4.6 + version: 2.4.6 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/jest': + specifier: 29.5.1 + version: 29.5.1 + '@types/ms': + specifier: ^0.7.34 + version: 0.7.34 + '@types/node': + specifier: 18.16.12 + version: 18.16.12 + '@types/ramda': + specifier: ^0.29.10 + version: 0.29.12 + '@types/supertest': + specifier: ^2.0.11 + version: 2.0.16 + '@typescript-eslint/eslint-plugin': + specifier: ^5.0.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': + specifier: ^5.0.0 + version: 5.62.0(eslint@8.57.0)(typescript@5.4.3) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + eslint: + specifier: ^8.0.1 + version: 8.57.0 + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8) + express: + specifier: ^4.18.2 + version: 4.19.2 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@18.16.12)(ts-node@10.9.2) + mongodb-memory-server: + specifier: ^9.1.6 + version: 9.1.8 + prettier: + specifier: ^2.3.2 + version: 2.8.8 + redis-memory-server: + specifier: ^0.10.0 + version: 0.10.0 + source-map-support: + specifier: ^0.5.20 + version: 0.5.21 + supertest: + specifier: ^6.1.3 + version: 6.3.4 + ts-jest: + specifier: 29.1.0 + version: 29.1.0(@babel/core@7.18.13)(jest@29.5.0)(typescript@5.4.3) + ts-loader: + specifier: ^9.2.3 + version: 9.5.1(typescript@5.4.3)(webpack@5.91.0) + ts-node: + specifier: ^10.0.0 + version: 10.9.2(@types/node@18.16.12)(typescript@5.4.3) + tsconfig-paths: + specifier: 4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.0.0 + version: 5.4.3 + webpack: + specifier: ^5.90.1 + version: 5.91.0 + + dl-flow-frontend: + dependencies: + '@antv/x6': + specifier: ^2.17.1 + version: 2.18.1 + '@antv/x6-plugin-keyboard': + specifier: ^2.2.2 + version: 2.2.3(@antv/x6@2.18.1) + '@antv/x6-plugin-selection': + specifier: ^2.2.1 + version: 2.2.2(@antv/x6@2.18.1) + '@antv/x6-vue-shape': + specifier: ^2.1.1 + version: 2.1.2(@antv/x6@2.18.1)(vue@3.4.21) + dt-python-parser: + specifier: ^0.9.0 + version: 0.9.0 + devDependencies: + '@babel/eslint-parser': + specifier: ^7.21.3 + version: 7.24.1(@babel/core@7.18.13)(eslint@8.57.0) + '@esbuild-plugins/node-globals-polyfill': + specifier: ^0.2.3 + version: 0.2.3(esbuild@0.20.2) + '@esbuild-plugins/node-modules-polyfill': + specifier: ^0.2.2 + version: 0.2.2(esbuild@0.20.2) + '@types/antlr4': + specifier: ^4.11.6 + version: 4.11.6 + '@types/node': + specifier: ^18.0.0 + version: 18.16.12 + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.4.21) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.2 + version: 1.3.10 + assert: + specifier: ^2.0.0 + version: 2.1.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + chokidar: + specifier: ^3.5.3 + version: 3.6.0 + concurrently: + specifier: ^8.2.0 + version: 8.2.2 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^16.3.1 + version: 16.4.5 + eslint: + specifier: ^8.38.0 + version: 8.57.0 + eslint-plugin-vue: + specifier: ^8.0.0 + version: 8.7.1(eslint@8.57.0) + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + husky: + specifier: ^8.0.0 + version: 8.0.3 + lerna: + specifier: ^7.2.0 + version: 7.4.2 + less: + specifier: ^4.1.2 + version: 4.2.0 + lint-staged: + specifier: ^13.2.0 + version: 13.3.0 + mysql: + specifier: ^2.18.1 + version: 2.18.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + picocolors: + specifier: ^1.0.0 + version: 1.0.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rollup-plugin-polyfill-node: + specifier: ^0.12.0 + version: 0.12.0(rollup@2.79.1) + rollup-plugin-terser: + specifier: ^7.0.2 + version: 7.0.2(rollup@2.79.1) + rollup-plugin-visualizer: + specifier: ^5.8.3 + version: 5.12.0(rollup@2.79.1) + svg-sprite-loader: + specifier: ^6.0.11 + version: 6.0.11 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vite-plugin-monaco-editor: + specifier: ^1.0.10 + version: 1.1.0(monaco-editor@0.33.0) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@4.5.3) + vue-eslint-parser: + specifier: ^8.0.1 + version: 8.3.0(eslint@8.57.0) + + dl-flow-frontend/mockServer: + dependencies: + '@opentiny/tiny-engine-dsl-vue': + specifier: 1.0.2 + version: link:../packages/vue-generator + '@seald-io/nedb': + specifier: ^4.0.2 + version: 4.0.4 + fs-extra: + specifier: ^11.1.1 + version: 11.2.0 + glob: + specifier: ^10.3.4 + version: 10.3.12 + koa: + specifier: ^2.11.0 + version: 2.15.2 + koa-body: + specifier: ^4.1.1 + version: 4.2.0 + koa-compose: + specifier: ^4.1.0 + version: 4.1.0 + koa-jwt: + specifier: ^3.6.0 + version: 3.6.0 + koa-router: + specifier: ^8.0.8 + version: 8.0.8 + koa-static2: + specifier: ^0.1.8 + version: 0.1.8 + devDependencies: + '@babel/cli': + specifier: ^7.8.4 + version: 7.24.1(@babel/core@7.18.13) + '@babel/core': + specifier: ^7.9.0 + version: 7.18.13 + '@babel/plugin-external-helpers': + specifier: ^7.8.3 + version: 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-runtime': + specifier: ^7.9.0 + version: 7.24.3(@babel/core@7.18.13) + '@babel/preset-env': + specifier: ^7.9.5 + version: 7.24.4(@babel/core@7.18.13) + '@babel/register': + specifier: ^7.9.0 + version: 7.23.7(@babel/core@7.18.13) + '@babel/runtime': + specifier: ^7.9.2 + version: 7.24.4 + babel-core: + specifier: ^7.0.0-bridge.0 + version: 7.0.0-bridge.0(@babel/core@7.18.13) + babel-eslint: + specifier: ^10.1.0 + version: 10.1.0(eslint@6.8.0) + babel-jest: + specifier: ^25.3.0 + version: 25.5.1(@babel/core@7.18.13) + eslint: + specifier: ^6.8.0 + version: 6.8.0 + eslint-config-standard: + specifier: ^14.1.1 + version: 14.1.1(eslint-plugin-import@2.29.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@4.3.1)(eslint-plugin-standard@4.1.0)(eslint@6.8.0) + eslint-friendly-formatter: + specifier: ^4.0.1 + version: 4.0.1 + eslint-plugin-html: + specifier: ^6.0.1 + version: 6.2.0 + eslint-plugin-import: + specifier: ^2.20.2 + version: 2.29.1(eslint@6.8.0) + eslint-plugin-jest: + specifier: ^23.8.2 + version: 23.20.0(eslint@6.8.0)(typescript@5.4.3) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@6.8.0) + eslint-plugin-promise: + specifier: ^4.2.1 + version: 4.3.1 + eslint-plugin-standard: + specifier: ^4.0.1 + version: 4.1.0(eslint@6.8.0) + gulp: + specifier: ^4.0.2 + version: 4.0.2 + gulp-eslint: + specifier: ^6.0.0 + version: 6.0.0 + gulp-nodemon: + specifier: ^2.5.0 + version: 2.5.0 + jest: + specifier: ^25.3.0 + version: 25.5.4 + koa-logger: + specifier: ^3.2.1 + version: 3.2.1 + + dl-flow-frontend/packages/blockToWebComponentTemplate: + dependencies: + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:* + version: link:../i18n + '@opentiny/tiny-engine-webcomponent-core': + specifier: workspace:* + version: link:../webcomponent + '@opentiny/vue': + specifier: ~3.11.0 + version: 3.11.2(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-icon': + specifier: ~3.11.0 + version: 3.11.0 + '@opentiny/vue-theme': + specifier: ~3.11.0 + version: 3.11.6 + '@vue/shared': + specifier: ^3.3.11 + version: 3.4.21 + vue: + specifier: ^3.3.11 + version: 3.4.21 + vue-i18n: + specifier: ^9.8.0 + version: 9.11.0(vue@3.4.21) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.5.2 + version: 4.6.2(vite@4.5.3)(vue@3.4.21) + '@vitejs/plugin-vue-jsx': + specifier: ^3.1.0 + version: 3.1.0(vite@4.5.3)(vue@3.4.21) + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/builtinComponent: + dependencies: + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + vite-plugin-css-injected-by-js: + specifier: ^3.3.1 + version: 3.5.0(vite@4.5.3) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.4.21) + '@vitejs/plugin-vue-jsx': + specifier: ^3.0.2 + version: 3.1.0(vite@4.5.3)(vue@3.4.21) + vite: + specifier: ^4.5.0 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/canvas: + dependencies: + '@babel/core': + specifier: 7.18.13 + version: 7.18.13 + '@opentiny/tiny-engine-builtin-component': + specifier: workspace:* + version: link:../builtinComponent + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../controller + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:* + version: link:../i18n + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../utils + '@opentiny/tiny-engine-webcomponent-core': + specifier: workspace:* + version: link:../webcomponent + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-icon': + specifier: ~3.10.0 + version: 3.10.1 + '@opentiny/vue-renderless': + specifier: ~3.10.0 + version: 3.10.7 + '@vue/babel-plugin-jsx': + specifier: 1.1.1 + version: 1.1.1(@babel/core@7.18.13) + '@vue/shared': + specifier: ^3.3.4 + version: 3.4.21 + '@vueuse/components': + specifier: ^10.7.2 + version: 10.9.0(vue@3.2.45) + '@vueuse/core': + specifier: ^9.6.0 + version: 9.13.0(vue@3.2.45) + vue: + specifier: 3.2.45 + version: 3.2.45 + vue-i18n: + specifier: 9.2.2 + version: 9.2.2(vue@3.2.45) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + rollup-plugin-terser: + specifier: ^7.0.2 + version: 7.0.2(rollup@2.79.1) + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/common: + dependencies: + '@babel/generator': + specifier: 7.18.13 + version: 7.18.13 + '@babel/parser': + specifier: 7.18.13 + version: 7.18.13 + '@babel/traverse': + specifier: 7.18.13 + version: 7.18.13 + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../canvas + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../controller + '@opentiny/tiny-engine-http': + specifier: workspace:* + version: link:../http + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:* + version: link:../i18n + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-icon': + specifier: ~3.10.0 + version: 3.10.1 + '@opentiny/vue-locale': + specifier: ~3.10.0 + version: 3.10.0 + '@opentiny/vue-renderless': + specifier: ~3.10.0 + version: 3.10.7 + '@vue/shared': + specifier: ^3.3.4 + version: 3.4.21 + css-tree: + specifier: ^2.3.1 + version: 2.3.1 + monaco-editor: + specifier: 0.33.0 + version: 0.33.0 + prettier: + specifier: 2.7.1 + version: 2.7.1 + vue: + specifier: 3.2.45 + version: 3.2.45 + vue-draggable-next: + specifier: 2.1.0 + version: 2.1.0(sortablejs@1.15.2)(vue@3.2.45) + vue-i18n: + specifier: 9.2.2 + version: 9.2.2(vue@3.2.45) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/controller: + dependencies: + '@opentiny/tiny-engine-builtin-component': + specifier: workspace:* + version: link:../builtinComponent + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../common + '@opentiny/tiny-engine-http': + specifier: workspace:* + version: link:../http + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-renderless': + specifier: ~3.10.0 + version: 3.10.7 + '@vue/shared': + specifier: ^3.3.4 + version: 3.4.21 + '@vueuse/core': + specifier: ^10.9.0 + version: 10.9.0(vue@3.2.45) + monaco-editor: + specifier: 0.33.0 + version: 0.33.0 + socket.io-client: + specifier: ^4.7.4 + version: 4.7.5 + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/design-core: + dependencies: + '@babel/core': + specifier: 7.18.13 + version: 7.18.13 + '@babel/generator': + specifier: 7.18.13 + version: 7.18.13 + '@babel/parser': + specifier: 7.18.13 + version: 7.18.13 + '@babel/traverse': + specifier: 7.18.13 + version: 7.18.13 + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../controller + '@opentiny/tiny-engine-http': + specifier: workspace:* + version: link:../http + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:* + version: link:../i18n + '@opentiny/tiny-engine-plugin-materials': + specifier: workspace:* + version: link:../plugins/materials + '@opentiny/tiny-engine-plugin-schema': + specifier: workspace:* + version: link:../plugins/schema + '@opentiny/tiny-engine-setting-props': + specifier: workspace:* + version: link:../settings/props + '@opentiny/tiny-engine-svgs': + specifier: workspace:* + version: link:../svgs + '@opentiny/tiny-engine-theme-dark': + specifier: workspace:* + version: link:../theme/dark + '@opentiny/tiny-engine-theme-light': + specifier: workspace:* + version: link:../theme/light + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../utils + '@opentiny/tiny-engine-webcomponent-core': + specifier: workspace:* + version: link:../webcomponent + '@opentiny/vue': + specifier: ~3.11.0 + version: 3.11.2(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-design-smb': + specifier: ~3.11.0 + version: 3.11.0 + '@opentiny/vue-icon': + specifier: ^3.15.0 + version: 3.15.0 + '@opentiny/vue-renderless': + specifier: ~3.11.0 + version: 3.11.8 + '@opentiny/vue-theme': + specifier: ~3.11.0 + version: 3.11.6 + '@vue/babel-plugin-jsx': + specifier: 1.1.1 + version: 1.1.1(@babel/core@7.18.13) + '@vue/repl': + specifier: ^2.9.0 + version: 2.9.0 + '@vueuse/core': + specifier: ^9.6.0 + version: 9.13.0(vue@3.2.45) + dl-flow-setting-code: + specifier: workspace:^ + version: link:../settings/code + dl-flow-toolbar-export: + specifier: workspace:^ + version: link:../toolbars/export + dl-flow-toolbar-menu: + specifier: workspace:^ + version: link:../toolbars/menu + dl-flow-toolbar-rename: + specifier: workspace:^ + version: link:../toolbars/rename + dl-flow-toolbar-save: + specifier: workspace:^ + version: link:../toolbars/save + element-resize-detector: + specifier: ^1.2.4 + version: 1.2.4 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + html2canvas: + specifier: ^1.4.1 + version: 1.4.1 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + monaco-editor: + specifier: 0.33.0 + version: 0.33.0 + prettier: + specifier: 2.7.1 + version: 2.7.1 + sortablejs: + specifier: ^1.14.0 + version: 1.15.2 + vue: + specifier: 3.2.45 + version: 3.2.45 + vue-clipboard3: + specifier: ^2.0.0 + version: 2.0.0 + vue-draggable-next: + specifier: 2.1.0 + version: 2.1.0(sortablejs@1.15.2)(vue@3.2.45) + vue-i18n: + specifier: 9.2.2 + version: 9.2.2(vue@3.2.45) + vue-router: + specifier: ^4.3.0 + version: 4.3.0(vue@3.2.45) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + devDependencies: + '@babel/eslint-parser': + specifier: ^7.21.3 + version: 7.24.1(@babel/core@7.18.13)(eslint@8.57.0) + '@esbuild-plugins/node-globals-polyfill': + specifier: ^0.2.3 + version: 0.2.3(esbuild@0.20.2) + '@esbuild-plugins/node-modules-polyfill': + specifier: ^0.2.2 + version: 0.2.2(esbuild@0.20.2) + '@types/node': + specifier: ^18.0.0 + version: 18.16.12 + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.2 + version: 1.3.10 + assert: + specifier: ^2.0.0 + version: 2.1.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.38.0 + version: 8.57.0 + eslint-plugin-vue: + specifier: ^8.0.0 + version: 8.7.1(eslint@8.57.0) + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + husky: + specifier: ^8.0.0 + version: 8.0.3 + lerna: + specifier: ^7.2.0 + version: 7.4.2 + less: + specifier: ^4.1.2 + version: 4.2.0 + lint-staged: + specifier: ^13.2.0 + version: 13.3.0 + path: + specifier: ^0.12.7 + version: 0.12.7 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rollup-plugin-polyfill-node: + specifier: ^0.12.0 + version: 0.12.0(rollup@2.79.1) + rollup-plugin-terser: + specifier: ^7.0.2 + version: 7.0.2(rollup@2.79.1) + rollup-plugin-visualizer: + specifier: ^5.8.3 + version: 5.12.0(rollup@2.79.1) + svg-sprite-loader: + specifier: ^6.0.11 + version: 6.0.11 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vite-plugin-monaco-editor: + specifier: ^1.0.10 + version: 1.1.0(monaco-editor@0.33.0) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@4.5.3) + vue-eslint-parser: + specifier: ^8.0.1 + version: 8.3.0(eslint@8.57.0) + + dl-flow-frontend/packages/http: + dependencies: + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../common + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@vueuse/core': + specifier: ^9.13.0 + version: 9.13.0(vue@3.2.45) + axios: + specifier: ^0.27.2 + version: 0.27.2 + axios-cache-adapter: + specifier: ^2.7.3 + version: 2.7.3(axios@0.27.2) + axios-mock-adapter: + specifier: ^1.21.5 + version: 1.22.0(axios@0.27.2) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/i18n: + dependencies: + '@opentiny/tiny-engine-webcomponent-core': + specifier: workspace:* + version: link:../webcomponent + vue: + specifier: ^3.2.1 + version: 3.4.21 + vue-i18n: + specifier: ^9.2.0-beta.32 + version: 9.11.0(vue@3.4.21) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^2.2.0 + version: 2.3.4(vite@2.9.18)(vue@3.4.21) + babel-eslint: + specifier: ^10.1.0 + version: 10.1.0(eslint@7.32.0) + eslint: + specifier: ^7.32.0 + version: 7.32.0 + eslint-plugin-import: + specifier: ^2.24.2 + version: 2.29.1(eslint@7.32.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@7.32.0) + eslint-plugin-promise: + specifier: ^5.1.0 + version: 5.2.0(eslint@7.32.0) + eslint-plugin-standard: + specifier: ^4.0.0 + version: 4.1.0(eslint@7.32.0) + eslint-plugin-vue: + specifier: ^7.17.0 + version: 7.20.0(eslint@7.32.0) + prettier: + specifier: ^2.4.0 + version: 2.7.1 + vite: + specifier: ^2.9.1 + version: 2.9.18 + + dl-flow-frontend/packages/plugins/materials: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-http': + specifier: workspace:* + version: link:../../http + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:^ + version: link:../../i18n + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/plugins/schema: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-http': + specifier: workspace:* + version: link:../../http + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/settings/code: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:^ + version: link:../../i18n + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-icon': + specifier: ~3.10.0 + version: 3.10.1 + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/settings/props: + dependencies: + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-i18n-host': + specifier: workspace:^ + version: link:../../i18n + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-icon': + specifier: ~3.10.0 + version: 3.10.1 + '@vueuse/core': + specifier: ^9.6.0 + version: 9.13.0(vue@3.2.45) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/svgs: + dependencies: + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + '@opentiny/vue-icon': + specifier: ~3.10.0 + version: 3.10.1 + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/theme/dark: + devDependencies: + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/theme/light: + devDependencies: + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/toolbars/export: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/toolbars/menu: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + dl-flow-toolbar-export: + specifier: workspace:^ + version: link:../export + dl-flow-toolbar-save: + specifier: workspace:^ + version: link:../save + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/toolbars/rename: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/toolbars/save: + dependencies: + '@opentiny/tiny-engine-canvas': + specifier: workspace:* + version: link:../../canvas + '@opentiny/tiny-engine-common': + specifier: workspace:* + version: link:../../common + '@opentiny/tiny-engine-controller': + specifier: workspace:* + version: link:../../controller + '@opentiny/tiny-engine-utils': + specifier: workspace:* + version: link:../../utils + '@opentiny/vue': + specifier: ~3.10.0 + version: 3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0) + vue: + specifier: 3.2.45 + version: 3.2.45 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.3)(vue@3.2.45) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + + dl-flow-frontend/packages/utils: + dependencies: + '@opentiny/vue-renderless': + specifier: ~3.10.0 + version: 3.10.7 + vue: + specifier: ^3.3.8 + version: 3.4.21 + devDependencies: + vite: + specifier: ^4.3.7 + version: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vitest: + specifier: ^0.34.6 + version: 0.34.6 + + dl-flow-frontend/packages/vue-generator: + dependencies: + '@opentiny/tiny-engine-builtin-component': + specifier: workspace:* + version: link:../builtinComponent + '@vue/compiler-sfc': + specifier: 3.2.45 + version: 3.2.45 + '@vue/shared': + specifier: ^3.3.4 + version: 3.4.21 + vue: + specifier: 3.2.45 + version: 3.2.45 + vue-eslint-parser: + specifier: 8.3.0 + version: 8.3.0(eslint@8.57.0) + devDependencies: + '@rushstack/eslint-patch': + specifier: ^1.1.1 + version: 1.10.1 + '@vue/eslint-config-prettier': + specifier: ^7.0.0 + version: 7.1.0(eslint@8.57.0)(prettier@2.7.1) + eslint: + specifier: ^8.12.0 + version: 8.57.0 + eslint-plugin-vue: + specifier: ^8.6.0 + version: 8.7.1(eslint@8.57.0) + fs-extra: + specifier: ^10.0.1 + version: 10.1.0 + prettier: + specifier: ^2.6.1 + version: 2.7.1 + vite: + specifier: ^2.8.6 + version: 2.9.18 + winston: + specifier: ^3.10.0 + version: 3.13.0 + + dl-flow-frontend/packages/webcomponent: + dependencies: + '@vue/shared': + specifier: ^3.3.4 + version: 3.4.21 + vue: + specifier: ^3.2.1 + version: 3.4.21 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^2.2.0 + version: 2.3.4(vite@2.9.18)(vue@3.4.21) + babel-eslint: + specifier: ^10.1.0 + version: 10.1.0(eslint@7.32.0) + eslint: + specifier: ^7.32.0 + version: 7.32.0 + eslint-plugin-import: + specifier: ^2.24.2 + version: 2.29.1(eslint@7.32.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@7.32.0) + eslint-plugin-promise: + specifier: ^5.1.0 + version: 5.2.0(eslint@7.32.0) + eslint-plugin-standard: + specifier: ^4.0.0 + version: 4.1.0(eslint@7.32.0) + eslint-plugin-vue: + specifier: ^7.17.0 + version: 7.20.0(eslint@7.32.0) + prettier: + specifier: ^2.4.0 + version: 2.7.1 + vite: + specifier: ^2.9.1 + version: 2.9.18 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + /@angular-devkit/core@16.0.1(chokidar@3.5.3): + resolution: {integrity: sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + chokidar: 3.5.3 + jsonc-parser: 3.2.0 + rxjs: 7.8.1 + source-map: 0.7.4 + dev: true + + /@angular-devkit/schematics-cli@16.0.1(chokidar@3.5.3): + resolution: {integrity: sha512-6KLA125dpgd6oJGtiO2JpZAb92uOG3njQGIt7NFcuQGW/5GO7J41vMXH9cBAfdtbV8SIggSmR/cIEE9ijfj6YQ==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + ansi-colors: 4.1.3 + inquirer: 8.2.4 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - chokidar + dev: true + + /@angular-devkit/schematics@16.0.1(chokidar@3.5.3): + resolution: {integrity: sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + jsonc-parser: 3.2.0 + magic-string: 0.30.0 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + dev: true + + /@antv/x6-common@2.0.17: + resolution: {integrity: sha512-37g7vmRkNdYzZPdwjaMSZEGv/MMH0S4r70/Jwoab1mioycmuIBN73iyziX8m56BvJSDucZ3J/6DU07otWqzS6A==} + dependencies: + lodash-es: 4.17.21 + utility-types: 3.11.0 + + /@antv/x6-geometry@2.0.5: + resolution: {integrity: sha512-MId6riEQkxphBpVeTcL4ZNXL4lScyvDEPLyIafvWMcWNTGK0jgkK7N20XSzqt8ltJb0mGUso5s56mrk8ysHu2A==} + + /@antv/x6-plugin-keyboard@2.2.3(@antv/x6@2.18.1): + resolution: {integrity: sha512-pnCIC+mDyKKfkcDyLePfGxKVIqXBcldTgannITkHC1kc0IafRS1GMvzpvuDGrM5haRYd6Nwz8kjkJyHkJE4GPA==} + peerDependencies: + '@antv/x6': ^2.x + dependencies: + '@antv/x6': 2.18.1 + mousetrap: 1.6.5 + dev: false + + /@antv/x6-plugin-selection@2.2.2(@antv/x6@2.18.1): + resolution: {integrity: sha512-s2gtR9Onlhr7HOHqyqg0d+4sG76JCcQEbvrZZ64XmSChlvieIPlC3YtH4dg1KMNhYIuBmBmpSum6S0eVTEiPQw==} + peerDependencies: + '@antv/x6': ^2.x + dependencies: + '@antv/x6': 2.18.1 + dev: false + + /@antv/x6-vue-shape@2.1.2(@antv/x6@2.18.1)(vue@3.4.21): + resolution: {integrity: sha512-lfLNJ2ztK8NP2JBAWTD6m5Wol0u6tOqj2KdOhWZoT8EtEw9rMmAdxsr8uTi9MRJO9pDMM0nbsR3cidnMh7VeDQ==} + peerDependencies: + '@antv/x6': ^2.x + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^2.0.0 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + '@antv/x6': 2.18.1 + vue: 3.4.21 + vue-demi: 0.14.7(vue@3.4.21) + dev: false + + /@antv/x6@2.18.1: + resolution: {integrity: sha512-FkWdbLOpN9J7dfJ+kiBxzowSx2N6syBily13NMVdMs+wqC6Eo5sLXWCZjQHateTFWgFw7ZGi2y9o3Pmdov1sXw==} + dependencies: + '@antv/x6-common': 2.0.17 + '@antv/x6-geometry': 2.0.5 + utility-types: 3.11.0 + + /@babel/cli@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@jridgewell/trace-mapping': 0.3.25 + commander: 4.1.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + dev: true + + /@babel/code-frame@7.12.11: + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + dependencies: + '@babel/highlight': 7.24.2 + dev: true + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.18.13: + resolution: {integrity: sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.18.13 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.18.13) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.18.13 + '@babel/template': 7.24.0 + '@babel/traverse': 7.18.13 + '@babel/types': 7.24.0 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/eslint-parser@7.24.1(@babel/core@7.18.13)(eslint@8.57.0): + resolution: {integrity: sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.18.13 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + dev: true + + /@babel/generator@7.18.13: + resolution: {integrity: sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + jsesc: 2.5.2 + + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.18.13): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.18.13) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.18.13): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.18.13): + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.18.13): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.18.13): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + /@babel/parser@7.18.13: + resolution: {integrity: sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.18.13): + resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.18.13) + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-external-helpers@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-l3JgdWBntLRPvZkKzHmc0z+AkI91MmXOJUAeUlHbCYfgv8qLZPcYYsAIdY3iLG3TYIDDCC6Ob+e1knlniSX6fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.18.13): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.13): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.13): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.18.13): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.13): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.13): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.13): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.18.13): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.13): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.18.13): + resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.18.13) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.18.13): + resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.18.13): + resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.18.13) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/template': 7.24.0 + dev: true + + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.18.13): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.18.13): + resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.18.13) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.18.13) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.18.13) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.18.13): + resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/preset-env@7.24.4(@babel/core@7.18.13): + resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.18.13) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.18.13) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.13) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.13) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.18.13) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.18.13) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.13) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.18.13) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.18.13) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.18.13) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.18.13) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.18.13) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.18.13) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.18.13) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.18.13) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.18.13) + core-js-compat: 3.36.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.18.13): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/types': 7.24.0 + esutils: 2.0.3 + dev: true + + /@babel/register@7.23.7(@babel/core@7.18.13): + resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + + /@babel/traverse@7.18.13: + resolution: {integrity: sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.18.13 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.18.13 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@better-scroll/core@2.5.0: + resolution: {integrity: sha512-+3aKf8T3kUl4Gj1M7NKV3fNFhsrBpTWwHoDClkXVmQ8S3TxMMHf6Kyw6l1zKsg4r+9ukW5lDDkyif7/gY76qXQ==} + dependencies: + '@better-scroll/shared-utils': 2.5.1 + dev: false + + /@better-scroll/shared-utils@2.5.1: + resolution: {integrity: sha512-AplkfSjXVYP9LZiD6JsKgmgQJ/mG4uuLmBuwLz8W5OsYc7AYTfN8kw6GqZ5OwCGoXkVhBGyd8NeC4xwYItp0aw==} + dev: false + + /@better-scroll/wheel@2.5.0: + resolution: {integrity: sha512-+cru8CtMtgGGMv3yOxn33ApbtatOZBVUCa7+X3UqVVyaxi6FbCrcSZCBlXhXpsFhJo1R282O6nQyik6KUidvoA==} + dependencies: + '@better-scroll/core': 2.5.0 + dev: false + + /@cnakazawa/watch@1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.8 + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /@colors/colors@1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: true + + /@eggjs/yauzl@2.11.0: + resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer2: 1.2.0 + dev: false + + /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.20.2): + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.20.2 + dev: true + + /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.20.2): + resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.20.2 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@0.4.3: + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 7.3.1 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@golevelup/ts-jest@0.4.0: + resolution: {integrity: sha512-ehgllV/xU8PC+yVyEUtTzhiSQKsr7k5Jz74B6dtCaVJz7/Vo7JiaACsCLvD7/iATlJUAEqvBson0OHewD3JDzQ==} + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/config-array@0.5.0: + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@intlify/core-base@9.11.0: + resolution: {integrity: sha512-cveOqAstjLZIiyatcP/HrzrQ87cZI8ScPQna3yvoM8zjcjcIRK1MRvmxUNlPdg0rTNJMZw7rixPVM58O5aHVPA==} + engines: {node: '>= 16'} + dependencies: + '@intlify/message-compiler': 9.11.0 + '@intlify/shared': 9.11.0 + dev: false + + /@intlify/core-base@9.2.2: + resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} + engines: {node: '>= 14'} + dependencies: + '@intlify/devtools-if': 9.2.2 + '@intlify/message-compiler': 9.2.2 + '@intlify/shared': 9.2.2 + '@intlify/vue-devtools': 9.2.2 + dev: false + + /@intlify/devtools-if@9.2.2: + resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.2.2 + dev: false + + /@intlify/message-compiler@9.11.0: + resolution: {integrity: sha512-x31Gl7cscnoI4UUY1yaIy8e7vVMVW1VVlTXZz4SIHKqoSEUkfmgqK8NAx1e7RcoHEbICR7uyCbud0ZL1s4OGXQ==} + engines: {node: '>= 16'} + dependencies: + '@intlify/shared': 9.11.0 + source-map-js: 1.2.0 + dev: false + + /@intlify/message-compiler@9.2.2: + resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.2.2 + source-map: 0.6.1 + dev: false + + /@intlify/shared@9.11.0: + resolution: {integrity: sha512-KHSNgi7sRjmSm7aD8QH8WFt9VfKaekJuJ473opbJlkGY3EDnDUU8ikIhG8PbasQbgNvbY3m3tWNGqk2omIdwMA==} + engines: {node: '>= 16'} + dev: false + + /@intlify/shared@9.2.2: + resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} + engines: {node: '>= 14'} + dev: false + + /@intlify/vue-devtools@9.2.2: + resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==} + engines: {node: '>= 14'} + dependencies: + '@intlify/core-base': 9.2.2 + '@intlify/shared': 9.2.2 + dev: false + + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@25.5.0: + resolution: {integrity: sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + chalk: 3.0.0 + jest-message-util: 25.5.0 + jest-util: 25.5.0 + slash: 3.0.0 + dev: true + + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/core@25.5.4: + resolution: {integrity: sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/console': 25.5.0 + '@jest/reporters': 25.5.1 + '@jest/test-result': 25.5.0 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + ansi-escapes: 4.3.2 + chalk: 3.0.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 25.5.0 + jest-config: 25.5.4 + jest-haste-map: 25.5.1 + jest-message-util: 25.5.0 + jest-regex-util: 25.2.6 + jest-resolve: 25.5.1 + jest-resolve-dependencies: 25.5.4 + jest-runner: 25.5.4 + jest-runtime: 25.5.4 + jest-snapshot: 25.5.1 + jest-util: 25.5.0 + jest-validate: 25.5.0 + jest-watcher: 25.5.0 + micromatch: 4.0.5 + p-each-series: 2.2.0 + realpath-native: 2.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /@jest/core@29.7.0(ts-node@10.9.2): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.16.12)(ts-node@10.9.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@25.5.0: + resolution: {integrity: sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/fake-timers': 25.5.0 + '@jest/types': 25.5.0 + jest-mock: 25.5.0 + dev: true + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@25.5.0: + resolution: {integrity: sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + jest-message-util: 25.5.0 + jest-mock: 25.5.0 + jest-util: 25.5.0 + lolex: 5.1.2 + dev: true + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.16.12 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /@jest/globals@25.5.2: + resolution: {integrity: sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/environment': 25.5.0 + '@jest/types': 25.5.0 + expect: 25.5.0 + dev: true + + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@25.5.1: + resolution: {integrity: sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==} + engines: {node: '>= 8.3'} + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + chalk: 3.0.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-haste-map: 25.5.1 + jest-resolve: 25.5.1 + jest-util: 25.5.0 + jest-worker: 25.5.0 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 3.1.0 + terminal-link: 2.1.1 + v8-to-istanbul: 4.1.4 + optionalDependencies: + node-notifier: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 18.16.12 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@25.5.0: + resolution: {integrity: sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==} + engines: {node: '>= 8.3'} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@25.5.0: + resolution: {integrity: sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/console': 25.5.0 + '@jest/types': 25.5.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@25.5.4: + resolution: {integrity: sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/test-result': 25.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 25.5.1 + jest-runner: 25.5.4 + jest-runtime: 25.5.4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/transform@25.5.1: + resolution: {integrity: sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/core': 7.18.13 + '@jest/types': 25.5.0 + babel-plugin-istanbul: 6.1.1 + chalk: 3.0.0 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 25.5.1 + jest-regex-util: 25.2.6 + jest-util: 25.5.0 + micromatch: 4.0.5 + pirates: 4.0.6 + realpath-native: 2.0.0 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.18.13 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@25.5.0: + resolution: {integrity: sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==} + engines: {node: '>= 8.3'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 1.1.2 + '@types/yargs': 15.0.19 + chalk: 3.0.0 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.16.12 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@lerna/child-process@7.4.2: + resolution: {integrity: sha512-je+kkrfcvPcwL5Tg8JRENRqlbzjdlZXyaR88UcnCdNW0AJ1jX9IfHRys1X7AwSroU2ug8ESNC+suoBw1vX833Q==} + engines: {node: '>=16.0.0'} + dependencies: + chalk: 4.1.2 + execa: 5.0.0 + strong-log-transformer: 2.1.0 + dev: true + + /@lerna/create@7.4.2(typescript@5.4.3): + resolution: {integrity: sha512-1wplFbQ52K8E/unnqB0Tq39Z4e+NEoNrpovEnl6GpsTUrC6WDp8+w0Le2uCBV0hXyemxChduCkLz4/y1H1wTeg==} + engines: {node: '>=16.0.0'} + dependencies: + '@lerna/child-process': 7.4.2 + '@npmcli/run-script': 6.0.2 + '@nx/devkit': 16.10.0(nx@16.10.0) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.3.6(typescript@5.4.3) + dedent: 0.7.0 + execa: 5.0.0 + fs-extra: 11.2.0 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.6 + is-ci: 3.0.1 + is-stream: 2.0.0 + js-yaml: 4.1.0 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 4.0.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 16.10.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + pacote: 15.2.0 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.6.0 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + upath: 2.0.1 + uuid: 9.0.1 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + - typescript + dev: true + + /@liaoliaots/nestjs-redis@9.0.5(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(ioredis@5.3.2): + resolution: {integrity: sha512-nPcGLj0zW4mEsYtQYfWx3o7PmrMjuzFk6+t/g2IRopAeWWUZZ/5nIJ4KTKiz/3DJEUkbX8PZqB+dOhklGF0SVA==} + engines: {node: '>=12.22.0'} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + ioredis: ^5.0.0 + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + ioredis: 5.3.2 + tslib: 2.4.1 + dev: false + + /@lukeed/csprng@1.1.0: + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + /@mongodb-js/saslprep@1.1.5: + resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} + dependencies: + sparse-bitfield: 3.0.3 + + /@nestjs/cli@9.5.0: + resolution: {integrity: sha512-Z7q+3vNsQSG2d2r2Hl/OOj5EpfjVx3OfnJ9+KuAsOdw1sKLm7+Zc6KbhMFTd/eIvfx82ww3Nk72xdmfPYCulWA==} + engines: {node: '>= 12.9.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics-cli': 16.0.1(chokidar@3.5.3) + '@nestjs/schematics': 9.2.0(chokidar@3.5.3)(typescript@4.9.5) + chalk: 4.1.2 + chokidar: 3.5.3 + cli-table3: 0.6.3 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.82.1) + inquirer: 8.2.5 + node-emoji: 1.11.0 + ora: 5.4.1 + os-name: 4.0.1 + rimraf: 4.4.1 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.0.1 + typescript: 4.9.5 + webpack: 5.82.1 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + + /@nestjs/common@9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1): + resolution: {integrity: sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==} + peerDependencies: + cache-manager: <=5 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + class-transformer: 0.5.1 + class-validator: 0.14.1 + iterare: 1.2.1 + reflect-metadata: 0.1.14 + rxjs: 7.8.1 + tslib: 2.5.3 + uid: 2.0.2 + + /@nestjs/core@9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1): + resolution: {integrity: sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + '@nestjs/websockets': ^9.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3) + '@nestjs/websockets': 10.3.7(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(@nestjs/platform-socket.io@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nuxtjs/opencollective': 0.3.2 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.14 + rxjs: 7.8.1 + tslib: 2.5.3 + uid: 2.0.2 + transitivePeerDependencies: + - encoding + + /@nestjs/jwt@10.2.0(@nestjs/common@9.4.3): + resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@types/jsonwebtoken': 9.0.5 + jsonwebtoken: 9.0.2 + dev: false + + /@nestjs/mapped-types@2.0.5(@nestjs/common@9.4.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14): + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + class-transformer: 0.5.1 + class-validator: 0.14.1 + reflect-metadata: 0.1.14 + dev: false + + /@nestjs/mongoose@10.0.4(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(mongoose@8.3.0)(rxjs@7.8.1): + resolution: {integrity: sha512-OXcguhrv+ahXmpPD3FJgnCLU3eUSBcbE7OwClJL+3inpPAyvMbhLrYvk3Zi7/34aMCzBOILdCBh95AQ7ghd1sg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + mongoose: ^6.0.2 || ^7.0.0 || ^8.0.0 + rxjs: ^7.0.0 + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + mongoose: 8.3.0 + rxjs: 7.8.1 + dev: false + + /@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3): + resolution: {integrity: sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + body-parser: 1.20.2 + cors: 2.8.5 + express: 4.18.2 + multer: 1.4.4-lts.1 + tslib: 2.5.3 + transitivePeerDependencies: + - supports-color + + /@nestjs/platform-socket.io@10.3.7(@nestjs/common@9.4.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1): + resolution: {integrity: sha512-T9VbVgEUnbid/RiywN9/8YQ8pAGDP++0nX73l4kIWeDWkz5DEh4aLB7O/JvLA3/xRHdjTZ4RiRZazwqSWi1Sog==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + rxjs: ^7.1.0 + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/websockets': 10.3.7(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(@nestjs/platform-socket.io@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + rxjs: 7.8.1 + socket.io: 4.7.5 + tslib: 2.6.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /@nestjs/schematics@9.2.0(chokidar@3.5.3)(typescript@4.9.5): + resolution: {integrity: sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==} + peerDependencies: + typescript: '>=4.3.5' + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 4.9.5 + transitivePeerDependencies: + - chokidar + dev: true + + /@nestjs/schematics@9.2.0(typescript@5.4.3): + resolution: {integrity: sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==} + peerDependencies: + typescript: '>=4.3.5' + dependencies: + '@angular-devkit/core': 16.0.1(chokidar@3.5.3) + '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 5.4.3 + transitivePeerDependencies: + - chokidar + dev: true + + /@nestjs/testing@9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(@nestjs/platform-express@9.4.3): + resolution: {integrity: sha512-LDT8Ai2eKnTzvnPaJwWOK03qTaFap5uHHsJCv6dL0uKWk6hyF9jms8DjyVaGsaujCaXDG8izl1mDEER0OmxaZA==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3)(@nestjs/core@9.4.3) + tslib: 2.5.3 + dev: true + + /@nestjs/websockets@10.3.7(@nestjs/common@9.4.3)(@nestjs/core@9.4.3)(@nestjs/platform-socket.io@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1): + resolution: {integrity: sha512-iYdsWiRNPUy0XzPoW44bx2MW1griuraTr5fNhoe2rUSNO0mEW1aeXp4v56KeZDLAss31WbeckC5P3N223Fys5g==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/platform-socket.io': ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + dependencies: + '@nestjs/common': 9.4.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3)(@nestjs/platform-express@9.4.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/platform-socket.io': 10.3.7(@nestjs/common@9.4.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1) + iterare: 1.2.1 + object-hash: 3.0.0 + reflect-metadata: 0.1.14 + rxjs: 7.8.1 + tslib: 2.6.2 + + /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + requiresBuild: true + dev: true + optional: true + + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@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'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.0 + dev: true + + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.6.0 + dev: true + + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.0 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.1 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@nrwl/devkit@16.10.0(nx@16.10.0): + resolution: {integrity: sha512-fRloARtsDQoQgQ7HKEy0RJiusg/HSygnmg4gX/0n/Z+SUS+4KoZzvHjXc6T5ZdEiSjvLypJ+HBM8dQzIcVACPQ==} + dependencies: + '@nx/devkit': 16.10.0(nx@16.10.0) + transitivePeerDependencies: + - nx + dev: true + + /@nrwl/tao@16.10.0: + resolution: {integrity: sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q==} + hasBin: true + dependencies: + nx: 16.10.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug + dev: true + + /@nuxtjs/opencollective@0.3.2: + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + /@nx/devkit@16.10.0(nx@16.10.0): + resolution: {integrity: sha512-IvKQqRJFDDiaj33SPfGd3ckNHhHi6ceEoqCbAP4UuMXOPPVOX6H0KVk+9tknkPb48B7jWIw6/AgOeWkBxPRO5w==} + peerDependencies: + nx: '>= 15 <= 17' + dependencies: + '@nrwl/devkit': 16.10.0(nx@16.10.0) + ejs: 3.1.9 + enquirer: 2.3.6 + ignore: 5.3.1 + nx: 16.10.0 + semver: 7.5.3 + tmp: 0.2.3 + tslib: 2.6.2 + dev: true + + /@nx/nx-darwin-arm64@16.10.0: + resolution: {integrity: sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-darwin-x64@16.10.0: + resolution: {integrity: sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-freebsd-x64@16.10.0: + resolution: {integrity: sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm-gnueabihf@16.10.0: + resolution: {integrity: sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-gnu@16.10.0: + resolution: {integrity: sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-arm64-musl@16.10.0: + resolution: {integrity: sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-gnu@16.10.0: + resolution: {integrity: sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-linux-x64-musl@16.10.0: + resolution: {integrity: sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-arm64-msvc@16.10.0: + resolution: {integrity: sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nx/nx-win32-x64-msvc@16.10.0: + resolution: {integrity: sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: true + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@18.1.1: + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + dev: true + + /@octokit/plugin-enterprise-rest@6.0.1: + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.7 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.11: + resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: true + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: true + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: true + + /@opentiny/vue-action-menu@3.10.0: + resolution: {integrity: sha512-lUIo1QOPaMbCYnpYqbGyoHeQ9hM2U0YShuXXJQ6mjXLxvtdJlBzZURMCD+s/6YYZfuD0Uii79wLmC5Ak7rZseA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-action-menu@3.11.0: + resolution: {integrity: sha512-nbqP5N0dfNIFJZ47s5DfCyMBYsby0+0X0GJ+5UQs9CLbPe4UY6QtI85u/fcSf/tkgV5+wPFU2EufCpY++NrzHQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-action-sheet@3.10.0: + resolution: {integrity: sha512-0Va45Y5AgeKyCx5sj2I3AvoTAJ7OByHbpuvlVTAnUg5dCEMlPnepGR0tv2+wJaw17p/lldgByUAvX7KkiNWh6A==} + dependencies: + '@better-scroll/core': 2.5.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-drawer': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-action-sheet@3.11.0: + resolution: {integrity: sha512-UtsFZ0VGjyHINHISmWN2hszW1W6udeDMz9ZHxKxUCHDh2olMJQc5N6SbDRIlBeLodbLYKKEjYED8XYGxT8Cb/Q==} + dependencies: + '@better-scroll/core': 2.5.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-drawer': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-alert@3.10.0: + resolution: {integrity: sha512-ylzZMIVstXmC/W1eB7sLg5VmZ+Zm6HrNUBdYIy/065S9KydNwHQnSXnjGn+2AhJoI4CPUofEgUH3hqt6o7lmdQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-alert@3.11.0: + resolution: {integrity: sha512-Oa8K+ijQmAzYbcs/OHO0W79UzP7S4PoKluczCDmvA7gLH9VHvnIGH2WMGYT9m9l0ZlwuZ7XVcX13Kd0aLVWchA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-amount@3.10.0: + resolution: {integrity: sha512-oaHAQ4rA+hBnXSDDSuFdBkdKI6hay6y6NZGBq5ZndZDPkmEVqsl5SZEhIhHQUXtqgogUjFdyLjM0kO1/3NMlyA==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-currency': 3.10.0 + '@opentiny/vue-date-picker': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-amount@3.11.0: + resolution: {integrity: sha512-jyLXtgDJvOVU+G74WVgdIG26YP4B1+7sK4c1EO13hhTQYy+ZCz7r//OthKjpPF4N0qJQNj0IBONZMPl8CNXY/A==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-currency': 3.11.0 + '@opentiny/vue-date-picker': 3.11.1 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-anchor@3.10.0: + resolution: {integrity: sha512-jAfo/8RvKCI3L9q1SbFbEJ6staghW0MpaCDxUZbqantXGpJ1mT73XncjldX6HRjtiXQor7E8fZ5OlVGTxo32Sg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-anchor@3.11.0: + resolution: {integrity: sha512-4z+8qPnVd7lRUZqIT1RHwxcM2sPYEImbeLESEaGUsaW516vaw+d/cnO8GBhjP1oQwkPcBrJLUwEVW+j0k9viAA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-area@3.10.0: + resolution: {integrity: sha512-lTkLIdEcGaEAYlwfrFWxsebp5TVhRbG3JNYZxfmerTj53SOJAI2sd/1rUhMwOU4oLrncyS3fBXO8RmCbZZ2w5g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-area@3.11.0: + resolution: {integrity: sha512-GwDWNgoNymgkNnVvE2mP/AHcQsTD7JXAohjEnpfwe9soo3+yL7hJKv/y6795v3DbXtYXnSYFioLMPOt8UH7+Kw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-async-flowchart@3.11.0: + resolution: {integrity: sha512-hrbEGk3H9ioU4EqdvYP3mzRfjkjtwF8Lt3bI35+M5DTE3G9ZIbjeFK6zjnLoButkxrop8sSV++/4iUb8Qvq9mA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-flowchart': 3.11.0 + '@opentiny/vue-loading': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-autocomplete@3.10.0: + resolution: {integrity: sha512-ukfVDHQP1VGcWP3yv6rPyhtZR/3nURnNrSKErLmLz4nlWISZ37bYuLlHVRvdy7fLh4U+G+ouB4uNfo7J1pJIkA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-scrollbar': 3.10.0 + dev: false + + /@opentiny/vue-autocomplete@3.11.0: + resolution: {integrity: sha512-LIeaZuTOZYcJOvHjMFFJkep7gs0FQC2osQaxtdjo+JzXBLgMJUJn3hl+ZkMrTIMXLXUVU2cNcKCIgZ1DfJbbSg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-scrollbar': 3.11.0 + dev: false + + /@opentiny/vue-autonavi-map@3.10.0: + resolution: {integrity: sha512-ondl/tGmh5CsHHwRcyezldvKVZoE45aEr/8j9np5INiI/SdwGmoc8SHEA7WmkM17MdM8lU4E3VIAl1NxXekRMA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-autonavi-map@3.11.0: + resolution: {integrity: sha512-YK7y5ZYCfbNyyk1Dw+z8dC7xPGpvTXw3Ruv6YylfNuv9AMGUwhjaHfUU7I/QXI23YhIikGU7dmv32gwSygOvJQ==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-avatar@3.10.0: + resolution: {integrity: sha512-EpVzJ7GIOmABpLIbZWf0+QwN8w1qZOBzJ8N13CWoJWB+OpOMTJ7AVhyKa5H5RcrK6cGHmpxmPAMBPERucU611Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-avatar@3.11.0: + resolution: {integrity: sha512-vmfs5cd+ZJyMQohejrHv3XaCWiJkJfbbqjvaA/HXxM0zBKoJusQcrOqBddUELH8RAQ2nYuJaJISWmhkEIVeLsw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-badge@3.10.0: + resolution: {integrity: sha512-M8AuAQ4w6EfXlQCRv0lVC61XyC2YGqE4zmZJy8UQMmciRAjijXEEEI5zNL+hrc48EkOumCfPdDeQ8vqdLPr7Sw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-badge@3.11.0: + resolution: {integrity: sha512-H7WW6oqEqaJ79cWEtIXnCrznu5Ec0Y1IvpoK8zc59PDfPGTiPdFFN9I0wkXJHDbBVydBaWN+DIODRVPuXHkRug==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-baidu-map@3.10.0: + resolution: {integrity: sha512-hpo8PSHFSCwV4U4I/fLK0yAMI2Sqy/oQXNy5N0deZviAHYJ96BJS6763g+6YWPCf8i/Xil1fi8be2I41y9d73A==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-baidu-map@3.11.0: + resolution: {integrity: sha512-A3G3t6lCbnmrvZtN1p1h6uRqYWZzENwxC0LNBDAiwazYiS0QUdTcxXWZJqGQ4QderpDaFjeG4idfujsjOl18Hg==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-breadcrumb-item@3.10.0: + resolution: {integrity: sha512-evT/IaTvIbkmLXpRTa5moqBqYMOX9kxdw9p7tPdXk4EQ8Nu5UJMeMDMFNf7+CtUUKMdGbfaBUV5rLlalEIuJkg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-breadcrumb-item@3.11.0: + resolution: {integrity: sha512-1Y+BfrX6smtkqKNB32wVTKek7a/5Ksk6/9nexN0bCA1R4y4JJrmrXuUPkuK+dHjWiOuUayFciJo+WlbS4zC0dQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-breadcrumb@3.10.0: + resolution: {integrity: sha512-9mUGRKPumdLG+u1L0EKjxqkK0qv5aAH5NJn8iLX7JNljSqZAfsxgiQr73LWZv7sFrHdPdbEtEAxXayFgbIYlhw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-breadcrumb@3.11.0: + resolution: {integrity: sha512-vr36fg29CK6XsR8NZsy5qvgBu/7BleWT2ke15sQ/Anev3BPA0lTUKRFg5FeLsgz8V1NPd4HFolaqZ4dkQ3gcXg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-bulletin-board@3.10.0: + resolution: {integrity: sha512-HWF75xdLoPYz1fz27GkuCJlw7IpKM2nVLZtBV/H1FLqw+wDEHk2EKFlDfyVJAIZEKs08ytTwMlwWbsMYKLd8aQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tab-item': 3.10.0 + '@opentiny/vue-tabs': 3.10.0 + dev: false + + /@opentiny/vue-bulletin-board@3.11.0: + resolution: {integrity: sha512-8+1q1bx3T+7y9cD414BHIWskRC2CDyMmFYGqY3lLv3jp5YzpAnVETXlkG7Ks5hA9ZlqRbwH7AKzJRfm8OlZ80g==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tab-item': 3.11.0 + '@opentiny/vue-tabs': 3.11.0 + dev: false + + /@opentiny/vue-button-group@3.10.1: + resolution: {integrity: sha512-AghWLqwHYguwMhWtgMsaUrbS+kUd9/G15Oa7BCIOi0PYymRnh0JVsHpeC+tkWnvRkvfOn2WVDhwP7fdvlKKnqg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-button-group@3.11.0: + resolution: {integrity: sha512-4nFhRf3FhBZIcmeX71Svn28x025/vvWGFzegxuopEcwNZMUAReWAHqHHvd9i7TA0z7ZRYi1QZzh8aDgMKVgXmg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-button@3.10.0: + resolution: {integrity: sha512-shJb2GmLBx4uTo+FpYnbJ7SBmmZfPhBa/IT9F1oLrc44PwFfdPK7+wLQUDO4QEZxXa9mXXPq/ou/vD+aXa9kKg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-button@3.11.0: + resolution: {integrity: sha512-FVxlwD3bTcQHGHoeXwagxN7Ix5WcN6iJxSvMMbgRS+QImHkqAAU2wHXfu+1VdukHdKXPsbsIHpxOqZXLQMImXA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-calendar-bar@3.10.0: + resolution: {integrity: sha512-H6vpHWFPbNzw4nlJA2hoHPaOkAIcCHtsR9KTJuZwLs1Qno1xPDpiXDxK6Dg/MdnhQQytU0KfaXtkgX649M7n/w==} + dependencies: + '@opentiny/vue-cascader-select': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-calendar-bar@3.11.0: + resolution: {integrity: sha512-djueqDH4oEVhvEzFOcL3/bOR7opAlOQ7t+EjZalnH8ulkNg4YbiszyqeXXvQRwXqZJnSvcnwf7RO27fxoUjjUQ==} + dependencies: + '@opentiny/vue-cascader-select': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-calendar-view@3.11.0: + resolution: {integrity: sha512-OBwn6b6OR5GK2J21gDc6yxYlEymTNHKLvsEdQ+qPV9DpwTzEelzhzJsGjsnMghX9uQ28cwj2nFKtUCtaSmR9DA==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-date-picker': 3.11.1 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-slider-button': 3.11.0 + '@opentiny/vue-slider-button-group': 3.11.0 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-calendar@3.10.0: + resolution: {integrity: sha512-Y3affPa0w+ZImX6rjaBlOpOwoJbnF7G91G+dsPTPY5Fe5wlkq6WJica9jSzpzEhTxK75ZWDuWPQs3mWF5TBHUA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-calendar@3.11.0: + resolution: {integrity: sha512-C28s6VpR2+Jty5j42r3Z91jj6ZK9u1kYws9HY2Zi1J21PpKVdBUV8VjOM/Vq2hbNjQIGAfj61BnmSCcO6YjOYA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-card-group@3.10.0: + resolution: {integrity: sha512-APiR7LrQK6wtaNYDBS9EvbRvPv8sCLPmfU4+cCCq6OnvE56QADMEvSOouSukMmS+A6oHjgNcjPbnFhhEbcPJ1g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-card-group@3.11.0: + resolution: {integrity: sha512-xSUh3TepkzHkgezIaHEIDR4FOcHv+ZmSgn2f6yOVeM8DoKHjzOfl25NF469eH1NnwPWUaeyYxG0ucGUnGSydVQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-card-template@3.10.0: + resolution: {integrity: sha512-vpYvGuzUfk54BG0SenPEd+8c12vvWFXV1LCqeC6gN1YiM3yLS1heZaHdEEta7mA8zxbSo7VRQ6/yLq/+LgWBVA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-card-template@3.11.0: + resolution: {integrity: sha512-Oj30Sp6l+o/pajO8PzIH51LXF9qUQQgKMtUNyE7V5S8SIWdGkVyqpHKTpOeuO4+vAAHTS7C8oJqvTftMFRRtUQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-card@3.10.0: + resolution: {integrity: sha512-fHBJLelDMFd19TukcKVbx+dgXz9S8JiogGodC5R2iMb7TDqFa82BKJG+ypQaAhw/tcjbIxPxT8ustSymE2cB4A==} + dependencies: + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-radio': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-card@3.11.0: + resolution: {integrity: sha512-qpTIkPoyXEuoF0In9ycZSDm7Dnz3c5gwEDVn0xwF1WryDE/pzL8XR2eD2ob2r0/hm9wf5k4VMUX8IxqmG9gfow==} + dependencies: + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-radio': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-carousel-item@3.10.0: + resolution: {integrity: sha512-BBCzSu+jSiN9RVf+0z/kp4ptYpntQFMEEWzPGrZZFDbjCoJx+ZO+wV3wFrLBHwl89VH9+8w/5B1/8eoQZ5We1Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-carousel-item@3.11.0: + resolution: {integrity: sha512-m+sx90l7GSHgnP7/WetAvTgK0jNRYA/MgVmBQo9vRNnFz3DJneCZh4jBJ2I1PHgX1m90kluW6e/Jg1FzQpzZFw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-carousel@3.10.0: + resolution: {integrity: sha512-pAcKzy/e8aF9ObPE7LFxmmky4RvI6HAdtW3HyXPtDeuK7Pq3JRaMsk+7gQLbXrVUfUZttSOQDoMnIlU2cfWlXQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-carousel@3.11.0: + resolution: {integrity: sha512-NlJpnG0wX+Cdx+lK8wjS9x1i4FDTNaihnoUhejiA2+qtjNAhjSqHO8NohRDrtKWbeOJQaiSAKo0K21rRNAzPfA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-cascader-menu@3.10.0: + resolution: {integrity: sha512-HJhwqYSz2W5oe9twProaj4l4mNLJ69tFtIx65gPwXVR1euI75u/eiwBMHgvxFQh5iawFX2lq3RhZmfPhJ0O+tw==} + dependencies: + '@opentiny/vue-cascader-node': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-scrollbar': 3.10.0 + dev: false + + /@opentiny/vue-cascader-menu@3.11.0: + resolution: {integrity: sha512-hKxRry1AOz712OLVYNGMOgznUVj/j01PQwoKyPRQhg7GWNEyb1qEsvljbyL5B7M+1zBKkeEgM0Pw/IR7dLW7GA==} + dependencies: + '@opentiny/vue-cascader-node': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-scrollbar': 3.11.0 + dev: false + + /@opentiny/vue-cascader-mobile@3.10.0: + resolution: {integrity: sha512-H22++VvuX4esuCU2xYLCgbPnfPSO81AHeqpnL/9NPqDM0IYTsNHPs+nuP9qOmxB2V/q4Llrc+cjBoeazA74Qmw==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-exception': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-cascader-mobile@3.11.0: + resolution: {integrity: sha512-2hla2NAAs8gS9F+cNenwmoEWKeH4vlZDXtNpRRj+z1d+yd+80AgyQel4e4vJJBOYy9+GPaBcRXi9ut0qlpXGtg==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-exception': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-cascader-node@3.10.0: + resolution: {integrity: sha512-WVQ3BHMvkqCF7hyBqMFGsdFSmQudEgm2sw3HWzrpi3NEgoPhnrVJjSiic3m71kZVnTol61bkujHXQskDNuutLA==} + dependencies: + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-radio': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-cascader-node@3.11.0: + resolution: {integrity: sha512-n21J8WyWLb8l4kP+Dxi86Tak2QSFmIAPgq+XmpBhqmePFKRcmOfV3+cdoWYNst45nGR6tGzE9ZzHGoz65bK4Ng==} + dependencies: + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-radio': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-cascader-panel@3.10.0: + resolution: {integrity: sha512-W+msJdyJEDl/Pg4vYyzX/tDpSDZ3M4ScZhBCdviPqsLJ44BgENbwLUb3uFmUn6RvBKDqH0/VxFfrCBJUBFEiXQ==} + dependencies: + '@opentiny/vue-cascader-menu': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-cascader-panel@3.11.0: + resolution: {integrity: sha512-y3gHfUVCIzjDWC0h/eeu3pmEf4LglHbW3m7+nMvJRi4TbEHBA6em3fKSMmGEqzktrEcaJ9ygmJRmY2O5r0efVw==} + dependencies: + '@opentiny/vue-cascader-menu': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-cascader-select@3.10.0: + resolution: {integrity: sha512-sInAk+xB3gDRVmFJbmCUwVheT/MNNxusyZTnmrF4DO8h8dk6NjIpBdcl6GBQPpco4wT3/e29QDS2OCsafkw2NA==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-cascader-select@3.11.0: + resolution: {integrity: sha512-vUpkajOgc976Fhth6uXHV7LcU901WCmO4y9cbgCeg1ZfnqgsAGTdgVN42W5WoNkTkm31KSi8URKnCTRIVBvQGw==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-cascader@3.10.1: + resolution: {integrity: sha512-gpnYl9eUZsmfZ6DHhVXsFRI41nfYZrPxkWkjSK90aehyK/FbA+O5qh0RYTjjh2ywSeiGnsoCiFkQVWsNzRm7fg==} + dependencies: + '@opentiny/vue-cascader-panel': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-scrollbar': 3.10.0 + '@opentiny/vue-tag': 3.10.0 + dev: false + + /@opentiny/vue-cascader@3.11.0: + resolution: {integrity: sha512-WEi1sWUCydZala91Ix0qzbC6CVFIT4MPGIJ/Q2Hg86Es2q25k1eQ7WFMs7JVQE1an466KCCteoUfRO9FW/9z1A==} + dependencies: + '@opentiny/vue-cascader-panel': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-scrollbar': 3.11.0 + '@opentiny/vue-tag': 3.11.0 + dev: false + + /@opentiny/vue-cell@3.10.0: + resolution: {integrity: sha512-2wz8QDto9xslCCYvCDMay5NtuzHyO5LfQlMmq+vLCoSuzz4+PzXMFHPa0yjJUKpgOd4TU0Zu3vZKsrB1cyaJ7w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-cell@3.11.0: + resolution: {integrity: sha512-8iouf8y6xJjs9CfUHi8WkM0y2/6Yen/XwIMx40tlPX2jsNB56la0rls7kW2embGyz3K5W5vcpkYDQPj/VaW7Lw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-bar@3.10.0: + resolution: {integrity: sha512-DA1f1Yler35i0Vs+JPla5GhS2h3mXk9dPby0cTHL2IKfNlFKvave9pAZXigVy6ru4CAOv9+65Kh6EbBSAiThgA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-bar@3.11.0: + resolution: {integrity: sha512-NBPUuEKZ5/a0wlS7y108/K72YQWsV7CSAtlgHYL/yaIGtx+QHXDJCT21AyZogwouV6ypp2JLb1suinYYFvw7jg==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-boxplot@3.10.0: + resolution: {integrity: sha512-DJWWK40UKJup1rIZay8NL9yI+EP1gI4P5qOCgic4HV+zwxjrZZxiOD2GCSImV/4SAqLzHSyAba1iHVCBgHwOOQ==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-boxplot@3.11.0: + resolution: {integrity: sha512-+OqfNWCWHhQOey5KPS6aZgpzfL/VQZ902kx/Lu/H3TWtQCW3MjJkRnlrcFb+3ywnKB6XMuacNaKzuf+0D0Nkdg==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-candle@3.10.0: + resolution: {integrity: sha512-YC+2k2BNoiGOJLafJn1K461e+trwOv1X4j16ByXSX77n66mzqZwRq62FiqksfXIeHMtqKsHMMCEHmCTYTLQqZA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-candle@3.11.0: + resolution: {integrity: sha512-fufiiAaD/1X9tKS4NllIfsWdFI79bzjWz2L88JDcMyvLDAZQbcdLIBuTkMoaFTRCaxhz0AYjuzlGAZQevZYmog==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-core@3.10.0: + resolution: {integrity: sha512-VTz5ZC3T+xIlUZq59Uggt5FWsNa97YR0ZOc8M1uw/zQA1dNqpKmdRoQ1ey8DrIWE/5xOI4jU/06M1exG5eKKSA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + echarts: 5.4.1 + dev: false + + /@opentiny/vue-chart-core@3.11.0: + resolution: {integrity: sha512-yznX8iK1PK84OcpU6Ye2EhM0tcFqrd/pyLeATsXKIZHJ2394JIhWOeOWNyoVtt7iFYGEMu5PqO+eUhYnMLD1Xw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + echarts: 5.4.1 + dev: false + + /@opentiny/vue-chart-funnel@3.10.0: + resolution: {integrity: sha512-t6JOQ+n0iCFzfzgesQQj/2pHJ66T5eDrSqUutT39bNUZ6dYoR22xaoPgk9D9GTwEHuxNoAsBZOrMtAfDtmfqJA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-funnel@3.11.0: + resolution: {integrity: sha512-NRtbXeU3fNkbj/0/Ou6OMU3dXOILp22cm6FI71vO2b83ELBVyUkOOLbBJMi49q9EdhNTgGXxtdeHWTEMAzTFKQ==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-gauge@3.10.0: + resolution: {integrity: sha512-gZYaqq1SuuUPo28V4g28RF4mD/QRAsrWhg2jqxO4OWvHVJ3KLgB3hm9d8oIYCuTP5ifQ+SUK0XhmNUzb9nL3ig==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-gauge@3.11.0: + resolution: {integrity: sha512-qHo/+BCUD2VwcPT3WkS1+wkuGpCR+ACzdbim1OzdfFUVdtD2jMyaWNderRofWXvIYIRShxqmN5Sp5J0pGKxgZg==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-graph@3.10.0: + resolution: {integrity: sha512-8oCFBoXOmMs3SclIzWIkz0gbZzqDHtq94Rgi0AJeMUfERvXOXnyb+Oepbehrp6PTBbr/YswW1Iyva02way63pQ==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-graph@3.11.0: + resolution: {integrity: sha512-MkT5AIlx2yVGcyc9gOnBixv9ZZzWPC56WzRF6KLXvs5GsFS09F+BSLnAg954Z0qZ9w4lo76ObZCXBF5i2UL2TA==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-heatmap@3.10.0: + resolution: {integrity: sha512-5bZnBJzhdsSBAu2rWxpyxCpXmG1bHgo94+dVM+I4CgsVJRMBdWXkFiUfeWA50tqT8GrAl7h1fDPJW2tO/Gjowg==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-heatmap@3.11.0: + resolution: {integrity: sha512-6/iOoonR/zFGKFVSVYTKyx52w7YxgUP5WFHUHd38SF7acfbjGItLFvlLYMLxR1EsbnbsDiBQmmnqDlqWmb/Eeg==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-histogram@3.10.0: + resolution: {integrity: sha512-0wGpePzDL9S8TTPjag8ZJ4vGHvYCC40DV6axFqpWu09Kn6V1Iye/s6KfgBvyD1VBHREWE4REU3ChkKT4b9Rduw==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-histogram@3.11.0: + resolution: {integrity: sha512-kl8vcYzKKHCUkeaNIsR7zAbZ3OOkyjy/25QnX6h7x4vq6w0wYOGumA9cbS/dQsfnfLEttWcgqBZk5wbuG+ncBA==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-line@3.10.0: + resolution: {integrity: sha512-Axrj/pKLCyYATRM4Gf0vg7xE06efM5a4DlNlgTSPgiTzMEKXinxCgoBVQdX3bvhXMZAkDlHV5LsAI/A/K0Hi1w==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-line@3.11.0: + resolution: {integrity: sha512-K+35LR4PECOOzkXIH6gUPdbSCbWlRU/ekL/ZsbqGvP6LCDGz+6rEyWv8Nr7jhkM9X5vSoo4exUbgC5o7FYGIYw==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-liquidfill@3.10.0(echarts@5.5.0): + resolution: {integrity: sha512-GIpH8bqAA94eEwBPtku0DDHuZiiEia3W5TKVO0utn5DVT+y7and5fGhom/sWcMp0L3DJMM0Cdap9yHZeuTEddg==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + echarts-liquidfill: 3.0.0(echarts@5.5.0) + transitivePeerDependencies: + - echarts + dev: false + + /@opentiny/vue-chart-liquidfill@3.11.0(echarts@5.5.0): + resolution: {integrity: sha512-hH8aMpatdWwPU8HA64hgIis+3u2Gacfq73DjvM2cdb/ljoJIGjdkk7zJBNR4N4hQglrSRHYNeHwCmyYfnvA9Dw==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + echarts-liquidfill: 3.0.0(echarts@5.5.0) + transitivePeerDependencies: + - echarts + dev: false + + /@opentiny/vue-chart-map@3.10.0: + resolution: {integrity: sha512-xYcrluiNtx9jAP4quLcf0aydhN7pFuY86P9iROBOf8dWRCjNrV/ppa0lBOXEc4LkOrju9E9GukxqUz43wByOIA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-map@3.11.0: + resolution: {integrity: sha512-h8xzCqfcct5fX062o3dMqZoAumA6CbRvmcZK6lxHjVCa9BnlQ/RbDx0DtkSzZA5UY0nHKI/nnMlx81TSckVGhg==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-pie@3.10.0: + resolution: {integrity: sha512-d2WxwYmy4vNdmHJKozuIrxSL1w+RAgFfy4h9aRaj+AQyJAc5hjLRqbgJgngsFLd9TYDT9Kj1GfHJ+pKhoKD6+A==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-pie@3.11.0: + resolution: {integrity: sha512-uvPh1A173iPo2yqhJ9wlhLIpnnEDEDydwcj0tdTl2wS93xuAS63pl8kFjWE41dts023/J0b8sFkg4uaBm76K+A==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-radar@3.10.0: + resolution: {integrity: sha512-VP/2jJFrS3QclddZU3b4U7E72TTyxZHf7jHxFUc1VyDYq0GScbbtCApEtYCDNfkCMkvg3hftM+eMgazneiZYBg==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-radar@3.11.0: + resolution: {integrity: sha512-3eT+3GB4snQc+z3oHH0jWSFkzsT4WBNL6n3yNSYaxzrbUiNYxT+YNVPcYCtRaKdWEnJDEGWnVTCO2yvv7JKPJA==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-ring@3.10.0: + resolution: {integrity: sha512-qLgDkWOpd7RLx7JaCzbTxzqgJZLQ/V9d9zfcDXoVlkN7qf45e5hXkMygXmvB4+a5ARhlPZsqFsW9ASvJKKEoZg==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-ring@3.11.0: + resolution: {integrity: sha512-H4o7lEGPp/1Pe7okalSg3FqX1YjlTaz8lAN4e/uuK1BEaqkpISufiA7zMmCzUBO24cmzgM0rcAEp2LLm9bq4vA==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-sankey@3.10.0: + resolution: {integrity: sha512-sbFzpj2RUqs73XVLfeY/YRURm6xk99ef4idVX1AAA7esgm9U8OrR9i3JxzO9ZC93rea3D0fUki3J8CAbuTPq8g==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-sankey@3.11.0: + resolution: {integrity: sha512-b6Y38sPZ6NtoNTi9DfdwjkMBuOLW8KiidvZx+BVlqbsEVFtGwN1uHoZJLVjmX0ytENn6Mj7ekdrPdDlRPDM0fQ==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-scatter@3.10.0: + resolution: {integrity: sha512-feCHenAxRDBMG6X41rxpsX6GGGw0V6eEJYbiElJmZPZ1Feukl5V8WsadGFD8AFAlvcyKgtsHsRDym73ZvWjiZA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-scatter@3.11.0: + resolution: {integrity: sha512-7jOWt/zwtYynG+Grdct64oT78xDhJbGRzrZxv3GD4vPFh+5E59xndGHV5r06frRVRE4yWbNyhZpenGmnejx0zw==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-sunburst@3.10.0: + resolution: {integrity: sha512-k3yjVfxM4n1099WyBRzxqHt5G15cvw3bqemmZiibjBxsHBdwft5km33w1NXSwuhSByu/FuUGzfK9ZNUormh8IQ==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-sunburst@3.11.0: + resolution: {integrity: sha512-E3eJf5rImk9Z7yE5az6SeYZvRnTmqxpyLsWX0zILaTChfTLNA3u0FMDS2D7C4j3Lg6sngqiWTGGH6pmv3PbMiA==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-tree@3.10.0: + resolution: {integrity: sha512-vDss0jATe5Fna7uydzbMFPXgrFMuiLt6IxpQaO3Z8geAfwAqyRk0Eis0Me4CjXjeVGrrWux2AkKUT8tYmS6SMQ==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-tree@3.11.0: + resolution: {integrity: sha512-FMO7/m8Q4+V+rXNr6oRZhwUKJ60BEW1IvTlpxEbBKa/rwzQ+6rgmlJZZruvaZBEfibuD/H5O7VP18FBjR+KxXA==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-waterfall@3.10.0: + resolution: {integrity: sha512-nRM4ieYDlZNwtn+VwRL0f7Ls3yJIkK1Dd6BG+Cu7r5aGg1N+36sKL55X/uhQttEyeAFJEJNLsI/OOPMqgxlQEA==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-chart-waterfall@3.11.0: + resolution: {integrity: sha512-GFhsMT/ySN7VXbIejN+gETOZwPN+KpaLyQMBJyLTPkGh6pAP/r7rqn28HDW/cbAyxsNV7pLDNf48ICYsU8Os0w==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-chart-wordcloud@3.10.0(echarts@5.5.0): + resolution: {integrity: sha512-0LFv1WWZ3kGn4KQXsyqk2taQ90oHp/pNLW/eSE97lPPYoxAMNg+ohlOHkRxFBeAxzEghcHPxRMyksjXTIx9EjQ==} + dependencies: + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + echarts-wordcloud: 2.0.0(echarts@5.5.0) + transitivePeerDependencies: + - echarts + dev: false + + /@opentiny/vue-chart-wordcloud@3.11.0(echarts@5.5.0): + resolution: {integrity: sha512-AlXohRoGT9Ax3PrgYDmabagjd5yIqSasusbm1HL9nS3SSzvUOcxEoh4Z9CRNOKD0tAyBSjal5lMb4UsXR2xecQ==} + dependencies: + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + echarts-wordcloud: 2.0.0(echarts@5.5.0) + transitivePeerDependencies: + - echarts + dev: false + + /@opentiny/vue-chart@3.10.0: + resolution: {integrity: sha512-BTJbgF19bgXdFrjNOiJBNo5oSpXaeLfLrKUYZm2qzX/sNpCTA/Vu1a7TMCQja2hCWhFzV+THi+T74SmjyX0e8A==} + dependencies: + '@opentiny/vue-chart-bar': 3.10.0 + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-chart-funnel': 3.10.0 + '@opentiny/vue-chart-line': 3.10.0 + '@opentiny/vue-chart-pie': 3.10.0 + '@opentiny/vue-chart-radar': 3.10.0 + '@opentiny/vue-chart-waterfall': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + echarts: 5.4.1 + dev: false + + /@opentiny/vue-chart@3.11.0: + resolution: {integrity: sha512-B/Cvb+B9Ac+EnKGrSVgDKcpQqNnRgsxSDyje+KomStsd/2XQjFm6qFCykVrNE6lI1VtITRS0iZWhdRIAqgVBAw==} + dependencies: + '@opentiny/vue-chart-bar': 3.11.0 + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-chart-funnel': 3.11.0 + '@opentiny/vue-chart-line': 3.11.0 + '@opentiny/vue-chart-pie': 3.11.0 + '@opentiny/vue-chart-radar': 3.11.0 + '@opentiny/vue-chart-waterfall': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + echarts: 5.4.1 + dev: false + + /@opentiny/vue-checkbox-button@3.10.0: + resolution: {integrity: sha512-gIZdallnOjp2zvK/fDURdV4Rzb13LkWVGJIAKvwyaNwQw5EVC/lSAR4I2eX70k3FGUID3Nk9rOWQQbFFzUblGA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-checkbox-button@3.11.0: + resolution: {integrity: sha512-T26K91PXvV4gom3AvepuojX0PyBmZQoal9yfzDB5kgx0jG/YDpAjliFWbY4EJmoIxMf/ucPYZTWwPkG+uKx3eQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-checkbox-group@3.10.0: + resolution: {integrity: sha512-mW1eZwTtmWn7xfOXOt8d+p6q4uqUXZ/DdWDMI6Y8AlWC4o7eIFa7UEzqbnBjHcIRTCUDfliMuGYeJnHpWep06Q==} + dependencies: + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-checkbox-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-checkbox-group@3.11.0: + resolution: {integrity: sha512-lCnAdsUQjnU2cAJLMDL/aiprSzH9/Ythvi4rAPIUMsGtOx7Ma6fAnWfXo9zg/zb6rlaQoJRL2CGhdAHVBiOoNg==} + dependencies: + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-checkbox-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-checkbox@3.10.0: + resolution: {integrity: sha512-fbKUU+DlMDFlj2Ia/NpjcjNFDpIC0NaZrGBQVvT2cU0QnLdb0kNbuhw9ttQohygxfWTTspq9zv8yV9r/TvOatA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-checkbox@3.11.0: + resolution: {integrity: sha512-/3ukfbFjpBo078nxbeGfU0U0CtwL3oppGOjgkE6AiqmCD8JY3Tt8/hNIo3cOD7q8PMlIamDBUxeRx4oTlWikFw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-col@3.10.0: + resolution: {integrity: sha512-lB9m4ptL6DJ+JDg81s8JroZKu00WOyPNs2FME+KCy47mCRiyR9lr4pIDKYcUZnluaQ3S6BrY9ZRPIRysJZPqFA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-col@3.11.0: + resolution: {integrity: sha512-7gC1BPzjygeCnGzBthe6x9nvtynzyrynn9ATQnvDFAIejMQ2Vz6uNy9VLol1zITRvdOQf/Q505Gs95ayv3WkAA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-collapse-item@3.10.0: + resolution: {integrity: sha512-ZZjlQNqDk1UAooAp4ElXUblHOQgVjNMhixtRtFiavIL1ZDe/DUHABJroGrgicvrNuOsTN7AZENtn+omy0JdpdA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-collapse-item@3.11.0: + resolution: {integrity: sha512-rufRZXugNPErC4hlupL0LJN47kP60gH/5wxXLk1aCwP/o39Gqz1/QQzz7PzbkeOEEVbuG7NAN2VRraYs7tyhUg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-collapse-transition@3.10.0: + resolution: {integrity: sha512-VQSNALZ3rkfRA2g6SV8U5zkkR43p2jy8lf5MzIgc3DBJkpBa5k9gKwBblrkbYr9z2Xy/9NgXy/NvI4MidfJoAw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-collapse-transition@3.11.0: + resolution: {integrity: sha512-hVpU3Ba4Agi1b5GjR7dNF69awJBAAsUXJ7U4TVkaRDSO6KNNfuXaF3NKs6ZLmcQEeovhfJY8qY+RuB/dyBULmA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-collapse@3.10.0: + resolution: {integrity: sha512-rTWYwWNpfmeaFq35dd3rnHvdynhHoAR2udgIgNpPkE/Z7/Wdnno2LkFDqZWcKl2xKE8PtzamUe8oa9DLBBR/JA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-collapse@3.11.0: + resolution: {integrity: sha512-IIirmDHEFwoWkFHNru3OEXuG4KnSuh+5I4b7lMtEGJ/7AJPR/rnMAC8hHzXaxPm3/+01yyE+FTxcVasCAec8qg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-color-picker@3.11.1: + resolution: {integrity: sha512-cNmtiS5pPpRAbuRepreL2mSO/YJen00M+e/ATRcEfh0cjim7Ip6vBFnT08fq2twarLYGy8XWCBeTWjnbJWtgcg==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-color-select-panel': 3.11.1 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-color-select-panel@3.11.1: + resolution: {integrity: sha512-mQTxlK6L/GpLWYW/4JJO8psQlbJYxxOs621430nCWw/5hGnkhMNS+cOtW4dO7ejlHL8kqpCHIYSmBe7/eOJd+g==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-collapse': 3.11.0 + '@opentiny/vue-collapse-item': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + dev: false + + /@opentiny/vue-column-list-group@3.10.0: + resolution: {integrity: sha512-MbtzqhxRp+X1Hca8iodjKZq/rYnWiw6jtq1G1VTOWFnk2FTdjI87D0jLOxAiaGXNfX41vHVlXO9wHTcLhOXNWQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-column-list-group@3.11.0: + resolution: {integrity: sha512-oGQD/kh6vVGG+uxsjPEhyBaN9Zpz6oGHcpySdEYY34CPiMeeoDOjwl+8bqn8jQxoY0k9l5gl23cQJu7CkY5M5w==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-column-list-item@3.10.0: + resolution: {integrity: sha512-YFvle3ZQed/FwtjbCIXdrsgyrOLFV+cAY+rnU7iR5I0/hQC/Pdy1VZ5M3QAjMfrzHF9nbxCI6+HnT0dL4Ui6jg==} + dependencies: + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-column-list-item@3.11.0: + resolution: {integrity: sha512-2Iqxd42wQHmmmmABGYQFLXakGWNaWmYfV/LmA5rfg1ro9OZCLIXaE2nv3JnBnJRbDUL1O+npagX8C9bjVt4zMg==} + dependencies: + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-common@3.10.0: + resolution: {integrity: sha512-UdrIWO134P4I5ODaaOYx1qIYNw8iNkMiMxliadAGB3o2yvCYiIkz9w+6PPEGLNVr0BP0LyJrNxH+9o9LTDu/NQ==} + dependencies: + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + tailwind-merge: 1.14.0 + dev: false + + /@opentiny/vue-common@3.11.0: + resolution: {integrity: sha512-r5qK43X7XfRUBVUABo8IkTzdhEbYTBz6lQZg9qkG8FtvaUguelU/vqnljbKPw/GHcI+NKAabc2kbr98/n1TBbA==} + dependencies: + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + tailwind-merge: 1.14.0 + dev: false + + /@opentiny/vue-common@3.15.0: + resolution: {integrity: sha512-oEEW4CtSVgzDektAbTwLLsV1MrKMVBVeZomRCv+c+R1G489V6GYfjx25ZlYJ4SQSYeXuaZBdYNxUxM4Idq+dNA==} + dependencies: + '@opentiny/vue-locale': 3.15.0 + '@opentiny/vue-renderless': 3.15.0 + '@opentiny/vue-theme': 3.15.0 + '@opentiny/vue-theme-mobile': 3.15.0 + tailwind-merge: 1.14.0 + dev: false + + /@opentiny/vue-company@3.10.0: + resolution: {integrity: sha512-Zdn5cPAkaXK7HOlHyQ3wW8CNfHT77R8B2NXXpvr360ysGNnvNxTdkE4MJR9ENt0t3Z9QapSBHqn+nMvPxmAP3w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-company@3.11.0: + resolution: {integrity: sha512-vne5QywG4I8sI3FBBckmxMXMO2yMdiaEZtty0gNtsfroUcYAjoLz3qvPEUgwcM/5O36/Ec7zLiXNxaVnoyO6Dw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-config-provider@3.10.0: + resolution: {integrity: sha512-Vb+WG08U3anDwLoSnONLTFNfc85iZnWPcTQjnY/5VeoHRwvljQDS6c/q2rA88pfNPO4byzPpr9BU6McFnr1K9w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-config-provider@3.11.0: + resolution: {integrity: sha512-FZ8yFe0VEGVtD5xKWwXHK5jEFgr7pE0RVwYsznix9slrtMGZ6DAnRUKhz4Gpx7svmPZ6S3RdbPPCHwWclshGYQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-container@3.10.0: + resolution: {integrity: sha512-4dv0uymm0b4mP1sWEfBWXv0ugRNdJMs/o8//YtuLkDNu0CoE2KHoaKXu82c4aiFzmnTZFv/ayU8uC3dAqaZbnQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-container@3.11.0: + resolution: {integrity: sha512-Sz+HmtVm+lpweuv2e0OboMAXVpiej0udxlOrdcSxdscUqdkrP9uJSJcJc02qt4utuwb2rzVg4VW8E6+gOcFJDA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-country@3.10.0: + resolution: {integrity: sha512-XcabZKBxLlZ4/SaSWw51mtFTu98Nwu1E2iIaG1Fc+QlPxcsqbXyOmCRUkMh3hMyKlGdsgzib8PGHtGjMcUZmrQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-country@3.11.0: + resolution: {integrity: sha512-yDDP27zsBGFYfySFLlXlwKBPZ+ybC6e1O2TbUWm6MR9KJ2Gy6k5+Y/cIKp2CuhhvOsT71qe4XHq9kBVX5bjIpA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-credit-card-form@3.10.0: + resolution: {integrity: sha512-bjW6VXnL5FA9mqMkXcHZWr6uUgJZPH2WjrY68/Hr4UlmIdNtOWkJoY7v5bwIlRi0/0OBL7tUWX9NanvbTDTfIg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-credit-card': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-credit-card-form@3.11.0: + resolution: {integrity: sha512-HWQDP1QHevrTaosjdJ2iDvMD+xnkqpI8DdVZy7gljvvPRguNOIsiLiudxbJ6SsgxDnJQ1tec/nO28d2qcbQTYg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-credit-card': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-credit-card@3.10.0: + resolution: {integrity: sha512-GzxjJZ/e7MTmwBYpNqMb5GvaB4Ji+MdbqV9jFaCjJvT28SMuAby0N/MLKbuW91xVWof9byzJtSx+lNrmyCUQEg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-credit-card@3.11.0: + resolution: {integrity: sha512-XgQBzGiMe5r95u36pYrj2z2TEId2EMUj6QUwDZtO8Hin3b9ZRz/OrvgHV1Lhe4vI6gb3W8vIXYobRLXdlVsRKg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-crop@3.10.0: + resolution: {integrity: sha512-Kgj56xnXO3+bgZGCM3RW77EAHqt68wzf4z6mnQuQUI+7gDzKqmzFPgW8SB/64+eGNvRQGS93C9J8EX5eX24Y6g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + cropperjs: 1.5.7 + dev: false + + /@opentiny/vue-crop@3.11.0: + resolution: {integrity: sha512-K5EXuFwKxd2wCNA3YwNkgYrhlKjsVWiOzeJCJkYucF3TFBZBqJRy+gsFgEN/XQDjkwG8I/nXI4IcEh5wuiQjHg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + cropperjs: 1.5.7 + dev: false + + /@opentiny/vue-currency@3.10.0: + resolution: {integrity: sha512-alOgN6CAutEAmMtXgLcglOHinJrMP6ebWpQHviHJkIipKRNkV1W4jtyfg9JZnkHQ0lwrKJ3KLw2ZQ1pWa/Awbg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-currency@3.11.0: + resolution: {integrity: sha512-Z8EtwqvvOK1TcuyQsOTeeWlrs6dFptzUUuuRoNtsApBFCEwtJt/cC6DJuVqrwJgU8GvvOYwjNfKzhdwUO12GKQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-date-panel@3.10.0: + resolution: {integrity: sha512-G2J7dxDHtiV/ohXLLjMaySj/l271Ty8wMEdCFl/9Uj3YHN+X3QPgs+xjy9r1Nduwl9os5bnTfJII+Ow8J9wCSg==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-date-table': 3.10.0 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-month-table': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-time': 3.10.0 + '@opentiny/vue-year-table': 3.10.0 + dev: false + + /@opentiny/vue-date-panel@3.11.0: + resolution: {integrity: sha512-4IujjHYFuLS4Jsm0SkBVS6odQ7kRWuRs6CbzZBglbUI2Qu8nRa00YY6Kn/ER1hhCjqypHDWOce4XKhg9c1XovQ==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-date-table': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-month-table': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-time': 3.11.0 + '@opentiny/vue-year-table': 3.11.0 + dev: false + + /@opentiny/vue-date-picker-mobile-first@3.10.0: + resolution: {integrity: sha512-ZHfexyQgSeW45JJPVcRAJMcJCWQQrHLzrZnFVs0vfzzcqjriBcLMFYLoLtT0hnwmKu3v5MI3ZhFTAPE7G64gQg==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-time-picker-mobile': 3.10.0 + dev: false + + /@opentiny/vue-date-picker-mobile-first@3.11.0: + resolution: {integrity: sha512-cITuLFJ4xGV7myijXLCpdeSaCYUC3x9zqTvlXEiKN61IxXQnpktHy/3yB4RUOSv09iHPmcFQe4DarRnrJdn44A==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-time-picker-mobile': 3.11.0 + dev: false + + /@opentiny/vue-date-picker@3.10.0: + resolution: {integrity: sha512-i9y3gI8YVtNsxZcnx+SuOdzfSz8CLfVFTkPeq/TuJngeZZ9w9/6YozgBgRskTc7iK7SRo9pYIcFfyS8W1mANDg==} + dependencies: + '@opentiny/vue-picker': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-date-picker@3.11.1: + resolution: {integrity: sha512-cOuJf3RNSz1qvoPlxoFpZmtGCLRYqKjPIkGM79LZMu/h6dWrpajhjKf2UDG1roXyTXh7ESeoGHXxEBDtHiNQjg==} + dependencies: + '@opentiny/vue-picker': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-date-range@3.10.0: + resolution: {integrity: sha512-g9MMAGVQK1G61iYPBZ9s6LqMHvCjVd9XALOQiOdKPNUgudS4+6dUV9+rUyUGrTwofirFqaNqSas/GvfoSaIFLA==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-date-table': 3.10.0 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-time': 3.10.0 + dev: false + + /@opentiny/vue-date-range@3.11.0: + resolution: {integrity: sha512-1jh7iqcuytd8ktJtkKKVbOZkTbZVEke1WctHcfruhse2qqd22hG/RopOejEar7hn+gzCFIRyD6fAmNLddHSd6A==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-date-table': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-time': 3.11.0 + dev: false + + /@opentiny/vue-date-table@3.10.0: + resolution: {integrity: sha512-+/u5elCSI2Kjs0R1MITeJJbrxvoQei8E1TjbNfcWwgBMnXob6LrODi/zE0zQ3LdFf3ovLR5IqWaQ4LCiks4ERA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-date-table@3.11.0: + resolution: {integrity: sha512-/jdgrsgfaHHpcRjpkOSigBKka8iKOOzxtiMHjmGAy8UpDovxD//MyNlt6zUqEeJHiitfqB+oP6nIrucxByvuVw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-dept@3.10.0: + resolution: {integrity: sha512-S3H18nGmi5vWIYGIDIM05+WWmqNTGdAeP431r15taHDvBJmvPnLGtGJzw05afxJqz2m3fc/DZHb5HuV5y232MA==} + dependencies: + '@opentiny/vue-col': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-row': 3.10.0 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-dept@3.11.0: + resolution: {integrity: sha512-23+d3D322lZoIrQNwhvuZE3lI+zEfYJBUAYK2aigL7BhO60btPSUHIeDgPSNWRWWgsEKQZXztaLIQbs8SbBYNQ==} + dependencies: + '@opentiny/vue-col': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-row': 3.11.0 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-design-smb@3.11.0: + resolution: {integrity: sha512-tGx/VFe2mQzdfzLAYfCtIZB5OJsfz53ep/Qpq43LAzTZmTEIXuKYAsXMlLs0Yd5kqwj14/xU4SDQdmRR3dVLKg==} + dependencies: + '@opentiny/vue-icon': 3.11.0 + dev: false + + /@opentiny/vue-detail-page@3.10.0: + resolution: {integrity: sha512-5nIAwlyxe0qYD12Vr6R8prHlYFpV7CD6WM7iYtdGB4O3Kpw8hzXUN4NSuUf8LL5FjLAjr2S1H5OxmLmEloy/tQ==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-detail-page@3.11.0: + resolution: {integrity: sha512-iSGcFypfkKDMIFGJH9NKKyiNHfV11LjAFXIfbjo5RqSNfMEnfHu13cdjO3wcVfd5yyAkxSHtn3JsuG+861/COw==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-dialog-box@3.10.0: + resolution: {integrity: sha512-W7wbgF3QOua4Ki3YcYnbWTrIkfeyrvif0mnU9Fw6QAtD+ISW6Qaf08CI/T3ZkH3ZgMWH69qCG5UuNE57WIR8jg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-dialog-box@3.11.0: + resolution: {integrity: sha512-42Goimq2O3DY1toGegkcyZvBVe+Lut3iZZVNxTt0pAqpebDh1KyKXNhMGNnu9hcvPnnf4hna2UwVsgd7gsqilA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-dialog-select@3.10.0: + resolution: {integrity: sha512-ASPD25+/6plBYtszWmAdsAt2DNHe+9lUbUsMOY2dtsA5CKcioUnsJeUoXAvtplnkHHyk9JrVYfUH5XlPloVNTg==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dialog-box': 3.10.0 + '@opentiny/vue-grid': 3.10.4 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-pager': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-selected-box': 3.10.0 + '@opentiny/vue-split': 3.10.0 + '@opentiny/vue-tree': 3.10.0 + dev: false + + /@opentiny/vue-dialog-select@3.11.0: + resolution: {integrity: sha512-tq5FcMI7TQXGejjGuFuxpjA8GKcnc5pdM3oMZn52BPdXuKqkb/jvofq0d3OqceeOp2O8SC3GYY32FDG7q3Y5cQ==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dialog-box': 3.11.0 + '@opentiny/vue-grid': 3.11.2 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-pager': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-selected-box': 3.11.0 + '@opentiny/vue-split': 3.11.0 + '@opentiny/vue-tree': 3.11.1 + dev: false + + /@opentiny/vue-divider@3.11.0: + resolution: {integrity: sha512-LLNFr+5oRL7n8uWdgqvSp+XJaMKX4HP5HeiaEA2Lte5RqTGGHTn7DVhiW9dSLMs/QyCvG+vhcUrY3fqFiiB5RQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-drawer@3.10.0: + resolution: {integrity: sha512-xSwBLXjfju4/Sxn8opNV8cdjkWp/mEXd3jo7lGCiWUgrtYNXTxCehbD6zJzDwsWu57OuhMWyEe47ZZuMjx85Kw==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-drawer@3.11.0: + resolution: {integrity: sha512-N7gpIQAWU+wJzjFmBlalkFXgMj9qsjrMXsn5BqnHDQmTRrIFy67GCKRAD+GtL0tJqZNYheDTp0f1HlX5We8YpA==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-drop-roles@3.10.0: + resolution: {integrity: sha512-dtQvbTFM7Q4G0Hn+603Mp4kL1RsxCsIAsdrAPN2thBQsPS87QK+463PPblvb7xdedsexDmdSZ9Re202p+PMGgg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-drop-roles@3.11.0: + resolution: {integrity: sha512-8QzYNoq2TBpJ/sOHZYcEKjjKZM/X8E/XCg2FIP9xO5zTysfte4Xlswns3Asm3baek1ZwxqCQmbyQq1vyPJrfsw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-drop-times@3.10.0: + resolution: {integrity: sha512-EYf0gefHNlVVie7zldJXYU48ZmdojTN5NZQQEjSJfwc0TVWvBJq6MR8JOcqXqBsjsbIz1NrAmeqKgFN/8gKpVw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-drop-times@3.11.0: + resolution: {integrity: sha512-ah/LER6vxpe+zTP+pFrFwUt88WFeY2101gJHpBSvLeI06FjUOSFoHU6oaM/6/IrQmWhmvZySfMzvaOG0hKuLwA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-dropdown-item@3.10.0: + resolution: {integrity: sha512-DtpjLz0tEEuwS5kwpSZLmmNlotYsATiCwH6oyHCCuMu9KQslSNSQrL7Q2FU8Za3yXNmnRuNaVVEfI3BN+W+bPQ==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popup': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-dropdown-item@3.11.1: + resolution: {integrity: sha512-wGBhH0ao/CyEdV+tI+j+242Hj5dbl5uNItEVXQs62fY/rrUS8M0AEKmn7be0F6ITDTbFjOwWIgoheMF8dcvKsg==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popup': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-dropdown-menu@3.10.0: + resolution: {integrity: sha512-+XOmYaWKjokJ06KF8aFU+vKDuEeAtA+xwhsAmUfth/GPcZw1rWxcW8zS301bfoYBjocCElEC/rKvSNvM1mOKeA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-dropdown-menu@3.11.0: + resolution: {integrity: sha512-9NexlJgHAQ9fWgvwTZQjWpIP8kLgN23cM3m0MwIjIDT8LdYQ5QBCmcxLPCJzPtjvAqOXWuTxNt6EbDzffbvcqA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-dropdown@3.10.1: + resolution: {integrity: sha512-1+XN45r44Jmvaf7yK11cB17LBJovEI+kI/sj6t9jE8BWOBzoPhV0m+zWfk4Sx9PI9QaWxf04MZTmPxdOwOa0Tg==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-button-group': 3.10.1 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + dev: false + + /@opentiny/vue-dropdown@3.11.1: + resolution: {integrity: sha512-8kf/8841WrhPRDsVF+Anz5dcCr/FLqxG7QnP8cv54Vdkl2/fBx7+OG5AAK1t2Lcey+RGpcfYuXPaBnnum9E5Hg==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-button-group': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + dev: false + + /@opentiny/vue-dynamic-scroller-item@3.10.0: + resolution: {integrity: sha512-pFcuFjXlmXCI7y2DZ6u92bPXoC/q72PTpm1B+bO4P0+1olJK51yTqp4CnMhP6tqKzpLeWtBwGJGIf3VZPa8YvQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-dynamic-scroller-item@3.11.0: + resolution: {integrity: sha512-klIm2qsTej3PzwB1EB1rdYaUze1/cYGwXOofuoDnn5AWDKdlsanrPxALbnTd1UllbE71EskwQVkME8jVstjEvQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-dynamic-scroller@3.10.0: + resolution: {integrity: sha512-BqPo9nbVIDo9KWVX/Dd2WbGTSmXc0VUUHsj7vS8067sYZSRkMktGCwlM9LCuxOqnSBOtqKacRfRTZFpHIewiPQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-recycle-scroller': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-dynamic-scroller@3.11.0: + resolution: {integrity: sha512-XyHSVwdYF7hCwI16OGsBK5mIP4+PIvk41+8p34sbor5vYp+nS/lDpSru90WBfPw5D8ln7uCfAILvMq2p6aTvyg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-recycle-scroller': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-espace@3.10.0: + resolution: {integrity: sha512-my+LLx4JV+OpJlQld7pikj5V8tkSINeYBOzBhvYT2JNgAt8w5TKUVvzQueviU7hRnsjOYhVPI5npaygQayyxAQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-espace@3.11.0: + resolution: {integrity: sha512-2yQy9WwSzY8pgKv/bbzrwfho29b+hncm3GVYqX9kdMO7wrq2lf835UtfCj42eyE5JDoqoM6KOGJ4WNs1IuMt8w==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-exception@3.10.0: + resolution: {integrity: sha512-KmOoslM5bm5wCu2L+4fuGV7YtDnzRYM4vsiq34svwVFziKNVQY0bry94Zib3dX5j0Vg43Qu1XDZj59S0fzARGQ==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-exception@3.11.0: + resolution: {integrity: sha512-12+hXCYDYTw50riRKAVNrCGtVweI+3DdSnL3e6BCSt0uCfBMMCQloolmt2vmfG/oZvQO2ShzfYNngV9G0GQM8Q==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-fall-menu@3.10.0: + resolution: {integrity: sha512-hd8LWbva28/GP/PVf9LwKis0KssnFtot+2QAcAqU1aT6hUIXEbXixWNdrLT4n1L4v2QGNS1qPPRGKsv/Zfmk5w==} + dependencies: + '@opentiny/vue-col': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-row': 3.10.0 + dev: false + + /@opentiny/vue-fall-menu@3.11.0: + resolution: {integrity: sha512-SfGOM8TJ5seDw0yCb0FlXJOzMo0qyzjQtt1JXte799liLf3i3D5TIkWH3kHxuEPEOeOQeCXEX6Kmr/4k16wwYQ==} + dependencies: + '@opentiny/vue-col': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-row': 3.11.0 + dev: false + + /@opentiny/vue-file-upload@3.10.0: + resolution: {integrity: sha512-Giuvf7kuRg3EadoB9MoRFDYqNVvNH9zRYxA8phivvrgxP87LBSQffrCX7RKM1PdYAo3ajZ4jw62SLr0THCmW3A==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dialog-box': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-progress': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + '@opentiny/vue-upload': 3.10.0 + '@opentiny/vue-upload-list': 3.10.0 + crypto-js: 4.1.1 + streamsaver: 2.0.6 + dev: false + + /@opentiny/vue-file-upload@3.11.1: + resolution: {integrity: sha512-aJ/RPaLXnFcwWsiEk78eSn8OPSePtNjc+RWeNwpsOcIls2VdGXC819Ipdmrm33fv6Nrl+u89/0Ct0LM6Vd+WnQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dialog-box': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-progress': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + '@opentiny/vue-upload': 3.11.0 + '@opentiny/vue-upload-list': 3.11.0 + crypto-js: 4.2.0 + streamsaver: 2.0.6 + dev: false + + /@opentiny/vue-filter-bar@3.10.0: + resolution: {integrity: sha512-YKV9DVtcPY9D4Os3fb4skMbJliV5YhoKP455UrStt9rf6m6n0K8qIhfPsr5BXsbKrsw3SgJwvTKTYsypTPXPoA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-filter-bar@3.11.0: + resolution: {integrity: sha512-37I6pY9wflMDhqnX2FGGAvh/wVZ1KTr417TDCQd2NjzSS5KWgV1H2WF7Qwdqpdh4N6+V/+PMjGZ0QBz8sYojFQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-filter-box@3.10.0: + resolution: {integrity: sha512-dgfx00y/NqvHgm14lt+ZvPU7EcARcBZvHmbzMjJXOnRYvhHEPfpCORqb56EDUMNAaWZcjBCeRtsN+Q+oZ6XhBw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-filter-box@3.11.0: + resolution: {integrity: sha512-Q/PKFqjmtGfelZ0k+HhcokcA40DkoLMaCthl7L1st3VVZU6kBS7997HiSwNmiB885XXNni6Mheh0SneOU3BziQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-filter-panel@3.10.0: + resolution: {integrity: sha512-K5jk3FZ1o6nzYlcJNQegWSDPxpxgy9Mdiqwts1Dsk5wh467J17hk5J3gfzCTwXRkhwo8NjIwLiS6owlvWs8/KA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-filter-box': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-filter-panel@3.11.0: + resolution: {integrity: sha512-bxFVa551RVO1/jryqSz6lpvaxop9THT1urToFz99z58Y6VRqNMk9/4atluSMSeuUA1ZPehYij7ZB9ziKCjjn5A==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-filter-box': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-filter@3.10.0: + resolution: {integrity: sha512-Y3gksRcG4OPf8FPDpGehNLUDLU3hOsy2+xgMHQ6+hDAX7pvsBRFwU47NvpPJKRgRmLvDk5GtSy/g1v5s3a6sYg==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-filter-bar': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-filter@3.11.0: + resolution: {integrity: sha512-QnRGIhyVZF2n/kfXpeZgaf9ZkVY034O94AN35gls8vW7GvFw8qy1cqBVlIhlcaUngV83NsyYpiJeC6WFom6o0A==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-filter-bar': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-floatbar@3.10.0: + resolution: {integrity: sha512-++DCvSWaKRsSqH5dnHuUzYtBc468Pf5kwQVPXLn+tLo06Ybv6baUW777ouV3HVzNhJOSFgbQSXermySzCfFNNQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-floatbar@3.11.0: + resolution: {integrity: sha512-icQSXbO/wfZdlIgUmhx9A+mb4jPLTa+PDrgpWV5JooxeMoXNE6M92EXl2GoTMUBHorBw9tnPOWEYWxFaMtoS3g==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-floating-button@3.10.0: + resolution: {integrity: sha512-mNO9cN0elZeQTOs80vZA7bOB2oL1gB5cz/FyYpADSL4GtTK21gJ5EJRsDxbxxSX7lHrRV0346EUoaZczmuEkAw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-floating-button@3.11.0: + resolution: {integrity: sha512-LkqasSi2G5N1clHzzXXBhNDzNDgHuprjeUiZyYIef37Hlr7TWM0MFb/wKyX+ZKT7+XPme5y0hvzaqtXoUqWTSA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-flowchart@3.10.0: + resolution: {integrity: sha512-5Q8Ir5/Ozs46UlfY5Stb5RzEQOgFjC/2IjN9cAK7FCilQtkUblsJrNrHuTQa0ljMEc3onkvsJkDvo+pIOB/bRw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-flowchart@3.11.0: + resolution: {integrity: sha512-EAA0Q3zvoHmrOdtGFd681na6WWXQOaU6LSovR4wBv/NpXP83Ds/ez1g8WsZH0Ugr4dZmLSPP0FdEQxiWMFIHsA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-form-item@3.10.0: + resolution: {integrity: sha512-kvuhr9rkqHn8AxKm6WhwDpOsaABz0nDzPcVH3X6XpiSNP7a0dJKUK3lemuYHbayqGKniUi7dn+AdjqxCPVPLzQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-form-item@3.11.0: + resolution: {integrity: sha512-olFXSwT/Wf8KHTeaSC4JvEV28Y1WTm5xeD10t3aRlMkXlKt/Aulu3Gxun4PwQlCNFLZPqGNm/c3mnIXYOSh4iA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-form@3.10.0: + resolution: {integrity: sha512-tAlV0OWx04f+AYa0W8WaQc+nrtQjMXBHsKWgHaPMLN93SPEoK77sUdDNXjSnJr/ZbqmD4Pa0sZcV1xjyxPQYaQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-form@3.11.1: + resolution: {integrity: sha512-gYffHFK+fJjjoodZhvhQdkEUhZsoQ5dsAPeoN526/c5jgyad6quJIh8bHopnWKCFo5hwLGimwdSdD4FdGZcGxg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-fullscreen@3.10.0: + resolution: {integrity: sha512-2+a6FVz9R05aK/pTdO+g+muPPTn+Ny/Cs1g4vdzB+XGj2/u/dKu3QzgqtQ6fhDkmJqWvSEguFpWs+BIP9bQqTw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-fullscreen@3.11.0: + resolution: {integrity: sha512-7d9QXfMZg6wSbQBToDhZ+vaJUBKFmZ8MfSZ78vo9tt+UWaX8SiG8VgNHX5Pfc7jbaQDMJkX43ZAJi8N6Ybs9tQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-grid-column@3.10.0: + resolution: {integrity: sha512-B16DcrjCMvp6EboEBUf4r3gbsgp1y10Kd26pdMN71g68QDjBiSdxcHC33IOvh7iH+2RYs4Kkz4gNlW716gs3qg==} + dependencies: + '@opentiny/vue-grid': 3.10.4 + dev: false + + /@opentiny/vue-grid-column@3.11.0: + resolution: {integrity: sha512-cdDSA0JkDqc7Rg1aCrCUaWDFlDobckPY0pV75uLVCQFToC0L+OMrGkJdSO5EVsiDZpD2hCcCh0InOaAkTAv+4A==} + dependencies: + '@opentiny/vue-grid': 3.11.2 + dev: false + + /@opentiny/vue-grid-manager@3.10.0: + resolution: {integrity: sha512-uTf8WVk6Xmr7Smc512hu1c6cx0ljrMZrs2hddluX6RbO/3WM2Hafg34OzLrZ/ov4e7vrJRpTOknfK5e/nwAchg==} + dependencies: + '@opentiny/vue-grid': 3.10.4 + dev: false + + /@opentiny/vue-grid-manager@3.11.0: + resolution: {integrity: sha512-G3NRz2SyeWZC0j2RCbQdwZF4kaFEc8kV3TO+Rsi03k8+lZPGvIKtqKzR3M+fUD3x00pZB9JzBOyzgLXAFoHe6g==} + dependencies: + '@opentiny/vue-grid': 3.11.2 + dev: false + + /@opentiny/vue-grid-toolbar@3.10.0: + resolution: {integrity: sha512-OsKyyYVDYyKC1VPOXPjlDXemmw7P8H8JY3lmmep9tnyhk3hLq7aTuQZluVV5ncecODUgvmX0rUAZLeY7zLVQYQ==} + dependencies: + '@opentiny/vue-alert': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-col': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dialog-box': 3.10.0 + '@opentiny/vue-grid': 3.10.4 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-layout': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-row': 3.10.0 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-grid-toolbar@3.11.0: + resolution: {integrity: sha512-Dxwf/xVkZxrayLyFWIPIxd4VYAfltrTTIFbLidRRCHu3nVc9LFpNn8eK9OrWTFOF1R8yZnP8zd5J4//nrJ5nWw==} + dependencies: + '@opentiny/vue-alert': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-col': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dialog-box': 3.11.0 + '@opentiny/vue-grid': 3.11.2 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-layout': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-row': 3.11.0 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-grid@3.10.4: + resolution: {integrity: sha512-d7zyY6QYIz9AtL9JM85DzTf4FciQ5ORejgUNeMQJVtlf2KMy3g2FAkN/FjtsAJCMP4y0iCFAliWuRATUvwoPtA==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-exception': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-pager': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tag': 3.10.0 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-grid@3.11.2: + resolution: {integrity: sha512-HUV2YzFs8mTccrBmOXOfBhrluAjzEatDRjUso1tmITC42Q7zNxtyB63Ea8Hep/WtuxQg/L8950FTk3y7x/m+8A==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-exception': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-pager': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tag': 3.11.0 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-guide@3.10.0(@floating-ui/dom@1.6.3): + resolution: {integrity: sha512-w0VxiN25pUYEk6tIRKe7kByMXvj52+Ew9Z1icO7b2S8xHcjl3N3FMVkqKC0u8i6nCZrhW9LJiDHwR30FForDtQ==} + peerDependencies: + '@floating-ui/dom': ^1.0.10 + dependencies: + '@floating-ui/dom': 1.6.3 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + shepherd.js: 11.0.1 + dev: false + + /@opentiny/vue-guide@3.11.0(@floating-ui/dom@1.6.3): + resolution: {integrity: sha512-udIZxNhrh6215ADnRQJyvHqCT6qT1ae63uSdktq88axXckGFumePXVf2rj1rU/SvPQ/WiEX69cbuhtw5+jhyuw==} + peerDependencies: + '@floating-ui/dom': ^1.0.10 + dependencies: + '@floating-ui/dom': 1.6.3 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + shepherd.js: 11.0.1 + dev: false + + /@opentiny/vue-hrapprover@3.10.0: + resolution: {integrity: sha512-2NafmyzvYrgthbUsETRa9SYmnc292mGhlk8PmBIPFXuhsipKk/aPCbI7ypgbZjkh+hliiW0kimAt8Biqbo7WNg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dept': 3.10.0 + '@opentiny/vue-loading': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-radio': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-hrapprover@3.11.0: + resolution: {integrity: sha512-b1S7V6lZEvvCNL705gwEczJHiSYkMKFkgua5lxjmCjlOPKpNy7YzeR2R/94xDHHd7aznHeym5phA1p+3kgh+Ng==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dept': 3.11.0 + '@opentiny/vue-loading': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-radio': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-icon@3.10.1: + resolution: {integrity: sha512-8pgX81npG3Bhew9Rsh2iuqTtn92oDTfi6W5Fjf/BdxuctrslFEFmyEOcNeV6Nz4dnQUJwCGGUgV8AaAhBbWIzQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-theme': 3.10.4 + dev: false + + /@opentiny/vue-icon@3.11.0: + resolution: {integrity: sha512-hv6kOZ8xxcPd2tSL3TsYA1R2ZKYwcjsUNVgcsoyNLcyfW4OfPYbUNetOJ+r3rBp88YhB+NPGC7RaSHCHTpF/3g==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-theme': 3.11.6 + dev: false + + /@opentiny/vue-icon@3.15.0: + resolution: {integrity: sha512-g7EJLgAP82/yD8qnGyXNYBRmrzT4j16OW5grqZq3kwFP8xVzsGvSjco8BJM/n4OTp7uKzfFJZZg1VSGhh6qSDQ==} + dependencies: + '@opentiny/vue-common': 3.15.0 + '@opentiny/vue-theme': 3.15.0 + dev: false + + /@opentiny/vue-image-viewer@3.10.0: + resolution: {integrity: sha512-+pFkdGj2BOBJpblMNAR7DDbuhdnfPZkvVGY3KwUZyXhFb5mXg5LtZWFgOrWrmL6+45/GugABM6ZrNL4FMH+l3w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-image-viewer@3.11.1: + resolution: {integrity: sha512-dtVj9IArafF8pHueFEQfY2z+BK+QIud5ajam0mH3h+Y2XJZcxHVOCxKOuB9nAegUq2MZXEt/A8dNBZnf6IipLw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-image@3.10.0: + resolution: {integrity: sha512-N9yL5NKPiI5H3DRs0pbzR2bH4t9pH1aUqlN/2eF00CAggHWHM9ou9SYdQhul1jRAaIrKlg2SyZKpcmAro7yjGQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-image-viewer': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-image@3.11.1: + resolution: {integrity: sha512-TyNSQfdX23hXKVjE88e30D6rrt2DRM2exwdzL/6hTe5zng5qvK3NeCwweS/j678kfrF8oqxNW2ArO82DydCqIQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-image-viewer': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-index-bar-anchor@3.10.0: + resolution: {integrity: sha512-pyaixhd8R3B+mWxo2a4BUYoA0JPIOe5/DUXD9bye8k9lwe1MsnZxtAY5BK0dlD7I9ToXrvkm800eiCxLMNI3Og==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-index-bar-anchor@3.11.0: + resolution: {integrity: sha512-iLUMVZvnFhpMdf56Me5SL6+RZyA7tZWtU5a4PsYmoXJrH+MVrnyjx6veqzH6b5hrTRjUScJnsecginP5qQ24KA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-index-bar@3.10.0: + resolution: {integrity: sha512-2Bs5cd40edr8skLLkbWxJ8tvUElvWis7UnXyS9DTY8dEgyYoIxkVxnXtLl7zEUqKYqMShUZGZXxbWueXIFXACA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-index-bar@3.11.0: + resolution: {integrity: sha512-GiK4snXrWI4YIWO3pin/H24NWoW2N6PAhfWq9dIVGXQfGwV6VOZeyl6QRrLupTPhMpQf89WfOXP2KmOLtHm6LQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-input@3.10.2: + resolution: {integrity: sha512-oBKrgRRj00SLoCyMGFEUgzn4FLDwd2gtsnEHsLSVrJWGQ3VL1WlBnw/6T47TCxjBGKkiDrdpWHy2AclDoLTkdw==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-input@3.11.0: + resolution: {integrity: sha512-6/aZzZSoomxE1MbP0EiGyukhdMeXeI6ZNQgWE5TnLsyf/urzKJfjW48YQJFEYYoyyzd7F34U9/53FSC6VfMOaA==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-ip-address@3.10.0: + resolution: {integrity: sha512-4N1t3p37MZRGFWkSlOi1WUwtCbpFILsyhOrpevfTXIlswcDFtWU9nJk9JcJUfZKh0xVvR27XCYwyKcVIstG6sw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-ip-address@3.11.0: + resolution: {integrity: sha512-/sogMm7HC7vOmFgvlVJLcvbMIW/vyWvGK6f47ts5/eBTwYDW0qg7T4zfdtlaF+ukcCLrm3JGrIQpP/H6FWnPUg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-layout@3.10.0: + resolution: {integrity: sha512-Rrb0/D6ccjlagqib9MT69V2QoT7nIwKXRsGV0JplYfeTHk6fFcJ5JlVakEix6HFLjWEKBjhMJXurFGhfBjNowA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-layout@3.11.0: + resolution: {integrity: sha512-W9Qb6z0mU5U9SFegfJWUB5uT6v3YO6E0hRUo+aURp6c4lCnkrg1CsXF8UdS6aCiEef9qrM5+ZKQqetvafa6sHw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-link-menu@3.10.0: + resolution: {integrity: sha512-nMpyQro1uyAJwAr8Dk76jvzsE+yp1RcScbPdtI7FwnKAuZy6PyqanDpWwJ9Rp+VbwxVtfwHjEakXnWSH3dPJqw==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dialog-box': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tree': 3.10.0 + dev: false + + /@opentiny/vue-link-menu@3.11.0: + resolution: {integrity: sha512-3viArfV93iyRnrXns1baHWcXQMv1F7xqqaBFHsTiEEtbffkbVDJmCEeNLhaIppl13vJ+fEyS8OldLbofrlz33Q==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dialog-box': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tree': 3.11.1 + dev: false + + /@opentiny/vue-link@3.10.0: + resolution: {integrity: sha512-wYyzMCdBYTeZah/SOjBDhyT5smqB1R4SjFWXYHDErJEFNUZBk5+MpjEzcD9/DRehMmtdYM4dEoxYu2Onvbzd3w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-link@3.11.0: + resolution: {integrity: sha512-HnVSmJ4MLyFR5CpcNEZZxjX+wFnXYdzrpx8LXL/ImXhai6V7AIaCWvC9PyK9DxzNHdUTdratjYElunhCjP9Syg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-list@3.10.0: + resolution: {integrity: sha512-yZYIuyjjrRP8TWDQ9rO/gr3GeTrmPKOyW+Z5xJndL4VfX4utPQflWcRgb0MSrjBYkk1vBpcZ++gjnzFK1Nxp5g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-list@3.11.0: + resolution: {integrity: sha512-IvL9Q0gMUsKSN8K27H3rcqbWA3tj522Wlkvw442T3r4MibegmED9orq3AU1v2xttebr9Fluh1qr118viuqwYOA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-loading@3.10.0: + resolution: {integrity: sha512-wkvfT7kpeN8Q2++MUo8DMoCsaAfrgIr6Z15q2ivpwUj3CUh8VN9NG6APV55k+raje7jXDk9CWTZsLQzxGQuA2Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-loading@3.11.0: + resolution: {integrity: sha512-cwp/m8bhPsfqMAAU05tXkRZW58e77YTwv/qvbfeUoDXMtqgax9xdmHwP0RagvFYQGwq7Oc3CjVQrM1zG8ZmA2Q==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-locale@3.10.0: + resolution: {integrity: sha512-PGkK1WXNy72r/GKOvEdTlmSGDr+OLjSUiI4NewNzudg0qu2qNE7uxUzWRLEBnNvEzv72ZDXiKJksNFZ3xpUQfg==} + dependencies: + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-locale@3.11.0: + resolution: {integrity: sha512-BwxMdU1Lpl5PD+gZ+i+0wquEUaoAnYcBpmr5aw+yi0vtiZZtpVy+P/OBapVHkd2cIQ46BQ9V+X4AUWt6vJBvjQ==} + dependencies: + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-locale@3.15.0: + resolution: {integrity: sha512-viJsWN/zCwPq2Fa5bhVSTmwrnr/Hxz6V/PIx0NXyuVKMnapstALUzzpydsMOLSYLj9Jr0fgpCf7gEJcPO+DLQg==} + dependencies: + '@opentiny/vue-renderless': 3.15.0 + '@opentiny/vue-theme': 3.15.0 + '@opentiny/vue-theme-mobile': 3.15.0 + dev: false + + /@opentiny/vue-locales@3.10.0: + resolution: {integrity: sha512-1G6WCiTKjt8gl59G/BwlN/zvkcKoCQEWR34U35vbYBxmPZM+xBQhNurWGGpRrwkf+abYi5xM/XmTgvg4HQwEqQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-locales@3.11.0: + resolution: {integrity: sha512-K52FZtx+JgQULYZImmE5sEd5YTtaw2GUGx8c/mDom8bfLHClpOMxOsaMvwFGi93PMdn5AZjQFkGiFiKzvvU6qg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-logon-user@3.10.0: + resolution: {integrity: sha512-5D5WZ2gAjpMeXDSkEDPQXCenQvVKvwVa9d8RQCs9fW+GwvV4vZcEsUTyUuLIwUQSjdfJXcFSe066AebkefP2EQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-logon-user@3.11.0: + resolution: {integrity: sha512-xW9AugsbvpW7WvP5adA5qou9lMfqlPcKTcFgCyKw7UkOffLyKKasSKLNvIUR3fgtcRA3loVesSiDCCEmiJ6i4Q==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-logout@3.10.0: + resolution: {integrity: sha512-xO/a1w8uxNme0PgiGLHE6GYtBC87L09aEtvWa28aSd5emuUZuF5+IqRkxe+Vv+wMxgV73sxQUDB7WCQlzjMU8A==} + dependencies: + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-logout@3.11.0: + resolution: {integrity: sha512-gB2XGEvsiwxxrnrW86snu32oGPSlyINP/HBsBI8Z5qsZ0Q8NiohXQxoCPrv3bAucTfn4+puVPkMe4/m1jZvjgQ==} + dependencies: + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-message@3.10.0: + resolution: {integrity: sha512-V19nGsYv7E1WDOGSADcjHJLcy0aWjGLAI76T6AfWag4pwWc0zZ9I+12lO3UolPGJTh7G+DWgliAUtoEYdBqcSQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-message@3.11.0: + resolution: {integrity: sha512-0sDGPRGqYMDF9YBWshoL00Kf2MK5z06JeZVgk3qm+Qq9wEO0gwPQPr1l5ttvya0bUW55fO45mf9bjENrDTyoqg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-milestone@3.10.0: + resolution: {integrity: sha512-kquW//jb+7FGUSuiUwE3Np2UopxZEyfqkt4/KQr6EfMgTM2r/Va4j4R1H98UiRhg9Jliyd9NmRJ3ikEYTgA4IA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-milestone@3.11.0: + resolution: {integrity: sha512-d15CIlHVddg2/+MIKvrk93vFp1jl2zyCJVWRDqNkkvt5Z18TCoW1jeBnLi20U/3extqfVylJoJ6wMvQzDvklRw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-mini-picker@3.10.0: + resolution: {integrity: sha512-j+C+bBPploxkiFxCfx3WyXCo20hYrcA5qg2RszWw5KtL+T1ZIjZiVS3fDC++LXyVvsdh6G4tZ2D6FFYIzSfhnQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-picker-column': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-mini-picker@3.11.0: + resolution: {integrity: sha512-tmiqg+G6T1SZIaEhCV/nG6FcXYP79//fKHkX53RGC6nhFKaeZX3wrG+EmDFCBtA+V7cFHbFwQ45NHEMowgyLWQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-picker-column': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-modal@3.10.0: + resolution: {integrity: sha512-ao4X6oP1hj+HJvyy+LImd1YOvCt3euQChPRbSjKRCRmrvKoCILAaRXB/3h+fwFX8iAEMibDp94XJXysF+0Jsiw==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-modal@3.11.0: + resolution: {integrity: sha512-yImlQdwgnItFrawM8pXIh7dEcO7pUwMiakGi1uz2V7krdd16GP3oNbk+yRzwrVu4W0sjzIUBwSlCy8K8hHk11Q==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-month-range@3.10.0: + resolution: {integrity: sha512-4lY2Z9UMQGwDvSS8piX5OCmTG4mF535WeJG2PzX0IB8ajAcFxuqCAsEffO9T+333UANVftdOSxkB4uugoNr0sw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-month-table': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-month-range@3.11.0: + resolution: {integrity: sha512-oM052Huxw5RSQux9qCSpn+o1tRxAml0hGAPxoR1ZOTMhz/9aW6V6YHoxhyQROVyvlIYil0pSivCzAvnCUMNYBQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-month-table': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-month-table@3.10.0: + resolution: {integrity: sha512-XM+bjIClpVpeqPWzmFAiN0CfPzr9mzWSfW6JGvRCZiBKY2z3Pi4xWnhXe/1CdSmUGZTxgQIbGW2EQbDqz/W+Eg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-month-table@3.11.0: + resolution: {integrity: sha512-FlW6S8L6/xbgxV+nVUw9tn3KOkzV1ckCBcYjEbMbnMk/vxLoDi8uKqU6W6HP01rjxG8DHHbSgkRyZasGdaR98Q==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-multi-select@3.10.0: + resolution: {integrity: sha512-MR2u8OLTY7Pi21VFEMm1QIYgWvCRnJt5F2ceBb5PS+GJ4ZhfFIomw7u6MZ3S/BwJTS+aL4kVRlIYWWFN2DO9DA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-multi-select@3.11.0: + resolution: {integrity: sha512-tZUmNSP+SQo9fjJ8uonGL0e/9n5gdHKywqo1EHZltAZ5whEbwWhN3dnUcf/123Om/TiMOni3MRM610JOk+tnEw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-nav-bar@3.10.0: + resolution: {integrity: sha512-GJG512k7j7uzqi1J4wOYKb3Sz5QHiUeWkdAnG0AYAwzsTgfer40BoJW/Yf3aKJ64smAt75sTX4k9CJRxWvb8HA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-nav-bar@3.11.0: + resolution: {integrity: sha512-35kDMfE1USG9GL5j35WAap0jhzrTmYNvjQwr78h+CGA2ZJrKdNzO01+riDVWaS99faxX+MsJ1sOw+sw73/zEYQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-nav-menu@3.10.0: + resolution: {integrity: sha512-m2exhVvCxKuip2/baoIy5gQWrP8IsPXYdIgIhujAQWZIaM4hlLzObIfPGlCsv+ipf7BIkh7Ddu6SvZoUZylXpw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-nav-menu@3.11.0: + resolution: {integrity: sha512-MDnbZMeMW74o0M2JbVsHhukMz6nn48fISvv5DyFixjyVVT8TkmD26SBXa8pmVOkM+6LRpMPqW7vSXlAu+Wjtjw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-notify@3.10.0: + resolution: {integrity: sha512-1lnMT4Wq9IVU0NyTul9mCm4Mu8M7Ur1f9T2lJvVbQIoWtL5LImaTy1VXCZ4wNhP2RFKhduefECCSxcKdnwKu2Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-notify@3.11.0: + resolution: {integrity: sha512-9xDF8rSpoTeKZ6/dCHOnlzcDEJBAPTCj1apKTW6asW4JfXKNaNfiFRG19TlCoLIgfRDBgEjtTumjxzQAczNykQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-numeric@3.10.0: + resolution: {integrity: sha512-xeqTVvLKh0CgkTtoDt/kjqoGRErMbx6URVJsLmDV8+v89zBwTAjt9+RAWfOVaJ677ZSBXd2Wq2ePCysqkll8Rw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-numeric@3.11.0: + resolution: {integrity: sha512-8lJk06jmmy5NY4iGjcfx76x9J6r96uDfHJTN/5NDLzuvEjgfGslq5P2Y9HYal/0UYwm4RfKDoZwD5m+LScx2Qw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-option-group@3.10.0: + resolution: {integrity: sha512-uvQtPrOKV/gEtfptBJygmgEzKNf+b334+K343hPeKS6QaClssgBBSkcHfr5sol4mTIN04BGIkdmiSS76NzSR8Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-option-group@3.11.0: + resolution: {integrity: sha512-0LKSZbwi/EurJo0eyD6gcZYt6hpEOFMNcrcbKFdAc765jeQjoecU8Jyg00gsSqVXXpnUJ8tmPh1N5Mzd/YkXAw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-option@3.10.0: + resolution: {integrity: sha512-XQlYPKd6Nf4kV00bUTfSx+OoU/WSpUMe5iN8/ctEoNh0Yudyue0/U/NE1oAUvJHn7LHO7osj2tkhnh0QWT0IsQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-option@3.11.1: + resolution: {integrity: sha512-rQWq17iXEzSNwes9aQMoZ5RmRIjz8X1ZwA8XsOgsmeOnNBq/gjfbXSgkrjrvMw7qM38+Mk1uRTPlOr9IM0h56Q==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-pager-item@3.10.0: + resolution: {integrity: sha512-sblanQcwu64C8jk3cIdM4QXxYDWNpJbrq6DdyvD2ftah3Mi+l2RZt8BYDuBfhOZohWMglr35CwbVVZNxJTmj9w==} + dependencies: + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-pager-item@3.11.0: + resolution: {integrity: sha512-Kb10xeysrWSVpySDQcB4inzda8S6mFTqe7zUHqHyue+aLfSHjYnkh2tHhyaiWboj9gogT4HJDDFLwwdWPONuiQ==} + dependencies: + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-pager@3.10.0: + resolution: {integrity: sha512-JwpCV30HRBnz3/RPInBWBEZm/LDzZCl+AUD7slFnF2axtoo5Sd4mgt7MpPfNC+q7AfQYUU57WKq4ttVCPPZ5vw==} + dependencies: + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-pager-item': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-pager@3.11.0: + resolution: {integrity: sha512-/+paVetPSsvVe4d4r/1ca3wEmtT/y2ybj61yNFNOHciy+OgHGGA7bqNC4UGWjg7WLilnWQysGwjhuAu7Y+UtaQ==} + dependencies: + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-pager-item': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-panel@3.10.0: + resolution: {integrity: sha512-OOq97BWa5ttC7m1h/DtchniRW3tsEqIR0dA1XJ6Jz/u5D/zs9iYutGaj0Gs5g4pMrQubquELVhOu/9TXXR2s1g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-panel@3.11.0: + resolution: {integrity: sha512-7ESJ2dCrudFE5ojUvW20S7OK7jxFIMnDQjZ60xqduzgmnAcRnQiKViFJmaaWrAsjDkwMMo9/7B/beI/stn9Hbw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-picker-column@3.10.0: + resolution: {integrity: sha512-wv1RNedmxlO/758tLt2x9LXRX999+QE7Cj0C2RmGkANdCIbB9TG3dGhrMLbZhPNOTX85DbJZBXdjDoJvCb39Eg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-picker-column@3.11.0: + resolution: {integrity: sha512-xFMz9aH3tFsJFT/AXvoVq7E+imtU2KcNbeWeDFPWr5rJxNdmHMuVbuTvUU7CITe1IqixJpyTjQHHbVw1F0Fk4Q==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-picker@3.10.0: + resolution: {integrity: sha512-7Q91aeKhExfFjNMstcyLD5xqq1yrW2NWaM1EDNFBKijxbdz2TqBgsuqXRpl7GWkOSrKWal+ZgQ+dr2UEfaajRQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-date-panel': 3.10.0 + '@opentiny/vue-date-range': 3.10.0 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-month-range': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-time': 3.10.0 + '@opentiny/vue-time-panel': 3.10.0 + '@opentiny/vue-time-range': 3.10.0 + dev: false + + /@opentiny/vue-picker@3.11.0: + resolution: {integrity: sha512-XN1FSb3ijrHAC9BUP4Gzy5hFjZXs5vhz+ZQMmxd+J/Uq2yUcsexVvIvQVH6OUTniC+ktu545u7+soIxQ3AICjw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-date-panel': 3.11.0 + '@opentiny/vue-date-range': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-month-range': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-time': 3.11.0 + '@opentiny/vue-time-panel': 3.11.0 + '@opentiny/vue-time-range': 3.11.0 + dev: false + + /@opentiny/vue-pop-upload@3.10.0: + resolution: {integrity: sha512-J43zmcmbHNjKJHVfP98KFNjxsmRJBuY2dpY8mqe/LkCjRs4/vhJ/KfxOOq/Bc5l8FAAPaDOB8j6xiVFPPRIHOg==} + dependencies: + '@opentiny/vue-alert': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-file-upload': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-pop-upload@3.11.0: + resolution: {integrity: sha512-4TqzxpqtokUtBwNT+fFnpNqbl8t6mvvQaoFke70GzJCK2mcVwGcpqh0SEDEuDY99zyskEJrAIUE5IOUql7IpiQ==} + dependencies: + '@opentiny/vue-alert': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-file-upload': 3.11.1 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-popconfirm@3.10.0: + resolution: {integrity: sha512-Z/W4prAzMRvAsJogBql3X7MTDAFN7O45nEA4i30jli9jkFreSMHp3vPZbGwVHmgpwjqcHY4BVBomAeD+Y+aKyA==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-popconfirm@3.11.0: + resolution: {integrity: sha512-X5b7x0zi4Y2HPhJURqKSMvMEeaG7o0MqIGQWnLsAK8Ixd90NQNjh0+QQrcpmhaDEJFjfxyQfiyS+4duL3Ae54g==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-popeditor@3.10.0: + resolution: {integrity: sha512-gOHnoIlUMhPWDE5d2vTKMIi64hrKcxqEx1NLbQjJdN1ZspTc6DK+oeMv6eZWcy0NmutJ79R9f3a+NBr2XK3dtg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dialog-box': 3.10.0 + '@opentiny/vue-grid': 3.10.4 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-pager': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-popeditor@3.11.0: + resolution: {integrity: sha512-1/uRuYMbvC7X27e2HnOLY8rVlmfJaP9PhJJlS7+OhYh6CWIzjwOiZx7DGjKf6B83BXgNj8FX5I4SQXq70ZCydg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dialog-box': 3.11.0 + '@opentiny/vue-grid': 3.11.2 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-pager': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-popover@3.10.0: + resolution: {integrity: sha512-DM3D1hcG88I7WilKDxhiH5cDlar/sbKB1y4CXSIsQbG5niT6Hv2sf3+vDLV9uOIFB/97/puKpXEGmwVNsYsK1Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-popover@3.11.0: + resolution: {integrity: sha512-KhfASHqJIhI3L49hPffuAQBIVUI/3I3X88StoL7de4TZ8Wl6hqjUX+Mw8/85XcyftSMjxIchVN8PWuZOZ/8jMg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-popup@3.10.0: + resolution: {integrity: sha512-eSf7xAjWVDrTHrwIJ8R9AknUuwHi47+G40G8baSPoMO1LGC3+G+RtDOXfT7ZMUJ7TXRroZWAJKas6bVff9eKIw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-popup@3.11.0: + resolution: {integrity: sha512-L8F2h/qDDP55EcIWbSigIyX8z6vfFKJY1CiwulJoIM/Ij/lV7qAS++w/9ROouP2Ne10MfNBU1UwxZ3Aj+UC3Jg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-progress@3.10.0: + resolution: {integrity: sha512-XnJE04rFhzyG0pzDTP9SzJzSG+inGKgR78n4T84A/xApfDdMiehqlvHgCZO+ZT53ctZnQ26AbtL8h3CkaiTDPQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-progress@3.11.0: + resolution: {integrity: sha512-zSVT2pAFKT3sF03K9oWm0SBKCw2PTaUgT+lSyzAjGGLAbfKmaWcezLNlFS5JeRJQ2mffeAAq2hF1Pq/o8k+puw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-pull-refresh@3.10.0: + resolution: {integrity: sha512-53icamNFb7GA7/kr5SK4G5MYiRdzkaH2itXfrfuZlg8F23ORf+O8ArI/b/iEVRgDzBP9s0xDHR1NsyRs6kKpIA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-pull-refresh@3.11.0: + resolution: {integrity: sha512-V20Q+3mtF+gALznwWuDcKeBINPu38yN5Ou5Utltkf23VBGAoHAysAejGGekKROJJXVzkIBL0AbLpWDH+E0B7JQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-query-builder@3.10.0: + resolution: {integrity: sha512-UiAVDaFmCEh0YpTQHzy5BdID2AeFTr0DYqWD6feSzG3XCJkrKCcf7QYxj3WO5rHPg3sxSrK3MdlYJmWUdc1MFw==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-currency': 3.10.0 + '@opentiny/vue-date-picker': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-numeric': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-option-group': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-radio': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + '@opentiny/vue-time-picker': 3.10.0 + dev: false + + /@opentiny/vue-query-builder@3.11.0: + resolution: {integrity: sha512-yTPJelSCs80hPriTb/gMDIVSXMuele5KsFeXOCa3+1NA11eF9fqjQ+Df6ln8b98qPwFHoCxRI/fxVsRtP8AzJA==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-currency': 3.11.0 + '@opentiny/vue-date-picker': 3.11.1 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-numeric': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-option-group': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-radio': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + '@opentiny/vue-time-picker': 3.11.0 + dev: false + + /@opentiny/vue-radio-button@3.10.0: + resolution: {integrity: sha512-mbqQB3y0+izo+n/ufXtj4j+CidbBkrDD/3Yg0u9t9MNAxHFz3NW2kSn9plFIZQIJG28awCJg7DNH9A55yUk6Sg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-radio-button@3.11.0: + resolution: {integrity: sha512-VdCbQlkT+EQ+q8OZKSw0O7SXqWXAidn+dcCb9+U5+PUutZgjhJ1y9NrAl0JQ0pw8YDgzi1ky87SZIu4gGp80IA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-radio-group@3.10.0: + resolution: {integrity: sha512-50ysg2LAAPdHr5HDYxo1miOojSKzlX1+E5LrGcDSSymjGrPGx08eWiN1Cb8YH/GtKCZ7AZ1zvEzhgv3HZ+tN9A==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-radio': 3.10.0 + '@opentiny/vue-radio-button': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-radio-group@3.11.0: + resolution: {integrity: sha512-gYxWnYUO5c4KhlpfG6arZv7800io0nBhX13xo/Y0U3lV3Lsf+2RJOp8UTqo4boYoLFd++ZbgWO46GbfvPHI3FQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-radio': 3.11.0 + '@opentiny/vue-radio-button': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-radio@3.10.0: + resolution: {integrity: sha512-qdl5Yyetd5Y6IvKFy05mB71tifpzlglMdjoIbJkFaY6AvD5NWHxHdx4K4Zucmvjo3YM+kDlmVEEKGviYgbf/zw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-radio@3.11.0: + resolution: {integrity: sha512-C/Tdu7bLEcYMiT3O8MY1G0SoTzXFeQdw5jJdiQYfTefQ3+Q1pud/ov120Rph3yzgz5qGgyQucT0jjmhnvqrfjA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-rate@3.10.0: + resolution: {integrity: sha512-pgs/R4ALduwnJTFBNzQfMW4MdCSri/blFdcPX67hSUoi+nQFs8Vi9QbbXuLVU9xLLdUdXuTBoJaoBvoVX2XZXw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-rate@3.11.0: + resolution: {integrity: sha512-Ev0kMbpcFk9zh5VW17uZYQe+mYwaoV5WvUV24xGB0o3QrCzamQrHbzJMxZlr3ld1oydsVDHR/OEUHu8isfZOaw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-record@3.10.0: + resolution: {integrity: sha512-gTsN/7ELfNEHIjKHBIAj93xWDfHE6fkSbKEPiRDZkwPCV0XOI9IU0yMleHFK9PfdonVuJt86A785k6RF2F6M7w==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-record@3.11.0: + resolution: {integrity: sha512-5ltUniEVAC9ZhFicIks3EKHsw8p3V/GUBBv5oIsz1/QbyQjTKrlyzT1jaGKXzeF5Sb7g2rKWVN3qeAEn35xg1g==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-recycle-scroller@3.10.0: + resolution: {integrity: sha512-Yb3mjUDaRCiVDgiwhxJe6+qhNKL/T3OjeFSeChnuC2M3mSqx9RgmYYK5KtFwGsu4L42PtmJKAu+kwmjd2xZaHw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-recycle-scroller@3.11.0: + resolution: {integrity: sha512-mEmAg2iJlcy3X40HnBIho9lqm7TvztBy8lEnHrbhrD90RbuUEwTg67quKuSTgHb78dytIVoJ9HEmPtvXJHobPg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-renderless@3.10.7: + resolution: {integrity: sha512-wBZ9t4s9WrMgmvtQS1ai4AMm3muhB4/0zBFBlYbmWFoGUKJZfx4b9Qc/8gk3wwOtTysC+bC+e9x4UtnPMcXaiA==} + dependencies: + xss: 1.0.11 + dev: false + + /@opentiny/vue-renderless@3.11.8: + resolution: {integrity: sha512-tON6hV/5RLSSWTD8CeHv3ExPWWa2HK1b4iPh3kzUfc5GlWEaLaX2wdsK9i1nBI3zvfjst1sBCdlAvIeG20dqvg==} + dependencies: + color: 4.2.3 + xss: 1.0.11 + dev: false + + /@opentiny/vue-renderless@3.15.0: + resolution: {integrity: sha512-WtT4NGILLer49d0wM4iZQBkQfsJUdTAH/3xknAbM/GJKReV/0v7+czfcjCmONU2XQk6hjKbsbGRGqCb0kQpjrw==} + dependencies: + color: 4.2.3 + xss: 1.0.11 + dev: false + + /@opentiny/vue-rich-text-editor@3.11.2: + resolution: {integrity: sha512-+62NCwMkLXGccCymHczEJzlihLKHdMLWEcJdk25AshzKAz8njw7wXylfidIhmnJ+vZ6etIC5f+UtV4s6iOYs0g==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + dev: false + + /@opentiny/vue-river@3.10.0: + resolution: {integrity: sha512-tkq1Kl7tyxG7duPf8VGB5tqjGVysiC59TnMJHbvILtsT7//dBCjg471aH8dwXpuYyOLJpToemx00bSOJgN2UuQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + echarts: 5.2.1 + dev: false + + /@opentiny/vue-river@3.11.0: + resolution: {integrity: sha512-GA5LJMGs1ORN5SdX5k78F+eQeko/Flqcm+mNbIJ0Hwn3aLczuTDxdPXs4jAKYHgMuKDqVFkofKIjEjicErfXmA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + echarts: 5.2.1 + dev: false + + /@opentiny/vue-roles@3.10.0: + resolution: {integrity: sha512-jKJFS/0fC57T1yPr1F12R6lE7HxGrPDZPShLJUDneqn7ON/PxJ2Qrd4jKMkP2AFlUHHoD3D1KemZASES5D83bA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-roles@3.11.0: + resolution: {integrity: sha512-YZcvvpxq/sNzNe6xLbueYNu8KwG221fIEQBjbJS/wMD2tLNvJLlvzu31vf0/ezeOujBXtJDAo4dR2o8hxVKO7w==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-row@3.10.0: + resolution: {integrity: sha512-Qqy2PzOlaetY8sTj8UC2KkdcqkePi/iKf1P59rpCMdA6jX01dNeOPQJpfWyr6UinxefJHb0mBHwUxYkQZRT9ew==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-row@3.11.0: + resolution: {integrity: sha512-pCfRDGAzLk9rrBoqFxhPxO1cWQymlxK3HVJR0i80XS9B58dsXilROPFst0yDdH6M6YGTmQaOVoauuXRY3OEqhg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-scroll-text@3.10.0: + resolution: {integrity: sha512-UzXlnsrzo/GR/56g18CN4FuRZ32cGbEqIpv/9672+9yUV8t95oFk2Gz1CRayfB9/0+sckYE0DxGlDwUagIZ7ZA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-scroll-text@3.11.0: + resolution: {integrity: sha512-6GQPh2scJ9xg7mSmuRcHi2I9OUvo6jNppkLMkmntwrx3vYE7Ta2XkeSYoCfT3pVh5EHINo/hp/O56NfNQ9r4Hg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-scrollbar@3.10.0: + resolution: {integrity: sha512-ycdfas9cCDnDq9FP7buFimh9fUaRzDOkZEVAZf6G7Qvq7YtvOni4s7FXNNXgsDdNQ5CHccoffgyxZLxkkmkzbQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-scrollbar@3.11.0: + resolution: {integrity: sha512-5n7ekNtaQ1glV0FTu5VsCAE37QhNP4o2PWhsZ+E/YCM7b3MlAPiAJlDVLkxK5KlSVr/dbk3IAt6awA1NeOaJYQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-search@3.10.1: + resolution: {integrity: sha512-yAEokbtgScxyZwdlPziCYaFJvKVGvIdCI6ICEmDIWO/X4CrdSrcQXrJfSK7T5LbBFyK8sIiOgez1UfYhrzDlSw==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-search@3.11.0: + resolution: {integrity: sha512-0kwsm9TYMdfJFIQvUGzPnLLe9yS3/Nuuo4JQP/hmsw1f1q6bMjgYgO3230lVZkY4xrsmfJTtBYpB1dt/oceEOw==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-select-dropdown@3.10.0: + resolution: {integrity: sha512-NX0ZnsnAZSo21Nke75xeoiFif7Dg9TxR8fxGmJO3AnRLS5syAYo0yeNgUj2+MC21H95C9hyK7Vtts42qNi+Lwg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-select-dropdown@3.11.0: + resolution: {integrity: sha512-zMiqvJ6pxReFPmrVHWTuzASgkJ38DmhfmNsB1KtQECGmti/UAqvdtxVPzAHv1DCYOGRUSo7An+1RoO+GHol/2w==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-select-mobile@3.10.0: + resolution: {integrity: sha512-r3HltW3393pnSlbRJG8diFb/RaAuAidlA+ZIjjh9boZt0rPBJbTHPTcvyhQD463DUe6iTTk7xVSen7jCbH5lGw==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-select-mobile@3.11.0: + resolution: {integrity: sha512-fqjGkzbLWfkC1qp8aLn8mGmTBiuDEOkEtn88YtrXWDFjIIHC0NnB38igE7y9uxlSydX86yTZ0ug2TjxGrz52eA==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-select-view@3.10.0: + resolution: {integrity: sha512-jLN13r9Cvss/2I/I7nFpVDv53Aytg9rGqhvXAnqLv+ywaEMvGdUK+IlT0dwu//2GxdHDcKhBMru4C+UGfp66Wg==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-select-view@3.11.0: + resolution: {integrity: sha512-catF/IXFbyGLAJiZ6JUDk5/p2A8Yuk+QCp366CA5d8wevOi3Yp2qj1BejzukwmHg9+2Is54bdVZ2BsiBs0TqmA==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-select@3.10.1: + resolution: {integrity: sha512-sYVp1FoOXpZclR9pkCqhsWsjp668MW0kOO/amgc57VfvoL/iSZbyJNwfME05F9TyxLpgKCzoNC4ur27zNfVUCw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-grid': 3.10.4 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-scrollbar': 3.10.0 + '@opentiny/vue-select-dropdown': 3.10.0 + '@opentiny/vue-tag': 3.10.0 + '@opentiny/vue-tree': 3.10.0 + dev: false + + /@opentiny/vue-select@3.11.0: + resolution: {integrity: sha512-Zryz/6RTLpBxh+M/HLVkpfe4t3PJ/oZ2l9L+0eoYPnScNPXTg9QFZfozoViaxuuHLBJbrC6ekzgF/rOiLljIgQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-grid': 3.11.2 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-scrollbar': 3.11.0 + '@opentiny/vue-select-dropdown': 3.11.0 + '@opentiny/vue-tag': 3.11.0 + '@opentiny/vue-tree': 3.11.1 + dev: false + + /@opentiny/vue-selected-box@3.10.0: + resolution: {integrity: sha512-K5iNKlpdoOLGpDTpEH8va51/G1dNKFI4WJFcdmzUaJIRHJG7g30RnL1ZKlL3Cxbfxs72NEHVp3eFDPCpeHZp/g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-selected-box@3.11.0: + resolution: {integrity: sha512-ZEbhPubwG+8Qq08OaQg8NQdadWYYVbisbf1cJ6tEPUvIcYLEESFfsZV3W68pVByoNBHz21gmgdwteIwZuTFc+A==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-slide-bar@3.10.0: + resolution: {integrity: sha512-teIhVTMON15ksWsjGv865mdePbeA+4KOJzsMYbqFE4eaprZw3Zs0VOL49ZvM76trZKiJhBu3F732vRCOQU/xUw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-slide-bar@3.11.0: + resolution: {integrity: sha512-+AIua+wSlNT+92Wkx5flbJe89u//2gVfulMGfzJeUVJ5NsuwSM6U1mNm/b6kg0ozeVplfKS7dRfU6nS51N1IGg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-slider-button-group@3.10.0: + resolution: {integrity: sha512-WxewxHYC8+2UQhzCViyVVSZ+7qffR6gj2JpHKQ/Yghqofqj+PL7wjmfQm5HCBs2Qe6eU7R5OTh8/k91NtrQGng==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-slider-button': 3.10.0 + dev: false + + /@opentiny/vue-slider-button-group@3.11.0: + resolution: {integrity: sha512-eURLD1FBJ+JjqMs0FI+LB5WOp74hIvcaGdJxcuUldsLAM9li7Q/+8EybmAZpRvbkwbgAf7PDaF2+BOTuEr2YjQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-slider-button': 3.11.0 + dev: false + + /@opentiny/vue-slider-button@3.10.0: + resolution: {integrity: sha512-SBeX32eFFoBW8pP7E4otZaMLcumSBLPCCSXjFbfBrVyaylqOqw9KdG39PnhqEyznJKs0i1CefbdO+B1LjYCggg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-slider-button@3.11.0: + resolution: {integrity: sha512-DnLtZr/m9TDsmmSHRaMr5052IPewet7AfQ0NWBdsGJK/3N0FI/Z6TSe2PplepLQfqSlnBh2sfiWn+YuVdb7kzw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-slider@3.10.0: + resolution: {integrity: sha512-SzcD7hRzvlvmbtwNWlTxxSec6qMS/1nbmYSwAX47A4IOy88AczMSwloEO5juIz5g7I64a9IgkgUccr7N6IhcAQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-slider@3.11.0: + resolution: {integrity: sha512-jNKkyJDzILbGjBpboo0vcMQAApomUBCxH3h+UIRdTVQmY42TC1iZLaO30L0e0FV/iMES6/tJvoyR0US/9cg0xw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-split@3.10.0: + resolution: {integrity: sha512-nAkFw4hD0UVpe/sEXPOg66yEic+BqkkHS5esyxRJRFNLZoHb3krj5FN9B3FoJJM9TePTJfWtCWbVfTfcpyYlaw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-split@3.11.0: + resolution: {integrity: sha512-SBG5YY1UCJ8utxHQcRNTWhXOiteX/15Q/PRhsUUKjNx9zHMtvNQ6yWby12otUkd6OYGbSWSeR4R/GeOwmrmMkA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-standard-list-item@3.10.0: + resolution: {integrity: sha512-P/YJb0gs2aSKscO2oHkLc67LdKntM+BvYxl6n5MrHJR0J9cNpKI82qjNlEvygGycDP6uyeNdDur39WJ3Y2Lg8w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tag-group': 3.10.0 + '@opentiny/vue-tooltip': 3.10.1 + '@opentiny/vue-user-head': 3.10.0 + dev: false + + /@opentiny/vue-standard-list-item@3.11.0: + resolution: {integrity: sha512-+mVjELU4gmMcVmoKLsRfu5VhC7Z1qKMDNQd8eI5D+E4cgzciXAwc99N3umLYaUeWYbzAD7G0Cu//CV9XRg3u0w==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tag-group': 3.11.0 + '@opentiny/vue-tooltip': 3.11.0 + '@opentiny/vue-user-head': 3.11.0 + dev: false + + /@opentiny/vue-steps@3.10.0: + resolution: {integrity: sha512-LZWxb7KFMAj5HrPKffz4pt1lv3AP5YYxkQaSMeEwj6mphbBLagsO/vlsjYS7CJZWzsAhTC5pFZXLjmw0fGf+Sw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-steps@3.11.0: + resolution: {integrity: sha512-TJ8AKdK3fx7sEwMeEKVOUB8sLtG20OO7S8BDycfyTJ+Q5oQiNjGbTnIIi/f12/YuC7eiE0Z6Z+DvJmrAIxoRnA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-svg-icon@3.10.0: + resolution: {integrity: sha512-g3nkC+haDdpqY7pSw0RsvMQjFVvBdmfSjtE+o+TLaYvyUaLMiw/adPU3CcXlPRJQ0hMuN+EKf7bjPlkLMTN2lA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-svg-icon@3.11.0: + resolution: {integrity: sha512-qQ8i02LE71UUiDhPs0grmQu5RRZ+7yDj1OhQlG7i9Jo/nRcwrqPRT9uy2rROHOOOmI8MiJto/g+cfz6vBuQleg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-switch@3.10.0: + resolution: {integrity: sha512-MktAK3rmmFukO2U4V9pQWkm+q2hSCH5t1Tcxr+3TNcaZEv2/L+msPyttxp+yUBuSNhTgryD6dnBmlKjYIxMazQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-switch@3.11.0: + resolution: {integrity: sha512-+eqMd6p25Nk8ScuhFadbJPDqbKmAgV7MhR2CqJtvSMyRmUvzcl2R6Q3hGXRfivkn+9ctKDUekXmt7zuq0CthiQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-tab-item@3.10.0: + resolution: {integrity: sha512-AStWiwSIDPdxT/JZO9rcVPfQzumUbhwTeaP2EodMc4eUtGPLxhmfReZghmof/lBSnNIhA409JBobG/m/uB09vw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-tab-item@3.11.0: + resolution: {integrity: sha512-bjy4jjeVNY/6tpGNWUOthJJSyILL9LF4oxD315JycA2VdscI+o+Nw9w1H57lsF20RlxzEOs6eky5JMtP52PGBw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-tabbar-item@3.10.0: + resolution: {integrity: sha512-GGGyPfKwFf0ElQYqx+vj7TEBIFnsgyxYdd13JZa7np4Yj6z5FbPFmRHIlhbnZOtTHJKmmrYJxmm0KNYa0ABqjQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-tabbar-item@3.11.0: + resolution: {integrity: sha512-WnIvJqcvb6BOQUOBHbHcwNzgDo9uoXEfq4/XoEpzVTY3ViKsJ2ptZKedafPD84gxBcegFrJaspB0BoJgqNkHaQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-tabbar@3.10.0: + resolution: {integrity: sha512-LzzWlnUKXUcxwsQkKFsHUBFZ2Qgcld/XnWBOCRTpJGNdCPmGtoY3cTTaRrDzntpvoY663CitiSE/NiYdc98Epw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tabbar-item': 3.10.0 + dev: false + + /@opentiny/vue-tabbar@3.11.1: + resolution: {integrity: sha512-WPfRA31uL5Co05FxJh2lg4nn3GWKW9gjyOJgvcL0iY4nxeDbBiCOTxfdKduE0m6j+1zdiu/Wi+4i2kyLB3+CuA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tabbar-item': 3.11.0 + dev: false + + /@opentiny/vue-table@3.10.0: + resolution: {integrity: sha512-BH716fnTZ/hHfqw55G268V7NfFDIoHsiEsn+5HJik4IjndKdULAli6/RFM4/AAQnLJ2uDz+Vs6sEnl4hOy/x6w==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-table@3.11.0: + resolution: {integrity: sha512-xiuHV99LiFWfdKKjiecbl/QfBIW9Zhnq1aje1Bg9n29PNorQdXqXukBJ2LLAHcZCUsiiCV4kkPwBcM0Zpi88CA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-tabs@3.10.0: + resolution: {integrity: sha512-KnQj8eJv8dTxrQogYUlA1JXtHbjyN/GpI0eiFVEBrbWDK3iuwn46jp9t9DqWSui7UIW/IIVvXfNtBoTKRCUIvg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + '@opentiny/vue-tooltip': 3.10.1 + dev: false + + /@opentiny/vue-tabs@3.11.0: + resolution: {integrity: sha512-SCUSYXx7gsbWM4XQeiWyuVgbGrX7EEh53Zft2iPDvLqznHcrccBpsyZMYzluSm2wzKlDjlbpkqT4LdYU0Qge6g==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + '@opentiny/vue-tooltip': 3.11.0 + dev: false + + /@opentiny/vue-tag-group@3.10.0: + resolution: {integrity: sha512-oNwskNpaggJq4/fLZm2jafWjpJutI1cFq0b5Xbv6f7uBWvTpbRDy+pzYhUTJE8ZpllQIVjbti7d8Ev0GXIQExA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tag': 3.10.0 + dev: false + + /@opentiny/vue-tag-group@3.11.0: + resolution: {integrity: sha512-/JDTAM4r0gwzc4SlkafStIOf+Uv8cRCA/G/aMHrREZnwaYjxkIbwT9cRv33yLGFZone+StCqOwy52UPvr8bjZQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tag': 3.11.0 + dev: false + + /@opentiny/vue-tag@3.10.0: + resolution: {integrity: sha512-RqrQEgjymiaa4ZJSWOfHre/6/JqYG4QwJoxIRT4Qu6rkTLxfh0RcJJ/UOqQa3MGUZaqLeArHo8AvmT7wYu000g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-theme': 3.10.4 + '@opentiny/vue-theme-mobile': 3.10.1 + dev: false + + /@opentiny/vue-tag@3.11.0: + resolution: {integrity: sha512-bFCKMZz5PwTV1FscnoyHE7ph0SLetQGfffQNHdri1rnBI+vuYHi81yjnw7u7RGq6Ov7TE2aSZK8mfIldpY7Tpw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-theme': 3.11.6 + '@opentiny/vue-theme-mobile': 3.11.1 + dev: false + + /@opentiny/vue-text-popup@3.10.0: + resolution: {integrity: sha512-rmzdnFUgxgPG+xl//nPxXXv8tvXHoUxMl671e877vbrUW1N7+9wyUwkLyIdnFo42zHlobc4qq9HrJeco5+FgwQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-text-popup@3.11.0: + resolution: {integrity: sha512-rMhMKwZinHJOSX2SapplauPexDDCAUo1OjpCGIgFQZt1XVYlK8i+X8lzC7l06vlyCklAueBrTJxGCtxthueMfA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-theme-mobile@3.10.1: + resolution: {integrity: sha512-ISQ0Ddj5SJQqbchxaOW7Rs1GzS0kgDhW+YOcrbsPAmC9+ZwK0oxgTFv2S+RSX3y0juraTUZX8l1P5wRxCrCUCg==} + dev: false + + /@opentiny/vue-theme-mobile@3.11.1: + resolution: {integrity: sha512-liivr+BpfhC+/B8lzPvJ9saX5pTgKEdbIeyRozXedAh8cJ7MGdoMA/CwZPlyEuFvPQbmHnA0aPaVWMkRtMSlqA==} + dev: false + + /@opentiny/vue-theme-mobile@3.15.0: + resolution: {integrity: sha512-eBcEbbA5Ncrfs8D+WRj2L8g/ed5sGky4lZeiShNAww6Mj0b8cG8oIKvp4hXvpYEMWSP8sgOHPcvnXtr7QI0yqA==} + dev: false + + /@opentiny/vue-theme@3.10.4: + resolution: {integrity: sha512-Q0PAlZBD+2gfImechnXMKpdIYgEHlm8furaU8+ajv1tSzzF75OPd+FjJOx5BvvPwwV9yw9W0BY8mdtr8iuRu7g==} + dev: false + + /@opentiny/vue-theme@3.11.6: + resolution: {integrity: sha512-jfoARGaiPhQrqiR4CiWZ6pUN6/91rJsGL0pD8KWAUZFbMC14lchYOU+7EM+eZ5tvHuJtWFyJzuhhwLZnFYzPDw==} + dev: false + + /@opentiny/vue-theme@3.15.0: + resolution: {integrity: sha512-4CbCU5lG10+r8ZISOVxHzG1iM+b+g883LCikfEilnyG4sZFa1f4GXXgA4ZjkF6F6E2vrF/QNoCwL/zwDGTZKOQ==} + dev: false + + /@opentiny/vue-time-line@3.10.0: + resolution: {integrity: sha512-HoZfRiFgQcus/fdilcM7S5rQfpahr6aCkCuIBneFtzaf4FBC71bEr5NvAbwK7UwvaA1ytXMeRF4Q1OIZvpoC7A==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-timeline-item': 3.10.0 + dev: false + + /@opentiny/vue-time-line@3.11.1: + resolution: {integrity: sha512-7+RWoUDuZDvTQqNlPzxOrgTIBYadSIZFVVNfZwNkZpNUO4YELYXqD5Q2hCghzIrgOw7jdtzkWYK+74vSGM2rDQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-timeline-item': 3.11.1 + dev: false + + /@opentiny/vue-time-panel@3.10.0: + resolution: {integrity: sha512-/SoNT8a2v+v59kvMiynzno86i2Wct6tcJT2TOpRvjYYcl+F7G6UgPQNkrpXCe3Bzy1hs0tN7cJAldi5SPdfhqQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-numeric': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-scrollbar': 3.10.0 + dev: false + + /@opentiny/vue-time-panel@3.11.0: + resolution: {integrity: sha512-eGqviGjWFvI9fituVouk31ARmjd6f+lRY31L+/MCzDjntfwrZaO+xJgIAjN9E3SfvIOXKYk2Ol4FC9gSI4w5oA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-numeric': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-scrollbar': 3.11.0 + dev: false + + /@opentiny/vue-time-picker-mobile@3.10.0: + resolution: {integrity: sha512-/Sa6zT1hrajpvHyHqfaY3hD8DyZ/0qEiO7RKgL6jkBIoeAFB204dZb75BRcRqvtjRQyA4FvvaqyDGe8fnQi3Jw==} + dependencies: + '@opentiny/vue-cascader-select': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-time-picker-mobile@3.11.0: + resolution: {integrity: sha512-s6RrPrqGF+aw9MllRJlgEw1Rx1zxUD7zN4yHky4O+006ZPq1Tiy3VvwHYyjQjR1b/i4JAY8yXxjiJoqsjXPnHg==} + dependencies: + '@opentiny/vue-cascader-select': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-time-picker@3.10.0: + resolution: {integrity: sha512-hR/uI5/OHpufoPzOmFUV0riWGCFNmSNqLc3wfIP3YnnoPVgaInFPGjlAkzrST2ha4+N+CPSet6JnaNulvchGGA==} + dependencies: + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-time-picker@3.11.0: + resolution: {integrity: sha512-A7vvDXNTXdOXlFYW9NH2CZ45QnHVQ9mCkHDNt3drht2mArIs8eAFVGOFics3RGdLxIDaSMU/+u7rtPRG0xIMCg==} + dependencies: + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-time-range@3.10.0: + resolution: {integrity: sha512-AN6RJdAaFRm5YietapPzral349VtGM2ar5jv/vvqqDGDY6fSKu5B9aBhBnoD+fdqSVSu/XklO8CrlNQPBGVNMg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-time-spinner': 3.10.0 + dev: false + + /@opentiny/vue-time-range@3.11.0: + resolution: {integrity: sha512-MZiKFCRFChbUjpzeLDnmkzWiA8nQCS0YBiMtNh3+Q+B1EWCfQ9TfQ2c5d74woEjNSLBhcTChwPAEUE5HnTOIIA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-time-spinner': 3.11.0 + dev: false + + /@opentiny/vue-time-select@3.10.0: + resolution: {integrity: sha512-209bJhVU/9DjaEWgkanZcRzkujpcaMRtCr70YfsfdGiqoO7bYuMEd9rAP+0ChRvwzQ+KLDd8LAJB4IhLD7cE8A==} + dependencies: + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-time-select@3.11.0: + resolution: {integrity: sha512-40Q/o83IoDa3V4QjmAWgFlK8eADyM/dWckTfAud39SO/hGy7UvEezFY2YEg2pkk2KfnETGaFRobdRddbhnxLPQ==} + dependencies: + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-time-spinner@3.10.0: + resolution: {integrity: sha512-R1uIKvMgzS45rqnPZi2ROmV7THagGUPpoAL8yZVmM8RlY0L2nxC/y7zqJoPm5hLIQehZXRbEuuiVUrjzpgcv5Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-scrollbar': 3.10.0 + dev: false + + /@opentiny/vue-time-spinner@3.11.0: + resolution: {integrity: sha512-u5F7HzT9dHpCszEHRj5shwknUTFMc++cDULN0N68UoJ2Is8P6+zmjYJznAtITvCBxapkOp6MsOTYQQTnKblqkA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-scrollbar': 3.11.0 + dev: false + + /@opentiny/vue-time@3.10.0: + resolution: {integrity: sha512-uZ9y0XzhhC4DGJNq/3/2d2FjGTIHwX2TfdqJpd0UO5KUle7FkabrFW3UTO1S0oS3LNv9aIqMejIUjx4CfOhNTg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-time-spinner': 3.10.0 + dev: false + + /@opentiny/vue-time@3.11.0: + resolution: {integrity: sha512-WKHEtpCii2PCVSC8Tegm0wY4t0VrYRcHABKyL03SkOslfyVCHCar0MJUvvZNOZzPAoB+CBqB5y5y2W0vDDyQuw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-time-spinner': 3.11.0 + dev: false + + /@opentiny/vue-timeline-item@3.10.0: + resolution: {integrity: sha512-yK3q7vd3jIN1dUvML2zdwFjlkVn8azvEJEp7qJQVBmD9jm+yikwQF3j9LzJ5WspefJeHvk0dcsjIRzvQWwQsnA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-timeline-item@3.11.1: + resolution: {integrity: sha512-Q80u81PU8hv7TMShb9QVbbHQLleurgvZokJ7crRSLNwX8MmsiMEhFUkUPAx+T7wAGcfA+Tpmb8KfezcuajQU9A==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-toggle-menu@3.10.0: + resolution: {integrity: sha512-zwzughXBVxaiBZMqZJtLfOfJ5g3HBrwp1CvNjfh9c+LcM+jbmPVp/uAJ4LtXw2UVurgE288Bt1YdyL9WRbJNqQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tree': 3.10.0 + dev: false + + /@opentiny/vue-toggle-menu@3.11.0: + resolution: {integrity: sha512-S/yH1OolrfbwK3JMNj8sG0oDI/eiFdlXkbFnirSSq3RV1KR4D+NQ1d7RqQ6NLBdUfAUc4iGDS7ARLzmNlHhauA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tree': 3.11.1 + dev: false + + /@opentiny/vue-tooltip@3.10.1: + resolution: {integrity: sha512-Em7FTYseNxnVjFCOhwED0hgxznN4JGjiZKgXWEnj6KFb1F07+azGxJvK1tyA7lqp152HKWSb31+Jn9ctr12u8Q==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-tooltip@3.11.0: + resolution: {integrity: sha512-fL3SQiiwqyg6+Rok65a1FszUbviazlbqKKRp8PkTYvNxE3VeRE7pVnZZ3qPAaMGYcReasG1DdoYzhdHllBpwMA==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-top-box@3.10.0: + resolution: {integrity: sha512-GdQ2ik4XF6e62vrJcKuiCZzGiQTh2jSEJyo5lDoxf8UI4Hbp2B7PLDHsmAHUdWfdxna3DMztvBJxfdC1Ra6XlQ==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-top-box@3.11.0: + resolution: {integrity: sha512-elL5b8u2fq7A3pfRnX1oR9Kkzrws5JSoYOhkeLO1tZllpmL3Xh1nf+a2AAxRl42di+lYdZKoXOvi6LCzipsyfw==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-transfer-panel@3.10.0: + resolution: {integrity: sha512-rGlFas4ffWqXGEk1l9tEjKJReyg7Pe4ghCUtGpq1CoFRV/leF8SL8Kv4wgoZzX/kyMUoSb9Ox7UP1w5tPbqz3Q==} + dependencies: + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-pager': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-transfer-panel@3.11.0: + resolution: {integrity: sha512-LW9xviVxXUw9R2q1LDi0GGAwh2i7CSQR9MhEoLnemHE3Fosrqj9gVFuUU63woZq1+OUV5zvsMo3zd0LV6luZQQ==} + dependencies: + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-pager': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-transfer@3.10.0: + resolution: {integrity: sha512-GJtTFYVGKq2IYJDl0qj9qSQ2IdeyyYBjwVfMhXvKmcD3EhlWvxHfqwr0qhS/yoB8nMoiZzpL/D1Njyi6M/DYWA==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-transfer-panel': 3.10.0 + dev: false + + /@opentiny/vue-transfer@3.11.0: + resolution: {integrity: sha512-MwpJDHLiTTB4cVJBKhPsCwskmqbkt/HcSIbyi8+PjXx5AabOOagxQWUu1vT8/g3ftIJgE0agx8lQUeDhfOOF0Q==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-transfer-panel': 3.11.0 + dev: false + + /@opentiny/vue-tree-menu@3.10.0: + resolution: {integrity: sha512-ScgvFLXy9fjt7+q+gECa+Dzl/A3nI5hoRiG7rnL++FqVKxJMBwH3LcKWRapLyr2VB+1g/hEzvuHrqk1O90Et6g==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-tree': 3.10.0 + dev: false + + /@opentiny/vue-tree-menu@3.11.0: + resolution: {integrity: sha512-d7rSIfUvMSc5bkL0WkaC0Dh4Hgjz1lGFMZDO/Z/F+lZp1+VKRWxRAB6WNEEJKyExj9nOTRni45cNV1Ae3FBZfg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-tree': 3.11.1 + dev: false + + /@opentiny/vue-tree@3.10.0: + resolution: {integrity: sha512-ecXbgOCPudIN1AAWuLdtKrdWw2dqMgR0FCkOsgj9X6YAAEsGsjOlPiFi+0C/37myuedAaLoNjwCKDIquRCm2jw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-tree@3.11.1: + resolution: {integrity: sha512-OCPEs/17N4mlUex3Qp+92RO2ebBBh80LrgSTk1unFGGoyg1nUAKYzTKE035kDd7eLoGdV0lPrdmeSxKi21kXGw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-upload-dragger@3.10.0: + resolution: {integrity: sha512-BG/LQDxfWHp+I7Dd3NaRxwo/quna9WwnmdlmF91MiVH4TWuCN2PM0PRhSX8yChuRzxtTVeQpvEpsF0Fr9J2+aw==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-upload-dragger@3.11.0: + resolution: {integrity: sha512-Mbie8u2jRf10pUEJ+YqywHex221UjSI2CalfWnxhODYSgcTRbeY9kJNjP0cd5rKTqgTCaua5d32PQmTbRUCi4A==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-upload-list@3.10.0: + resolution: {integrity: sha512-ByOWHtEYORueEpzYAyxNIcVdSxxCmNE+A8+1E6jSQRKEcsq1qiwQ97jdKB4mG0k/VcrUiTVEcak5keidQ7GpOw==} + dependencies: + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-image-viewer': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-progress': 3.10.0 + '@opentiny/vue-record': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-upload-list@3.11.0: + resolution: {integrity: sha512-XSTz53bqBT0W0QqetE1Ylk95UH1ibT84CGPovv8zJT+agZOPu6tBL6evA6ujF6/MxQaLHlHPQ8VCgHtqFNyQ2Q==} + dependencies: + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-image-viewer': 3.11.1 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-progress': 3.11.0 + '@opentiny/vue-record': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-upload@3.10.0: + resolution: {integrity: sha512-ieKuUwdhIu967BiBgiSJqPj9FJ0dE8XEJ+dvIU5kaLavnHwJZcyGYLp/iKpIDp4tHDDL5Qw0uzSb+F+BRTRonQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-upload-dragger': 3.10.0 + dev: false + + /@opentiny/vue-upload@3.11.0: + resolution: {integrity: sha512-abKxfGsa/RwE04oNdQN6ET28ByBLKEfL9MjaKQfrgh2/HKjox/cvgjsXIckgTSAMJSdQ83negT1a49ePibSAgQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-upload-dragger': 3.11.0 + dev: false + + /@opentiny/vue-user-account@3.10.0: + resolution: {integrity: sha512-c/cqn3Ruon7nO7ANFcABpRpH2eoLL6EtpXaMEuC8vvzVssZkvsJgNImXBrcoRABbGnnPlodmScmGIVguOJIR+A==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-logout': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-user-contact': 3.10.0 + dev: false + + /@opentiny/vue-user-account@3.11.0: + resolution: {integrity: sha512-LdTmxkwhedLUMV7KcLe8O+BKztgAFy2yYrkMDMN1WWd77NNStT7lRlwo9Ikp2+RYCeq/snf3IDcfDnxPQPLvZQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-logout': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-user-contact': 3.11.0 + dev: false + + /@opentiny/vue-user-contact@3.10.0: + resolution: {integrity: sha512-hw/9IVJ8FrlbNAf9Beq5QOxpvxztq6zOC4Ot2Vnm77ILCxjbiS3IHfaoQqHQsQcV5Gpv8bYspQLe6j66WFOkbg==} + dependencies: + '@opentiny/vue-card-template': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-user-head': 3.10.0 + dev: false + + /@opentiny/vue-user-contact@3.11.0: + resolution: {integrity: sha512-rMUv0Dtts7BQLIUE2yM2XxwaTUGXXZ81myeOJaJC78nicS8gMsArnT3+Os+kMp9GFGiiAuYUW9x6xlcJwOvl1w==} + dependencies: + '@opentiny/vue-card-template': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-user-head': 3.11.0 + dev: false + + /@opentiny/vue-user-head-group@3.10.0: + resolution: {integrity: sha512-tkTwZg4otb/9tj4Rv3aO8ePEQitYSTcDxcT7QGs/YWK/TZ0xE+QFbIOru/+TGDX8DAFCoaeEyqFkzoyd0BURYA==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-user-head': 3.10.0 + dev: false + + /@opentiny/vue-user-head-group@3.11.0: + resolution: {integrity: sha512-PmJeVShbX2+QyLqxzwbFQF5gWzRkuRlrkpDuodqK2jJgNGlDY4J17oj7hGEP+a+jo7pxrG3Pc6E9vEAbJQez/g==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-user-head': 3.11.0 + dev: false + + /@opentiny/vue-user-head@3.10.0: + resolution: {integrity: sha512-R0y8GcHY7VAcKU8R3ReJ6mzTwZx2pO9xqeRH0kAd9pA4QkWgh9iZG/RU5b/kQv8REZFpNzr+c56DcTUuobUCTg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-user-head@3.11.0: + resolution: {integrity: sha512-tcIJSlZoVe2Jp0GaItoLTKcuJAJP1v6wwDggyRzOoer2ZsnKSPFEkyR0B+aX49+Ts8O5RD/raZz6rbM+IDNjqQ==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-user-link@3.10.0: + resolution: {integrity: sha512-z60kyE59arc1NE63nY6CqaqKeFroWxGqi6MV+puLRFXnAzbOiyVAd7DY5MOnC7UYNkveTPe79sHYrvyUcE/Ewg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-loading': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-user-link@3.11.0: + resolution: {integrity: sha512-FdiJIfYOx+2K9ARDauspbs/Tau0GdYcxCpYdvXsUV+i8Coq4y18QXEmXB8RENwcnTpUkHgR69N+jUgaTRKANkw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-loading': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-user@3.10.0: + resolution: {integrity: sha512-aLrW0Pmk4rwjG/gr6QHNSWVwmExwMr9ZPjEhVfmNxsUm+tOLG3ThIkSPoWFz6hMdiNwj6BiQo8dJjm5UAxyAHg==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-select': 3.10.1 + dev: false + + /@opentiny/vue-user@3.11.0: + resolution: {integrity: sha512-tR9zKQFOU6AFNC9IOCo3dfMKHaVuM0zS8YpormS/l4arhwe/Q6Z+oRi/fkhQ8nvC93s1MmWm45fx3eWJknR0Lg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-select': 3.11.0 + dev: false + + /@opentiny/vue-wheel@3.10.0: + resolution: {integrity: sha512-F1ro9s60dQWRA7R1eCHNdtTiiag+3HGjldz/SLWgfUnoY8CP3UXvrN7u8FgU4d00b7QKOY+3OJW7hlfPfNIogw==} + dependencies: + '@better-scroll/core': 2.5.0 + '@better-scroll/wheel': 2.5.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-wheel@3.11.0: + resolution: {integrity: sha512-lMJcOWzrqgzBIoCjLkl1ErzO1byEF7CqxK8/42ubPDa4vNajZ4zIPlujkKl5NhXfH+cqZAP4l5hYkNVznt0cFA==} + dependencies: + '@better-scroll/core': 2.5.0 + '@better-scroll/wheel': 2.5.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue-wizard@3.10.0: + resolution: {integrity: sha512-+B5RjqVUhgyGHYbf3bzXKspMFFkIFcpOwI8tYIFbRXyOigVYFCe9AHZJZpHLmz6f0tL7heUaXxjhTYMgZ/Fg5A==} + dependencies: + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-icon': 3.10.1 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-user-contact': 3.10.0 + dev: false + + /@opentiny/vue-wizard@3.11.0: + resolution: {integrity: sha512-YyFYS104cl5rxFVk9URtwCLFkCkafuVsefr0muU2TxF00Uo10RNB6i8dHzDmdoLu9OgagPp1LNfbc18KON8i6g==} + dependencies: + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-icon': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-user-contact': 3.11.0 + dev: false + + /@opentiny/vue-year-range@3.10.0: + resolution: {integrity: sha512-S+PJznL2F0d6aQnAin0ikhezinAN1IfqecFQX4RlPJXMA57ZqiwxNBn9QfNieoKSbJOrv1u5KSmuZIN52Gq7nQ==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-locale': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + '@opentiny/vue-year-table': 3.10.0 + dev: false + + /@opentiny/vue-year-range@3.11.0: + resolution: {integrity: sha512-cyd1Rq7kECsRx1s1UTIcAY0olwx2oOkJt6aqkHB5zoYbsFbjpYRggZLJdqP8pUGJb9Dh61+kucoabmVFX7nJUw==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-locale': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + '@opentiny/vue-year-table': 3.11.0 + dev: false + + /@opentiny/vue-year-table@3.10.0: + resolution: {integrity: sha512-OsnG2xIEyCsJiAVXETyg1imB1lV4n1JsrnURbn/MpFsPJ4YMN49V8GIlVx4NdZebbiGVvwt2iGtQCjeGV5jjow==} + dependencies: + '@opentiny/vue-common': 3.10.0 + '@opentiny/vue-renderless': 3.10.7 + dev: false + + /@opentiny/vue-year-table@3.11.0: + resolution: {integrity: sha512-nUuqf7AH+iz36nohMSz+Agkx+VnED8VBPN3Bw3VrzXLoLyV/DKxnVIcdmWmLYn5qdjvSukfmnJ8hfnzFveQrfg==} + dependencies: + '@opentiny/vue-common': 3.11.0 + '@opentiny/vue-renderless': 3.11.8 + dev: false + + /@opentiny/vue@3.10.1(@floating-ui/dom@1.6.3)(echarts@5.5.0): + resolution: {integrity: sha512-rYx4r1XLO6IDZ7g6Rc+xqwsE85J4+hhxUMPLxaoFJbFsUp28vToaFLikua60Hjwl9K1uC93s3fUhCiVIajjdCA==} + dependencies: + '@opentiny/vue-action-menu': 3.10.0 + '@opentiny/vue-action-sheet': 3.10.0 + '@opentiny/vue-alert': 3.10.0 + '@opentiny/vue-amount': 3.10.0 + '@opentiny/vue-anchor': 3.10.0 + '@opentiny/vue-area': 3.10.0 + '@opentiny/vue-autocomplete': 3.10.0 + '@opentiny/vue-autonavi-map': 3.10.0 + '@opentiny/vue-avatar': 3.10.0 + '@opentiny/vue-badge': 3.10.0 + '@opentiny/vue-baidu-map': 3.10.0 + '@opentiny/vue-breadcrumb': 3.10.0 + '@opentiny/vue-breadcrumb-item': 3.10.0 + '@opentiny/vue-bulletin-board': 3.10.0 + '@opentiny/vue-button': 3.10.0 + '@opentiny/vue-button-group': 3.10.1 + '@opentiny/vue-calendar': 3.10.0 + '@opentiny/vue-calendar-bar': 3.10.0 + '@opentiny/vue-card': 3.10.0 + '@opentiny/vue-card-group': 3.10.0 + '@opentiny/vue-card-template': 3.10.0 + '@opentiny/vue-carousel': 3.10.0 + '@opentiny/vue-carousel-item': 3.10.0 + '@opentiny/vue-cascader': 3.10.1 + '@opentiny/vue-cascader-menu': 3.10.0 + '@opentiny/vue-cascader-mobile': 3.10.0 + '@opentiny/vue-cascader-node': 3.10.0 + '@opentiny/vue-cascader-panel': 3.10.0 + '@opentiny/vue-cascader-select': 3.10.0 + '@opentiny/vue-cell': 3.10.0 + '@opentiny/vue-chart': 3.10.0 + '@opentiny/vue-chart-bar': 3.10.0 + '@opentiny/vue-chart-boxplot': 3.10.0 + '@opentiny/vue-chart-candle': 3.10.0 + '@opentiny/vue-chart-core': 3.10.0 + '@opentiny/vue-chart-funnel': 3.10.0 + '@opentiny/vue-chart-gauge': 3.10.0 + '@opentiny/vue-chart-graph': 3.10.0 + '@opentiny/vue-chart-heatmap': 3.10.0 + '@opentiny/vue-chart-histogram': 3.10.0 + '@opentiny/vue-chart-line': 3.10.0 + '@opentiny/vue-chart-liquidfill': 3.10.0(echarts@5.5.0) + '@opentiny/vue-chart-map': 3.10.0 + '@opentiny/vue-chart-pie': 3.10.0 + '@opentiny/vue-chart-radar': 3.10.0 + '@opentiny/vue-chart-ring': 3.10.0 + '@opentiny/vue-chart-sankey': 3.10.0 + '@opentiny/vue-chart-scatter': 3.10.0 + '@opentiny/vue-chart-sunburst': 3.10.0 + '@opentiny/vue-chart-tree': 3.10.0 + '@opentiny/vue-chart-waterfall': 3.10.0 + '@opentiny/vue-chart-wordcloud': 3.10.0(echarts@5.5.0) + '@opentiny/vue-checkbox': 3.10.0 + '@opentiny/vue-checkbox-button': 3.10.0 + '@opentiny/vue-checkbox-group': 3.10.0 + '@opentiny/vue-col': 3.10.0 + '@opentiny/vue-collapse': 3.10.0 + '@opentiny/vue-collapse-item': 3.10.0 + '@opentiny/vue-collapse-transition': 3.10.0 + '@opentiny/vue-column-list-group': 3.10.0 + '@opentiny/vue-column-list-item': 3.10.0 + '@opentiny/vue-company': 3.10.0 + '@opentiny/vue-config-provider': 3.10.0 + '@opentiny/vue-container': 3.10.0 + '@opentiny/vue-country': 3.10.0 + '@opentiny/vue-credit-card': 3.10.0 + '@opentiny/vue-credit-card-form': 3.10.0 + '@opentiny/vue-crop': 3.10.0 + '@opentiny/vue-currency': 3.10.0 + '@opentiny/vue-date-panel': 3.10.0 + '@opentiny/vue-date-picker': 3.10.0 + '@opentiny/vue-date-picker-mobile-first': 3.10.0 + '@opentiny/vue-date-range': 3.10.0 + '@opentiny/vue-date-table': 3.10.0 + '@opentiny/vue-dept': 3.10.0 + '@opentiny/vue-detail-page': 3.10.0 + '@opentiny/vue-dialog-box': 3.10.0 + '@opentiny/vue-dialog-select': 3.10.0 + '@opentiny/vue-drawer': 3.10.0 + '@opentiny/vue-drop-roles': 3.10.0 + '@opentiny/vue-drop-times': 3.10.0 + '@opentiny/vue-dropdown': 3.10.1 + '@opentiny/vue-dropdown-item': 3.10.0 + '@opentiny/vue-dropdown-menu': 3.10.0 + '@opentiny/vue-dynamic-scroller': 3.10.0 + '@opentiny/vue-dynamic-scroller-item': 3.10.0 + '@opentiny/vue-espace': 3.10.0 + '@opentiny/vue-exception': 3.10.0 + '@opentiny/vue-fall-menu': 3.10.0 + '@opentiny/vue-file-upload': 3.10.0 + '@opentiny/vue-filter': 3.10.0 + '@opentiny/vue-filter-bar': 3.10.0 + '@opentiny/vue-filter-box': 3.10.0 + '@opentiny/vue-filter-panel': 3.10.0 + '@opentiny/vue-floatbar': 3.10.0 + '@opentiny/vue-floating-button': 3.10.0 + '@opentiny/vue-flowchart': 3.10.0 + '@opentiny/vue-form': 3.10.0 + '@opentiny/vue-form-item': 3.10.0 + '@opentiny/vue-fullscreen': 3.10.0 + '@opentiny/vue-grid': 3.10.4 + '@opentiny/vue-grid-column': 3.10.0 + '@opentiny/vue-grid-manager': 3.10.0 + '@opentiny/vue-grid-toolbar': 3.10.0 + '@opentiny/vue-guide': 3.10.0(@floating-ui/dom@1.6.3) + '@opentiny/vue-hrapprover': 3.10.0 + '@opentiny/vue-image': 3.10.0 + '@opentiny/vue-image-viewer': 3.10.0 + '@opentiny/vue-index-bar': 3.10.0 + '@opentiny/vue-index-bar-anchor': 3.10.0 + '@opentiny/vue-input': 3.10.2 + '@opentiny/vue-ip-address': 3.10.0 + '@opentiny/vue-layout': 3.10.0 + '@opentiny/vue-link': 3.10.0 + '@opentiny/vue-link-menu': 3.10.0 + '@opentiny/vue-list': 3.10.0 + '@opentiny/vue-loading': 3.10.0 + '@opentiny/vue-locales': 3.10.0 + '@opentiny/vue-logon-user': 3.10.0 + '@opentiny/vue-logout': 3.10.0 + '@opentiny/vue-message': 3.10.0 + '@opentiny/vue-milestone': 3.10.0 + '@opentiny/vue-mini-picker': 3.10.0 + '@opentiny/vue-modal': 3.10.0 + '@opentiny/vue-month-range': 3.10.0 + '@opentiny/vue-month-table': 3.10.0 + '@opentiny/vue-multi-select': 3.10.0 + '@opentiny/vue-nav-bar': 3.10.0 + '@opentiny/vue-nav-menu': 3.10.0 + '@opentiny/vue-notify': 3.10.0 + '@opentiny/vue-numeric': 3.10.0 + '@opentiny/vue-option': 3.10.0 + '@opentiny/vue-option-group': 3.10.0 + '@opentiny/vue-pager': 3.10.0 + '@opentiny/vue-pager-item': 3.10.0 + '@opentiny/vue-panel': 3.10.0 + '@opentiny/vue-picker': 3.10.0 + '@opentiny/vue-picker-column': 3.10.0 + '@opentiny/vue-pop-upload': 3.10.0 + '@opentiny/vue-popconfirm': 3.10.0 + '@opentiny/vue-popeditor': 3.10.0 + '@opentiny/vue-popover': 3.10.0 + '@opentiny/vue-popup': 3.10.0 + '@opentiny/vue-progress': 3.10.0 + '@opentiny/vue-pull-refresh': 3.10.0 + '@opentiny/vue-query-builder': 3.10.0 + '@opentiny/vue-radio': 3.10.0 + '@opentiny/vue-radio-button': 3.10.0 + '@opentiny/vue-radio-group': 3.10.0 + '@opentiny/vue-rate': 3.10.0 + '@opentiny/vue-record': 3.10.0 + '@opentiny/vue-recycle-scroller': 3.10.0 + '@opentiny/vue-river': 3.10.0 + '@opentiny/vue-roles': 3.10.0 + '@opentiny/vue-row': 3.10.0 + '@opentiny/vue-scroll-text': 3.10.0 + '@opentiny/vue-scrollbar': 3.10.0 + '@opentiny/vue-search': 3.10.1 + '@opentiny/vue-select': 3.10.1 + '@opentiny/vue-select-dropdown': 3.10.0 + '@opentiny/vue-select-mobile': 3.10.0 + '@opentiny/vue-select-view': 3.10.0 + '@opentiny/vue-selected-box': 3.10.0 + '@opentiny/vue-slide-bar': 3.10.0 + '@opentiny/vue-slider': 3.10.0 + '@opentiny/vue-slider-button': 3.10.0 + '@opentiny/vue-slider-button-group': 3.10.0 + '@opentiny/vue-split': 3.10.0 + '@opentiny/vue-standard-list-item': 3.10.0 + '@opentiny/vue-steps': 3.10.0 + '@opentiny/vue-svg-icon': 3.10.0 + '@opentiny/vue-switch': 3.10.0 + '@opentiny/vue-tab-item': 3.10.0 + '@opentiny/vue-tabbar': 3.10.0 + '@opentiny/vue-tabbar-item': 3.10.0 + '@opentiny/vue-table': 3.10.0 + '@opentiny/vue-tabs': 3.10.0 + '@opentiny/vue-tag': 3.10.0 + '@opentiny/vue-tag-group': 3.10.0 + '@opentiny/vue-text-popup': 3.10.0 + '@opentiny/vue-time': 3.10.0 + '@opentiny/vue-time-line': 3.10.0 + '@opentiny/vue-time-panel': 3.10.0 + '@opentiny/vue-time-picker': 3.10.0 + '@opentiny/vue-time-picker-mobile': 3.10.0 + '@opentiny/vue-time-range': 3.10.0 + '@opentiny/vue-time-select': 3.10.0 + '@opentiny/vue-time-spinner': 3.10.0 + '@opentiny/vue-timeline-item': 3.10.0 + '@opentiny/vue-toggle-menu': 3.10.0 + '@opentiny/vue-tooltip': 3.10.1 + '@opentiny/vue-top-box': 3.10.0 + '@opentiny/vue-transfer': 3.10.0 + '@opentiny/vue-transfer-panel': 3.10.0 + '@opentiny/vue-tree': 3.10.0 + '@opentiny/vue-tree-menu': 3.10.0 + '@opentiny/vue-upload': 3.10.0 + '@opentiny/vue-upload-dragger': 3.10.0 + '@opentiny/vue-upload-list': 3.10.0 + '@opentiny/vue-user': 3.10.0 + '@opentiny/vue-user-account': 3.10.0 + '@opentiny/vue-user-contact': 3.10.0 + '@opentiny/vue-user-head': 3.10.0 + '@opentiny/vue-user-head-group': 3.10.0 + '@opentiny/vue-user-link': 3.10.0 + '@opentiny/vue-wheel': 3.10.0 + '@opentiny/vue-wizard': 3.10.0 + '@opentiny/vue-year-range': 3.10.0 + '@opentiny/vue-year-table': 3.10.0 + transitivePeerDependencies: + - '@floating-ui/dom' + - echarts + dev: false + + /@opentiny/vue@3.11.2(@floating-ui/dom@1.6.3)(echarts@5.5.0): + resolution: {integrity: sha512-t3rODLe4oLZj7HTov9Hb+XCj54f0XaJBjbPoJqAvCLJ7p9JUqKuh1goaGV/L9GIvcro2gzBCbIuNheiUT3xr+A==} + dependencies: + '@opentiny/vue-action-menu': 3.11.0 + '@opentiny/vue-action-sheet': 3.11.0 + '@opentiny/vue-alert': 3.11.0 + '@opentiny/vue-amount': 3.11.0 + '@opentiny/vue-anchor': 3.11.0 + '@opentiny/vue-area': 3.11.0 + '@opentiny/vue-async-flowchart': 3.11.0 + '@opentiny/vue-autocomplete': 3.11.0 + '@opentiny/vue-autonavi-map': 3.11.0 + '@opentiny/vue-avatar': 3.11.0 + '@opentiny/vue-badge': 3.11.0 + '@opentiny/vue-baidu-map': 3.11.0 + '@opentiny/vue-breadcrumb': 3.11.0 + '@opentiny/vue-breadcrumb-item': 3.11.0 + '@opentiny/vue-bulletin-board': 3.11.0 + '@opentiny/vue-button': 3.11.0 + '@opentiny/vue-button-group': 3.11.0 + '@opentiny/vue-calendar': 3.11.0 + '@opentiny/vue-calendar-bar': 3.11.0 + '@opentiny/vue-calendar-view': 3.11.0 + '@opentiny/vue-card': 3.11.0 + '@opentiny/vue-card-group': 3.11.0 + '@opentiny/vue-card-template': 3.11.0 + '@opentiny/vue-carousel': 3.11.0 + '@opentiny/vue-carousel-item': 3.11.0 + '@opentiny/vue-cascader': 3.11.0 + '@opentiny/vue-cascader-menu': 3.11.0 + '@opentiny/vue-cascader-mobile': 3.11.0 + '@opentiny/vue-cascader-node': 3.11.0 + '@opentiny/vue-cascader-panel': 3.11.0 + '@opentiny/vue-cascader-select': 3.11.0 + '@opentiny/vue-cell': 3.11.0 + '@opentiny/vue-chart': 3.11.0 + '@opentiny/vue-chart-bar': 3.11.0 + '@opentiny/vue-chart-boxplot': 3.11.0 + '@opentiny/vue-chart-candle': 3.11.0 + '@opentiny/vue-chart-core': 3.11.0 + '@opentiny/vue-chart-funnel': 3.11.0 + '@opentiny/vue-chart-gauge': 3.11.0 + '@opentiny/vue-chart-graph': 3.11.0 + '@opentiny/vue-chart-heatmap': 3.11.0 + '@opentiny/vue-chart-histogram': 3.11.0 + '@opentiny/vue-chart-line': 3.11.0 + '@opentiny/vue-chart-liquidfill': 3.11.0(echarts@5.5.0) + '@opentiny/vue-chart-map': 3.11.0 + '@opentiny/vue-chart-pie': 3.11.0 + '@opentiny/vue-chart-radar': 3.11.0 + '@opentiny/vue-chart-ring': 3.11.0 + '@opentiny/vue-chart-sankey': 3.11.0 + '@opentiny/vue-chart-scatter': 3.11.0 + '@opentiny/vue-chart-sunburst': 3.11.0 + '@opentiny/vue-chart-tree': 3.11.0 + '@opentiny/vue-chart-waterfall': 3.11.0 + '@opentiny/vue-chart-wordcloud': 3.11.0(echarts@5.5.0) + '@opentiny/vue-checkbox': 3.11.0 + '@opentiny/vue-checkbox-button': 3.11.0 + '@opentiny/vue-checkbox-group': 3.11.0 + '@opentiny/vue-col': 3.11.0 + '@opentiny/vue-collapse': 3.11.0 + '@opentiny/vue-collapse-item': 3.11.0 + '@opentiny/vue-collapse-transition': 3.11.0 + '@opentiny/vue-color-picker': 3.11.1 + '@opentiny/vue-color-select-panel': 3.11.1 + '@opentiny/vue-column-list-group': 3.11.0 + '@opentiny/vue-column-list-item': 3.11.0 + '@opentiny/vue-company': 3.11.0 + '@opentiny/vue-config-provider': 3.11.0 + '@opentiny/vue-container': 3.11.0 + '@opentiny/vue-country': 3.11.0 + '@opentiny/vue-credit-card': 3.11.0 + '@opentiny/vue-credit-card-form': 3.11.0 + '@opentiny/vue-crop': 3.11.0 + '@opentiny/vue-currency': 3.11.0 + '@opentiny/vue-date-panel': 3.11.0 + '@opentiny/vue-date-picker': 3.11.1 + '@opentiny/vue-date-picker-mobile-first': 3.11.0 + '@opentiny/vue-date-range': 3.11.0 + '@opentiny/vue-date-table': 3.11.0 + '@opentiny/vue-dept': 3.11.0 + '@opentiny/vue-detail-page': 3.11.0 + '@opentiny/vue-dialog-box': 3.11.0 + '@opentiny/vue-dialog-select': 3.11.0 + '@opentiny/vue-divider': 3.11.0 + '@opentiny/vue-drawer': 3.11.0 + '@opentiny/vue-drop-roles': 3.11.0 + '@opentiny/vue-drop-times': 3.11.0 + '@opentiny/vue-dropdown': 3.11.1 + '@opentiny/vue-dropdown-item': 3.11.1 + '@opentiny/vue-dropdown-menu': 3.11.0 + '@opentiny/vue-dynamic-scroller': 3.11.0 + '@opentiny/vue-dynamic-scroller-item': 3.11.0 + '@opentiny/vue-espace': 3.11.0 + '@opentiny/vue-exception': 3.11.0 + '@opentiny/vue-fall-menu': 3.11.0 + '@opentiny/vue-file-upload': 3.11.1 + '@opentiny/vue-filter': 3.11.0 + '@opentiny/vue-filter-bar': 3.11.0 + '@opentiny/vue-filter-box': 3.11.0 + '@opentiny/vue-filter-panel': 3.11.0 + '@opentiny/vue-floatbar': 3.11.0 + '@opentiny/vue-floating-button': 3.11.0 + '@opentiny/vue-flowchart': 3.11.0 + '@opentiny/vue-form': 3.11.1 + '@opentiny/vue-form-item': 3.11.0 + '@opentiny/vue-fullscreen': 3.11.0 + '@opentiny/vue-grid': 3.11.2 + '@opentiny/vue-grid-column': 3.11.0 + '@opentiny/vue-grid-manager': 3.11.0 + '@opentiny/vue-grid-toolbar': 3.11.0 + '@opentiny/vue-guide': 3.11.0(@floating-ui/dom@1.6.3) + '@opentiny/vue-hrapprover': 3.11.0 + '@opentiny/vue-image': 3.11.1 + '@opentiny/vue-image-viewer': 3.11.1 + '@opentiny/vue-index-bar': 3.11.0 + '@opentiny/vue-index-bar-anchor': 3.11.0 + '@opentiny/vue-input': 3.11.0 + '@opentiny/vue-ip-address': 3.11.0 + '@opentiny/vue-layout': 3.11.0 + '@opentiny/vue-link': 3.11.0 + '@opentiny/vue-link-menu': 3.11.0 + '@opentiny/vue-list': 3.11.0 + '@opentiny/vue-loading': 3.11.0 + '@opentiny/vue-locales': 3.11.0 + '@opentiny/vue-logon-user': 3.11.0 + '@opentiny/vue-logout': 3.11.0 + '@opentiny/vue-message': 3.11.0 + '@opentiny/vue-milestone': 3.11.0 + '@opentiny/vue-mini-picker': 3.11.0 + '@opentiny/vue-modal': 3.11.0 + '@opentiny/vue-month-range': 3.11.0 + '@opentiny/vue-month-table': 3.11.0 + '@opentiny/vue-multi-select': 3.11.0 + '@opentiny/vue-nav-bar': 3.11.0 + '@opentiny/vue-nav-menu': 3.11.0 + '@opentiny/vue-notify': 3.11.0 + '@opentiny/vue-numeric': 3.11.0 + '@opentiny/vue-option': 3.11.1 + '@opentiny/vue-option-group': 3.11.0 + '@opentiny/vue-pager': 3.11.0 + '@opentiny/vue-pager-item': 3.11.0 + '@opentiny/vue-panel': 3.11.0 + '@opentiny/vue-picker': 3.11.0 + '@opentiny/vue-picker-column': 3.11.0 + '@opentiny/vue-pop-upload': 3.11.0 + '@opentiny/vue-popconfirm': 3.11.0 + '@opentiny/vue-popeditor': 3.11.0 + '@opentiny/vue-popover': 3.11.0 + '@opentiny/vue-popup': 3.11.0 + '@opentiny/vue-progress': 3.11.0 + '@opentiny/vue-pull-refresh': 3.11.0 + '@opentiny/vue-query-builder': 3.11.0 + '@opentiny/vue-radio': 3.11.0 + '@opentiny/vue-radio-button': 3.11.0 + '@opentiny/vue-radio-group': 3.11.0 + '@opentiny/vue-rate': 3.11.0 + '@opentiny/vue-record': 3.11.0 + '@opentiny/vue-recycle-scroller': 3.11.0 + '@opentiny/vue-rich-text-editor': 3.11.2 + '@opentiny/vue-river': 3.11.0 + '@opentiny/vue-roles': 3.11.0 + '@opentiny/vue-row': 3.11.0 + '@opentiny/vue-scroll-text': 3.11.0 + '@opentiny/vue-scrollbar': 3.11.0 + '@opentiny/vue-search': 3.11.0 + '@opentiny/vue-select': 3.11.0 + '@opentiny/vue-select-dropdown': 3.11.0 + '@opentiny/vue-select-mobile': 3.11.0 + '@opentiny/vue-select-view': 3.11.0 + '@opentiny/vue-selected-box': 3.11.0 + '@opentiny/vue-slide-bar': 3.11.0 + '@opentiny/vue-slider': 3.11.0 + '@opentiny/vue-slider-button': 3.11.0 + '@opentiny/vue-slider-button-group': 3.11.0 + '@opentiny/vue-split': 3.11.0 + '@opentiny/vue-standard-list-item': 3.11.0 + '@opentiny/vue-steps': 3.11.0 + '@opentiny/vue-svg-icon': 3.11.0 + '@opentiny/vue-switch': 3.11.0 + '@opentiny/vue-tab-item': 3.11.0 + '@opentiny/vue-tabbar': 3.11.1 + '@opentiny/vue-tabbar-item': 3.11.0 + '@opentiny/vue-table': 3.11.0 + '@opentiny/vue-tabs': 3.11.0 + '@opentiny/vue-tag': 3.11.0 + '@opentiny/vue-tag-group': 3.11.0 + '@opentiny/vue-text-popup': 3.11.0 + '@opentiny/vue-time': 3.11.0 + '@opentiny/vue-time-line': 3.11.1 + '@opentiny/vue-time-panel': 3.11.0 + '@opentiny/vue-time-picker': 3.11.0 + '@opentiny/vue-time-picker-mobile': 3.11.0 + '@opentiny/vue-time-range': 3.11.0 + '@opentiny/vue-time-select': 3.11.0 + '@opentiny/vue-time-spinner': 3.11.0 + '@opentiny/vue-timeline-item': 3.11.1 + '@opentiny/vue-toggle-menu': 3.11.0 + '@opentiny/vue-tooltip': 3.11.0 + '@opentiny/vue-top-box': 3.11.0 + '@opentiny/vue-transfer': 3.11.0 + '@opentiny/vue-transfer-panel': 3.11.0 + '@opentiny/vue-tree': 3.11.1 + '@opentiny/vue-tree-menu': 3.11.0 + '@opentiny/vue-upload': 3.11.0 + '@opentiny/vue-upload-dragger': 3.11.0 + '@opentiny/vue-upload-list': 3.11.0 + '@opentiny/vue-user': 3.11.0 + '@opentiny/vue-user-account': 3.11.0 + '@opentiny/vue-user-contact': 3.11.0 + '@opentiny/vue-user-head': 3.11.0 + '@opentiny/vue-user-head-group': 3.11.0 + '@opentiny/vue-user-link': 3.11.0 + '@opentiny/vue-wheel': 3.11.0 + '@opentiny/vue-wizard': 3.11.0 + '@opentiny/vue-year-range': 3.11.0 + '@opentiny/vue-year-table': 3.11.0 + transitivePeerDependencies: + - '@floating-ui/dom' + - echarts + dev: false + + /@parcel/watcher@2.0.4: + resolution: {integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.8.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@rollup/plugin-inject@5.0.5(rollup@2.79.1): + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + estree-walker: 2.0.2 + magic-string: 0.30.8 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/pluginutils@5.1.0(rollup@2.79.1): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@rushstack/eslint-patch@1.10.1: + resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==} + dev: true + + /@seald-io/binary-search-tree@1.0.3: + resolution: {integrity: sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==} + dev: false + + /@seald-io/nedb@4.0.4: + resolution: {integrity: sha512-CUNcMio7QUHTA+sIJ/DC5JzVNNsHe743TPmC4H5Gij9zDLMbmrCT2li3eVB72/gF63BPS8pWEZrjlAMRKA8FDw==} + dependencies: + '@seald-io/binary-search-tree': 1.0.3 + localforage: 1.10.0 + util: 0.12.5 + dev: false + + /@sigstore/bundle@1.1.0: + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/sign@1.0.0: + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true + + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@tufjs/canonical-json@1.0.0: + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@tufjs/models@1.0.4: + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.4 + dev: true + + /@types/antlr4@4.11.6: + resolution: {integrity: sha512-YtxtT6vYfLK6jC55zC4Pb2YwV6Z8exn4DbDlQgoSEc6VqlFZloi6bgm0AqZns/7U4XQCAVMhv/+vnGcfyCkPfg==} + dev: true + + /@types/antlr4@4.7.2: + resolution: {integrity: sha512-v6NASzZa4pUgO2QJJqGHTRRBfZDTOk2savuugSfCLatRTd2q+UtW0I7ub9mjzERhm7aWqGxBi886HnJkLYiIEA==} + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.18.13 + '@babel/types': 7.24.0 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/bcryptjs@2.4.6: + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + dev: true + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 18.16.12 + dev: true + + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.14 + dev: true + + /@types/chai@4.3.14: + resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 18.16.12 + dev: true + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + /@types/cookiejar@2.1.5: + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + dev: true + + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + dependencies: + '@types/node': 18.16.12 + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.7 + '@types/estree': 1.0.5 + dev: true + + /@types/eslint@8.56.7: + resolution: {integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/express-serve-static-core@4.17.43: + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + dependencies: + '@types/node': 18.16.12 + '@types/qs': 6.9.14 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.43 + '@types/qs': 6.9.14 + '@types/serve-static': 1.15.7 + dev: true + + /@types/formidable@1.2.8: + resolution: {integrity: sha512-6psvrUy5VDYb+yaPJReF1WrRsz+FBwyJutK9Twz1Efa27tm07bARNIkK2B8ZPWq80dXqpKfrxTO96xrtPp+AuA==} + dependencies: + '@types/node': 18.16.12 + dev: false + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 18.16.12 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@1.1.2: + resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.5.1: + resolution: {integrity: sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/jsonwebtoken@9.0.5: + resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} + dependencies: + '@types/node': 18.16.12 + dev: false + + /@types/methods@1.1.4: + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + dev: true + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: true + + /@types/node@18.16.12: + resolution: {integrity: sha512-tIRrjbY9C277MOfP8M3zjMIhtMlUJ6YVqkGgLjz+74jVsdf4/UjC6Hku4+1N0BS0qyC0JAS6tJLUk9H6JUKviQ==} + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: true + + /@types/prettier@1.19.1: + resolution: {integrity: sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==} + dev: true + + /@types/qs@6.9.14: + resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} + dev: true + + /@types/ramda@0.29.12: + resolution: {integrity: sha512-sgIEjpJhdQPB52gDF4aphs9nl0xe54CR22DPdWqT8gQHjZYmVApgA0R3/CpMbl0Y8az2TEZrPNL2zy0EvjbkLA==} + dependencies: + types-ramda: 0.29.10 + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 18.16.12 + dev: true + + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 18.16.12 + '@types/send': 0.17.4 + dev: true + + /@types/stack-utils@1.0.1: + resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/superagent@8.1.6: + resolution: {integrity: sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==} + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 18.16.12 + dev: true + + /@types/supertest@2.0.16: + resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + dependencies: + '@types/superagent': 8.1.6 + dev: true + + /@types/svgo@2.6.4: + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + dependencies: + '@types/node': 18.16.12 + dev: true + + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: true + + /@types/validator@13.11.9: + resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + + /@types/web-bluetooth@0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + dev: false + + /@types/web-bluetooth@0.0.20: + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + dev: false + + /@types/webidl-conversions@7.0.3: + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + /@types/whatwg-url@11.0.4: + resolution: {integrity: sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==} + dependencies: + '@types/webidl-conversions': 7.0.3 + dev: false + + /@types/whatwg-url@8.2.2: + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + dependencies: + '@types/node': 18.16.12 + '@types/webidl-conversions': 7.0.3 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@15.0.19: + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 18.16.12 + dev: true + optional: true + + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils@2.34.0(eslint@6.8.0)(typescript@5.4.3): + resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.15 + '@typescript-eslint/typescript-estree': 2.34.0(typescript@5.4.3) + eslint: 6.8.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.57.0 + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@2.34.0(typescript@5.4.3): + resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + debug: 4.3.4 + eslint-visitor-keys: 1.3.0 + glob: 7.2.3 + is-glob: 4.0.3 + lodash: 4.17.21 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.3) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@vitejs/plugin-vue-jsx@1.3.10: + resolution: {integrity: sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==} + engines: {node: '>=12.0.0'} + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + '@rollup/pluginutils': 4.2.1 + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.4) + hash-sum: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue-jsx@3.1.0(vite@4.5.3)(vue@3.4.21): + resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.4) + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vue: 3.4.21 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@2.3.4(vite@2.9.18)(vue@3.4.21): + resolution: {integrity: sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==} + engines: {node: '>=12.0.0'} + peerDependencies: + vite: ^2.5.10 + vue: ^3.2.25 + dependencies: + vite: 2.9.18 + vue: 3.4.21 + dev: true + + /@vitejs/plugin-vue@4.6.2(vite@4.5.3)(vue@3.2.45): + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vue: 3.2.45 + dev: true + + /@vitejs/plugin-vue@4.6.2(vite@4.5.3)(vue@3.4.21): + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vue: 3.4.21 + dev: true + + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + dependencies: + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.4.1 + dev: true + + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + dependencies: + '@vitest/utils': 0.34.6 + p-limit: 4.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + dependencies: + magic-string: 0.30.8 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /@vue/babel-helper-vue-transform-on@1.2.2: + resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} + + /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.18.13): + resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} + dependencies: + '@babel/helper-module-imports': 7.24.3 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.18.13) + '@babel/template': 7.24.0 + '@babel/traverse': 7.18.13 + '@babel/types': 7.24.0 + '@vue/babel-helper-vue-transform-on': 1.2.2 + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: false + + /@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.4): + resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + '@vue/babel-helper-vue-transform-on': 1.2.2 + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.4) + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.4): + resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/parser': 7.24.4 + '@vue/compiler-sfc': 3.4.21 + dev: true + + /@vue/compiler-core@3.2.45: + resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} + dependencies: + '@babel/parser': 7.18.13 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + source-map: 0.6.1 + + /@vue/compiler-core@3.4.21: + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + /@vue/compiler-dom@3.2.45: + resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} + dependencies: + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 + + /@vue/compiler-dom@3.4.21: + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + dependencies: + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 + + /@vue/compiler-sfc@3.2.45: + resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} + dependencies: + '@babel/parser': 7.18.13 + '@vue/compiler-core': 3.2.45 + '@vue/compiler-dom': 3.2.45 + '@vue/compiler-ssr': 3.2.45 + '@vue/reactivity-transform': 3.2.45 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.38 + source-map: 0.6.1 + + /@vue/compiler-sfc@3.4.21: + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + dependencies: + '@babel/parser': 7.24.4 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + estree-walker: 2.0.2 + magic-string: 0.30.8 + postcss: 8.4.38 + source-map-js: 1.2.0 + + /@vue/compiler-ssr@3.2.45: + resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} + dependencies: + '@vue/compiler-dom': 3.2.45 + '@vue/shared': 3.2.45 + + /@vue/compiler-ssr@3.4.21: + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + + /@vue/devtools-api@6.6.1: + resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} + dev: false + + /@vue/eslint-config-prettier@7.1.0(eslint@8.57.0)(prettier@2.7.1): + resolution: {integrity: sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==} + peerDependencies: + eslint: '>= 7.28.0' + prettier: '>= 2.0.0' + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.7.1) + prettier: 2.7.1 + dev: true + + /@vue/reactivity-transform@3.2.45: + resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} + dependencies: + '@babel/parser': 7.18.13 + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + magic-string: 0.25.9 + + /@vue/reactivity@3.2.45: + resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} + dependencies: + '@vue/shared': 3.2.45 + + /@vue/reactivity@3.4.21: + resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + dependencies: + '@vue/shared': 3.4.21 + + /@vue/repl@2.9.0: + resolution: {integrity: sha512-6gfklmJoQel9hNG2zdoyz/6WxgSJqhIx76vUUkXxegriTgkdKjBkRcm3khsW8FTkwMLkY6+NHaQPQRY6l7ovaA==} + dev: false + + /@vue/runtime-core@3.2.45: + resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} + dependencies: + '@vue/reactivity': 3.2.45 + '@vue/shared': 3.2.45 + + /@vue/runtime-core@3.4.21: + resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} + dependencies: + '@vue/reactivity': 3.4.21 + '@vue/shared': 3.4.21 + + /@vue/runtime-dom@3.2.45: + resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} + dependencies: + '@vue/runtime-core': 3.2.45 + '@vue/shared': 3.2.45 + csstype: 2.6.21 + + /@vue/runtime-dom@3.4.21: + resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} + dependencies: + '@vue/runtime-core': 3.4.21 + '@vue/shared': 3.4.21 + csstype: 3.1.3 + + /@vue/server-renderer@3.2.45(vue@3.2.45): + resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==} + peerDependencies: + vue: 3.2.45 + dependencies: + '@vue/compiler-ssr': 3.2.45 + '@vue/shared': 3.2.45 + vue: 3.2.45 + + /@vue/server-renderer@3.4.21(vue@3.4.21): + resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} + peerDependencies: + vue: 3.4.21 + dependencies: + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + vue: 3.4.21 + + /@vue/shared@3.2.45: + resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} + + /@vue/shared@3.4.21: + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} + + /@vueuse/components@10.9.0(vue@3.2.45): + resolution: {integrity: sha512-BHQpA0yIi3y7zKa1gYD0FUzLLkcRTqVhP8smnvsCK6GFpd94Nziq1XVPD7YpFeho0k5BzbBiNZF7V/DpkJ967A==} + dependencies: + '@vueuse/core': 10.9.0(vue@3.2.45) + '@vueuse/shared': 10.9.0(vue@3.2.45) + vue-demi: 0.14.7(vue@3.2.45) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/core@10.9.0(vue@3.2.45): + resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.9.0 + '@vueuse/shared': 10.9.0(vue@3.2.45) + vue-demi: 0.14.7(vue@3.2.45) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/core@9.13.0(vue@3.2.45): + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.2.45) + vue-demi: 0.14.7(vue@3.2.45) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@10.9.0: + resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} + dev: false + + /@vueuse/metadata@9.13.0: + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + dev: false + + /@vueuse/shared@10.9.0(vue@3.2.45): + resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} + dependencies: + vue-demi: 0.14.7(vue@3.2.45) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/shared@9.13.0(vue@3.2.45): + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + dependencies: + vue-demi: 0.14.7(vue@3.2.45) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + dev: true + + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + dev: true + + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /@yarnpkg/parsers@3.0.0-rc.46: + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} + dependencies: + js-yaml: 3.14.1 + tslib: 2.6.2 + dev: true + + /@zkochan/js-yaml@0.0.6: + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.11.3): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + + /acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: true + + /aggregate-error@1.0.0: + resolution: {integrity: sha512-7heCOdGepPfjajU0Hi8wJypLsZIB6AeDN/YzW+Mmy8QU7iaEW579WzA9cWbke3cGYwmBazCVL2Zzdhq+iQ6pBg==} + engines: {node: '>=4'} + dependencies: + clean-stack: 1.3.0 + indent-string: 3.2.0 + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + + /ansi-gray@0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /ansi-wrap@0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} + engines: {node: '>=0.10.0'} + dev: true + + /antlr4@4.8.0: + resolution: {integrity: sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg==} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /append-buffer@1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} + engines: {node: '>=0.10.0'} + dependencies: + buffer-equal: 1.0.1 + dev: true + + /append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-filter@1.1.2: + resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-map@2.0.2: + resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: true + + /array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + dev: true + + /array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + + /array-initial@1.1.0: + resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} + engines: {node: '>=0.10.0'} + dependencies: + array-slice: 1.1.0 + is-number: 4.0.0 + dev: true + + /array-last@1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 4.0.0 + dev: true + + /array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: true + + /array-sort@1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} + dependencies: + default-compare: 1.0.0 + get-value: 2.0.6 + kind-of: 5.1.0 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-done@1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + process-nextick-args: 2.0.1 + stream-exhaust: 1.0.2 + dev: true + + /async-each@1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + dev: true + + /async-mutex@0.4.1: + resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} + dependencies: + tslib: 2.6.2 + dev: true + + /async-settle@1.0.0: + resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} + engines: {node: '>= 0.10'} + dependencies: + async-done: 1.3.2 + dev: true + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: true + + /axios-cache-adapter@2.7.3(axios@0.27.2): + resolution: {integrity: sha512-A+ZKJ9lhpjthOEp4Z3QR/a9xC4du1ALaAsejgRGrH9ef6kSDxdFrhRpulqsh9khsEnwXxGfgpUuDp1YXMNMEiQ==} + peerDependencies: + axios: ~0.21.1 + dependencies: + axios: 0.27.2 + cache-control-esm: 1.0.0 + md5: 2.3.0 + dev: false + + /axios-mock-adapter@1.22.0(axios@0.27.2): + resolution: {integrity: sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==} + peerDependencies: + axios: '>= 0.17.0' + dependencies: + axios: 0.27.2 + fast-deep-equal: 3.1.3 + is-buffer: 2.0.5 + dev: false + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.6(debug@4.3.4) + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + dependencies: + follow-redirects: 1.15.6(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + dev: true + + /babel-core@7.0.0-bridge.0(@babel/core@7.18.13): + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + dev: true + + /babel-eslint@10.1.0(eslint@6.8.0): + resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.18.13 + '@babel/traverse': 7.18.13 + '@babel/types': 7.24.0 + eslint: 6.8.0 + eslint-visitor-keys: 1.3.0 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-eslint@10.1.0(eslint@7.32.0): + resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.18.13 + '@babel/traverse': 7.18.13 + '@babel/types': 7.24.0 + eslint: 7.32.0 + eslint-visitor-keys: 1.3.0 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-jest@25.5.1(@babel/core@7.18.13): + resolution: {integrity: sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==} + engines: {node: '>= 8.3'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 25.5.0(@babel/core@7.18.13) + chalk: 3.0.0 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-jest@29.7.0(@babel/core@7.18.13): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.18.13 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.18.13) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.24.0 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@25.5.0: + resolution: {integrity: sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.18.13): + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.18.13 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.18.13) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.18.13): + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.18.13) + core-js-compat: 3.36.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.18.13): + resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.18.13) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-preset-current-node-syntax@0.1.4(@babel/core@7.18.13): + resolution: {integrity: sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.13) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.13) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.13) + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.13): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.13) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.13) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.13) + dev: true + + /babel-preset-jest@25.5.0(@babel/core@7.18.13): + resolution: {integrity: sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==} + engines: {node: '>= 8.3'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + babel-plugin-jest-hoist: 25.5.0 + babel-preset-current-node-syntax: 0.1.4(@babel/core@7.18.13) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.18.13): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.13) + dev: true + + /babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + dev: false + + /bach@1.2.0: + resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} + engines: {node: '>= 0.10'} + dependencies: + arr-filter: 1.1.2 + arr-flatten: 1.1.0 + arr-map: 2.0.2 + array-each: 1.0.1 + array-initial: 1.1.0 + array-last: 1.3.0 + async-done: 1.3.2 + async-settle: 1.0.0 + now-and-later: 2.0.1 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + requiresBuild: true + dev: true + optional: true + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /batch-processor@1.0.0: + resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} + dev: false + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /bignumber.js@9.0.0: + resolution: {integrity: sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==} + dev: true + + /binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + + /bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browser-resolve@1.11.3: + resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} + dependencies: + resolve: 1.1.7 + dev: true + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001605 + electron-to-chromium: 1.4.726 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /bson@5.5.1: + resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} + engines: {node: '>=14.20.1'} + dev: true + + /bson@6.6.0: + resolution: {integrity: sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA==} + engines: {node: '>=16.20.1'} + dev: false + + /buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + dev: false + + /buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + dev: false + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + dev: true + + /buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + dev: true + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.6.0 + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + + /byte-size@8.1.1: + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.2.1 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.3 + glob: 10.3.12 + lru-cache: 7.18.3 + minipass: 7.0.4 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.5 + tar: 6.2.1 + unique-filename: 3.0.0 + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + dev: false + + /cache-control-esm@1.0.0: + resolution: {integrity: sha512-Fa3UV4+eIk4EOih8FTV6EEsVKO0W5XWtNs6FC3InTfVz+EjurjPfDXY5wZDo/lxjDxg5RjNcurLyxEJBcEUx9g==} + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /caniuse-lite@1.0.30001605: + resolution: {integrity: sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==} + + /capture-exit@2.0.0: + resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + rsvp: 4.8.5 + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.0: + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: 2.0.0 + async-each: 1.0.6 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + dependencies: + '@types/validator': 13.11.9 + libphonenumber-js: 1.10.59 + validator: 13.11.0 + + /clean-stack@1.3.0: + resolution: {integrity: sha512-4CCmhqt4yqbQQI9REDKCf+N6U3SToC5o7PoKCq4veHvr30TJ2Vmz1mYYF23VC0E7Z13tf4CXh9jXY0VC+Jtdng==} + engines: {node: '>=4'} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + dev: false + + /cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: true + + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + + /cmd-shim@6.0.1: + resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /co-body@5.2.0: + resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==} + dependencies: + inflation: 2.1.0 + qs: 6.12.0 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + /coalescy@1.0.0: + resolution: {integrity: sha512-OmRR46eVfyaXZYI7Ai5/vnLHjWhhh99sugx+UTsmVhwaYzARb+Tcdit59/HkVxF8KdqJG5NN8ClUhzQXS3Hh+w==} + dev: true + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /collection-map@1.0.0: + resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-map: 2.0.2 + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: true + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: true + + /columnify@1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /compressing@1.10.0: + resolution: {integrity: sha512-k2vpbZLaJoHe9euyUZjYYE8vOrbR19aU3HcWIYw5EBXiUs34ygfDVnXU+ubI41JXMriHutnoiu0ZFdwCkH6jPA==} + engines: {node: '>= 4.0.0'} + dependencies: + '@eggjs/yauzl': 2.11.0 + flushwritable: 1.0.0 + get-ready: 1.0.0 + iconv-lite: 0.5.2 + mkdirp: 0.5.6 + pump: 3.0.0 + streamifier: 0.1.1 + tar-stream: 1.6.2 + yazl: 2.5.1 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + + /concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-core@5.0.1: + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-parser: 4.0.0 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 3.0.0 + git-remote-origin-url: 2.0.0 + git-semver-tags: 5.0.1 + normalize-package-data: 3.0.3 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + dev: true + + /conventional-changelog-preset-loader@3.0.0: + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} + dev: true + + /conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.6.0 + split: 1.0.1 + dev: true + + /conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /conventional-recommended-bump@7.0.1: + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.1 + meow: 8.1.2 + dev: true + + /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==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true + + /cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + dev: true + + /cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /copy-props@2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} + dependencies: + each-props: 1.3.2 + is-plain-object: 5.0.0 + dev: true + + /core-js-compat@3.36.1: + resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + dependencies: + browserslist: 4.23.0 + dev: true + + /core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@8.3.6(typescript@5.4.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.4.3 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /create-jest@29.7.0(@types/node@18.16.12)(ts-node@10.9.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.16.12)(ts-node@10.9.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cropperjs@1.5.7: + resolution: {integrity: sha512-sGj+G/ofKh+f6A4BtXLJwtcKJgMUsXYVUubfTo9grERiDGXncttefmue/fyQFvn8wfdyoD1KhDRYLfjkJFl0yw==} + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + + /crypto-js@4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: false + + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + dev: false + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype@2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + dependencies: + es5-ext: 0.10.64 + type: 2.7.2 + dev: true + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + dev: true + + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.24.4 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge@1.3.2: + resolution: {integrity: sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==} + engines: {node: '>=0.10.0'} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-compare@1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 5.1.0 + dev: true + + /default-resolution@2.0.0: + resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} + engines: {node: '>= 0.10'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /diff-sequences@25.2.6: + resolution: {integrity: sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==} + engines: {node: '>= 8.3'} + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 4.0.2 + dev: true + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domready@1.0.8: + resolution: {integrity: sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA==} + dev: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.3.2: + resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: true + + /dt-python-parser@0.9.0: + resolution: {integrity: sha512-dU992G3TiGkUVRtemATPZEj3jXJwLCCYrkRfeX0n7czCV4XUaDbSyFhf3ue5/bWQuZl+Hnib0GKcbfDxMtzKTA==} + dependencies: + '@types/antlr4': 4.7.2 + antlr4: 4.8.0 + dev: false + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + dev: true + + /each-props@1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} + dependencies: + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /echarts-liquidfill@3.0.0(echarts@5.5.0): + resolution: {integrity: sha512-asBu62Zxpod9ZRYHweBoBvp7e+XtQbQoha19aTEJf2UptJJ2Bppcx8TdwQZnTjPM9s/yYD6Tk4/qcRqZ6s8HZA==} + peerDependencies: + echarts: ^5.0.1 + dependencies: + echarts: 5.5.0 + dev: false + + /echarts-wordcloud@2.0.0(echarts@5.5.0): + resolution: {integrity: sha512-K7l6pTklqdW7ZWzT/1CS0KhBSINr/cd7c5N1fVMzZMwLQHEwT7x+nivK7g5hkVh7WNcAv4Dn6/ZS5zMKRozC1g==} + peerDependencies: + echarts: ^5.0.1 + dependencies: + echarts: 5.5.0 + dev: false + + /echarts@5.2.1: + resolution: {integrity: sha512-OJ79b22eqRfbSV8vYmDKmA+XWfNbr0Uk/OafWcFNIGDWti2Uw9A6eVCiJLmqPa9Sk+EWL+t5v26aak0z3gxiZw==} + dependencies: + tslib: 2.3.0 + zrender: 5.2.1 + dev: false + + /echarts@5.4.1: + resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==} + dependencies: + tslib: 2.3.0 + zrender: 5.4.1 + dev: false + + /echarts@5.5.0: + resolution: {integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==} + dependencies: + tslib: 2.3.0 + zrender: 5.5.0 + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: true + + /electron-to-chromium@1.4.726: + resolution: {integrity: sha512-xtjfBXn53RORwkbyKvDfTajtnTp0OJoPOIBzXvkNbb7+YYvCHJflba3L7Txyx/6Fov3ov2bGPr/n5MTixmPhdQ==} + + /element-resize-detector@1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + dependencies: + batch-processor: 1.0.0 + dev: false + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /engine.io-client@6.5.3: + resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-parser: 5.2.2 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.2: + resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engines: {node: '>=10.0.0'} + + /engine.io@6.5.4: + resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engines: {node: '>=10.2.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 18.16.12 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.2.2 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /envinfo@7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + dev: true + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + dev: true + + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + dependencies: + d: 1.0.2 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + dev: true + + /esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@8.10.0(eslint@8.57.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-config-standard@14.1.1(eslint-plugin-import@2.29.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@4.3.1)(eslint-plugin-standard@4.1.0)(eslint@6.8.0): + resolution: {integrity: sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==} + peerDependencies: + eslint: '>=6.2.2' + eslint-plugin-import: '>=2.18.0' + eslint-plugin-node: '>=9.1.0' + eslint-plugin-promise: '>=4.2.1' + eslint-plugin-standard: '>=4.0.0' + dependencies: + eslint: 6.8.0 + eslint-plugin-import: 2.29.1(eslint@6.8.0) + eslint-plugin-node: 11.1.0(eslint@6.8.0) + eslint-plugin-promise: 4.3.1 + eslint-plugin-standard: 4.1.0(eslint@6.8.0) + dev: true + + /eslint-friendly-formatter@4.0.1: + resolution: {integrity: sha512-+EhkPwkl/nf/fxT60yXPLAMQ+thUzfJV5rCGdUDdyM+exO3NB+07dwWiZTuyuOtTo/Ckh7W/3LJvWsB214c7ag==} + engines: {node: '>=0.10.0'} + dependencies: + chalk: 2.4.2 + coalescy: 1.0.0 + extend: 3.0.2 + minimist: 1.2.8 + strip-ansi: 4.0.0 + text-table: 0.2.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7(supports-color@5.5.0) + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@6.8.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7(supports-color@5.5.0) + eslint: 6.8.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@7.32.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7(supports-color@5.5.0) + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es@3.0.1(eslint@6.8.0): + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 6.8.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-es@3.0.1(eslint@7.32.0): + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 7.32.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-html@6.2.0: + resolution: {integrity: sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g==} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /eslint-plugin-import@2.29.1(eslint@6.8.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7(supports-color@5.5.0) + doctrine: 2.1.0 + eslint: 6.8.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@6.8.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(eslint@7.32.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7(supports-color@5.5.0) + doctrine: 2.1.0 + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@7.32.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest@23.20.0(eslint@6.8.0)(typescript@5.4.3): + resolution: {integrity: sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==} + engines: {node: '>=8'} + peerDependencies: + eslint: '>=5' + dependencies: + '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@5.4.3) + eslint: 6.8.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-node@11.1.0(eslint@6.8.0): + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 6.8.0 + eslint-plugin-es: 3.0.1(eslint@6.8.0) + eslint-utils: 2.1.0 + ignore: 5.3.1 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 + dev: true + + /eslint-plugin-node@11.1.0(eslint@7.32.0): + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 7.32.0 + eslint-plugin-es: 3.0.1(eslint@7.32.0) + eslint-utils: 2.1.0 + ignore: 5.3.1 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.7.1): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + prettier: 2.7.1 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-promise@4.3.1: + resolution: {integrity: sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==} + engines: {node: '>=6'} + dev: true + + /eslint-plugin-promise@5.2.0(eslint@7.32.0): + resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.0.0 + dependencies: + eslint: 7.32.0 + dev: true + + /eslint-plugin-standard@4.1.0(eslint@6.8.0): + resolution: {integrity: sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 6.8.0 + dev: true + + /eslint-plugin-standard@4.1.0(eslint@7.32.0): + resolution: {integrity: sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 7.32.0 + dev: true + + /eslint-plugin-vue@7.20.0(eslint@7.32.0): + resolution: {integrity: sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==} + engines: {node: '>=8.10'} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 7.32.0 + eslint-utils: 2.1.0 + natural-compare: 1.4.0 + semver: 6.3.1 + vue-eslint-parser: 7.11.0(eslint@7.32.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-vue@8.7.1(eslint@8.57.0): + resolution: {integrity: sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.57.0 + eslint-utils: 3.0.0(eslint@8.57.0) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + vue-eslint-parser: 8.3.0(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-utils@1.4.3: + resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.57.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@6.8.0: + resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + hasBin: true + dependencies: + '@babel/code-frame': 7.24.2 + ajv: 6.12.6 + chalk: 2.4.2 + cross-spawn: 6.0.5 + debug: 4.3.4 + doctrine: 3.0.0 + eslint-scope: 5.1.1 + eslint-utils: 1.4.3 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + esquery: 1.5.0 + esutils: 2.0.3 + file-entry-cache: 5.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + inquirer: 7.3.3 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.21 + minimatch: 3.1.2 + mkdirp: 0.5.6 + natural-compare: 1.4.0 + optionator: 0.8.3 + progress: 2.0.3 + regexpp: 2.0.1 + semver: 6.3.1 + strip-ansi: 5.2.0 + strip-json-comments: 3.1.1 + table: 5.4.6 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + hasBin: true + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.6.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.2 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: true + + /espree@6.2.1: + resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} + engines: {node: '>=6.0.0'} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + dev: true + + /espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /exec-sh@0.3.6: + resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} + dev: true + + /execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@3.4.0: + resolution: {integrity: sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.0.0: + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.0 + human-signals: 2.1.0 + is-stream: 2.0.0 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /expect@25.5.0: + resolution: {integrity: sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + ansi-styles: 4.3.0 + jest-get-type: 25.2.6 + jest-matcher-utils: 25.5.0 + jest-message-util: 25.5.0 + jest-regex-util: 25.2.6 + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fancy-log@1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} + dependencies: + ansi-gray: 0.1.1 + color-support: 1.1.3 + parse-node-version: 1.0.1 + time-stamp: 1.1.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@1.1.4: + resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} + dev: true + + /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.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer2@1.2.0: + resolution: {integrity: sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==} + dependencies: + pend: 1.2.0 + dev: false + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@5.0.1: + resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} + engines: {node: '>=4'} + dependencies: + flat-cache: 2.0.1 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + + /file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + dev: false + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + dev: true + optional: true + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-package-json@1.2.0: + resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} + dev: true + + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /findup-sync@2.0.0: + resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 3.1.0 + micromatch: 3.1.0 + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /findup-sync@3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 3.1.0 + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /fined@1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + dev: true + + /flagged-respawn@1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + dev: true + + /flat-cache@2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} + dependencies: + flatted: 2.0.2 + rimraf: 2.6.3 + write: 1.0.3 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + + /flatted@2.0.2: + resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + /flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /flushwritable@1.0.0: + resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} + dev: false + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: true + + /follow-redirects@1.15.6(debug@4.3.4): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4 + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.82.1): + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + dependencies: + '@babel/code-frame': 7.24.2 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.6.0 + tapable: 2.2.1 + typescript: 4.9.5 + webpack: 5.82.1 + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /formidable@1.2.6: + resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} + deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' + dev: false + + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.12.0 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + dev: true + + /fs-mkdirp-stream@1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} + engines: {node: '>= 0.10'} + dependencies: + graceful-fs: 4.2.11 + through2: 2.0.5 + dev: true + + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + dev: true + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.19.0 + dev: true + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-ready@1.0.0: + resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==} + dev: false + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.0: + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /git-raw-commits@3.0.0: + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@5.0.1: + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 7.6.0 + dev: true + + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: true + + /git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-stream@6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} + engines: {node: '>= 0.10'} + dependencies: + extend: 3.0.2 + glob: 7.2.3 + glob-parent: 3.1.0 + is-negated-glob: 1.0.0 + ordered-read-streams: 1.0.1 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-trailing-separator: 1.1.0 + to-absolute-glob: 2.0.2 + unique-stream: 2.3.1 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob-watcher@5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} + dependencies: + anymatch: 2.0.0 + async-done: 1.3.2 + chokidar: 2.1.8 + is-negated-glob: 1.0.0 + just-debounce: 1.1.0 + normalize-path: 3.0.0 + object.defaults: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + + /glob@7.1.4: + resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.2 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@12.4.0: + resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.8.1 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /glogg@1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} + dependencies: + sparkles: 1.0.1 + dev: true + + /good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + dependencies: + delegate: 3.2.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + requiresBuild: true + dev: true + optional: true + + /gulp-cli@2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + ansi-colors: 1.1.0 + archy: 1.0.0 + array-sort: 1.0.0 + color-support: 1.1.3 + concat-stream: 1.6.2 + copy-props: 2.0.5 + fancy-log: 1.3.3 + gulplog: 1.0.0 + interpret: 1.4.0 + isobject: 3.0.1 + liftoff: 3.1.0 + matchdep: 2.0.0 + mute-stdout: 1.0.1 + pretty-hrtime: 1.0.3 + replace-homedir: 1.0.0 + semver-greatest-satisfied-range: 1.1.0 + v8flags: 3.2.0 + yargs: 7.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /gulp-eslint@6.0.0: + resolution: {integrity: sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==} + dependencies: + eslint: 6.8.0 + fancy-log: 1.3.3 + plugin-error: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /gulp-nodemon@2.5.0: + resolution: {integrity: sha512-vXfaP72xo2C6XOaXrNcLEM3QqDJ1x21S3x97U4YtzN2Rl2kH57++aFkAVxe6BafGRSTxs/xVfE/jNNlCv5Ym2Q==} + dependencies: + colors: 1.4.0 + gulp: 4.0.2 + nodemon: 2.0.22 + transitivePeerDependencies: + - supports-color + dev: true + + /gulp@4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + glob-watcher: 5.0.5 + gulp-cli: 2.3.0 + undertaker: 1.3.0 + vinyl-fs: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /gulplog@1.0.0: + resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} + engines: {node: '>= 0.10'} + dependencies: + glogg: 1.0.2 + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: true + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@3.0.8: + resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + lru-cache: 7.18.3 + dev: true + + /html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: true + + /humanize-number@0.0.2: + resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.5.2: + resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + optional: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minimatch: 5.1.6 + dev: true + + /ignore-walk@6.0.4: + resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.4 + dev: true + + /ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@3.2.0: + resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} + engines: {node: '>=4'} + dev: false + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /init-package-json@5.0.0: + resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-package-arg: 10.1.0 + promzard: 1.0.1 + read: 2.1.0 + read-package-json: 6.0.4 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + dev: true + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /inquirer@8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: true + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + dev: true + + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + dev: true + + /ip-regex@2.1.0: + resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} + engines: {node: '>=4'} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: true + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: true + + /is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.0: + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.18.13 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.18.13 + '@babel/parser': 7.18.13 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /jest-changed-files@25.5.0: + resolution: {integrity: sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + execa: 3.4.0 + throat: 5.0.0 + dev: true + + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-cli@25.5.4: + resolution: {integrity: sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==} + engines: {node: '>= 8.3'} + hasBin: true + dependencies: + '@jest/core': 25.5.4 + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + chalk: 3.0.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + is-ci: 2.0.0 + jest-config: 25.5.4 + jest-util: 25.5.0 + jest-validate: 25.5.0 + prompts: 2.4.2 + realpath-native: 2.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-cli@29.7.0(@types/node@18.16.12)(ts-node@10.9.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.16.12)(ts-node@10.9.2) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@18.16.12)(ts-node@10.9.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest-config@25.5.4: + resolution: {integrity: sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/core': 7.18.13 + '@jest/test-sequencer': 25.5.4 + '@jest/types': 25.5.0 + babel-jest: 25.5.1(@babel/core@7.18.13) + chalk: 3.0.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-environment-jsdom: 25.5.0 + jest-environment-node: 25.5.0 + jest-get-type: 25.2.6 + jest-jasmine2: 25.5.4 + jest-regex-util: 25.2.6 + jest-resolve: 25.5.1 + jest-util: 25.5.0 + jest-validate: 25.5.0 + micromatch: 4.0.5 + pretty-format: 25.5.0 + realpath-native: 2.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-config@29.7.0(@types/node@18.16.12)(ts-node@10.9.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.13 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + babel-jest: 29.7.0(@babel/core@7.18.13) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@18.16.12)(typescript@5.4.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-diff@25.5.0: + resolution: {integrity: sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==} + engines: {node: '>= 8.3'} + dependencies: + chalk: 3.0.0 + diff-sequences: 25.2.6 + jest-get-type: 25.2.6 + pretty-format: 25.5.0 + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@25.3.0: + resolution: {integrity: sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==} + engines: {node: '>= 8.3'} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@25.5.0: + resolution: {integrity: sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + chalk: 3.0.0 + jest-get-type: 25.2.6 + jest-util: 25.5.0 + pretty-format: 25.5.0 + dev: true + + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /jest-environment-jsdom@25.5.0: + resolution: {integrity: sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/environment': 25.5.0 + '@jest/fake-timers': 25.5.0 + '@jest/types': 25.5.0 + jest-mock: 25.5.0 + jest-util: 25.5.0 + jsdom: 15.2.1 + transitivePeerDependencies: + - bufferutil + - canvas + - utf-8-validate + dev: true + + /jest-environment-node@25.5.0: + resolution: {integrity: sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/environment': 25.5.0 + '@jest/fake-timers': 25.5.0 + '@jest/types': 25.5.0 + jest-mock: 25.5.0 + jest-util: 25.5.0 + semver: 6.3.1 + dev: true + + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /jest-get-type@25.2.6: + resolution: {integrity: sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==} + engines: {node: '>= 8.3'} + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@25.5.1: + resolution: {integrity: sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + '@types/graceful-fs': 4.1.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-serializer: 25.5.0 + jest-util: 25.5.0 + jest-worker: 25.5.0 + micromatch: 4.0.5 + sane: 4.1.0 + walker: 1.0.8 + which: 2.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.16.12 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-jasmine2@25.5.4: + resolution: {integrity: sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/traverse': 7.18.13 + '@jest/environment': 25.5.0 + '@jest/source-map': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + chalk: 3.0.0 + co: 4.6.0 + expect: 25.5.0 + is-generator-fn: 2.1.0 + jest-each: 25.5.0 + jest-matcher-utils: 25.5.0 + jest-message-util: 25.5.0 + jest-runtime: 25.5.4 + jest-snapshot: 25.5.1 + jest-util: 25.5.0 + pretty-format: 25.5.0 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-leak-detector@25.5.0: + resolution: {integrity: sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==} + engines: {node: '>= 8.3'} + dependencies: + jest-get-type: 25.2.6 + pretty-format: 25.5.0 + dev: true + + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-matcher-utils@25.5.0: + resolution: {integrity: sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==} + engines: {node: '>= 8.3'} + dependencies: + chalk: 3.0.0 + jest-diff: 25.5.0 + jest-get-type: 25.2.6 + pretty-format: 25.5.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@25.5.0: + resolution: {integrity: sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 25.5.0 + '@types/stack-utils': 1.0.1 + chalk: 3.0.0 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + slash: 3.0.0 + stack-utils: 1.0.5 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@25.5.0: + resolution: {integrity: sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + dev: true + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + jest-util: 29.7.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@25.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 25.5.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-regex-util@25.2.6: + resolution: {integrity: sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==} + engines: {node: '>= 8.3'} + dev: true + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@25.5.4: + resolution: {integrity: sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + jest-regex-util: 25.2.6 + jest-snapshot: 25.5.1 + dev: true + + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@25.5.1: + resolution: {integrity: sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + browser-resolve: 1.11.3 + chalk: 3.0.0 + graceful-fs: 4.2.11 + jest-pnp-resolver: 1.2.3(jest-resolve@25.5.1) + read-pkg-up: 7.0.1 + realpath-native: 2.0.0 + resolve: 1.22.8 + slash: 3.0.0 + dev: true + + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@25.5.4: + resolution: {integrity: sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/console': 25.5.0 + '@jest/environment': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + chalk: 3.0.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 25.5.4 + jest-docblock: 25.3.0 + jest-haste-map: 25.5.1 + jest-jasmine2: 25.5.4 + jest-leak-detector: 25.5.0 + jest-message-util: 25.5.0 + jest-resolve: 25.5.1 + jest-runtime: 25.5.4 + jest-util: 25.5.0 + jest-worker: 25.5.0 + source-map-support: 0.5.21 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@25.5.4: + resolution: {integrity: sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==} + engines: {node: '>= 8.3'} + hasBin: true + dependencies: + '@jest/console': 25.5.0 + '@jest/environment': 25.5.0 + '@jest/globals': 25.5.2 + '@jest/source-map': 25.5.0 + '@jest/test-result': 25.5.0 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + '@types/yargs': 15.0.19 + chalk: 3.0.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-config: 25.5.4 + jest-haste-map: 25.5.1 + jest-message-util: 25.5.0 + jest-mock: 25.5.0 + jest-regex-util: 25.2.6 + jest-resolve: 25.5.1 + jest-snapshot: 25.5.1 + jest-util: 25.5.0 + jest-validate: 25.5.0 + realpath-native: 2.0.0 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer@25.5.0: + resolution: {integrity: sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==} + engines: {node: '>= 8.3'} + dependencies: + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@25.5.1: + resolution: {integrity: sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==} + engines: {node: '>= 8.3'} + dependencies: + '@babel/types': 7.24.0 + '@jest/types': 25.5.0 + '@types/prettier': 1.19.1 + chalk: 3.0.0 + expect: 25.5.0 + graceful-fs: 4.2.11 + jest-diff: 25.5.0 + jest-get-type: 25.2.6 + jest-matcher-utils: 25.5.0 + jest-message-util: 25.5.0 + jest-resolve: 25.5.1 + make-dir: 3.1.0 + natural-compare: 1.4.0 + pretty-format: 25.5.0 + semver: 6.3.1 + dev: true + + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.18.13 + '@babel/generator': 7.18.13 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.18.13) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.18.13) + '@babel/types': 7.24.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.13) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@25.5.0: + resolution: {integrity: sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + chalk: 3.0.0 + graceful-fs: 4.2.11 + is-ci: 2.0.0 + make-dir: 3.1.0 + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@25.5.0: + resolution: {integrity: sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + camelcase: 5.3.1 + chalk: 3.0.0 + jest-get-type: 25.2.6 + leven: 3.1.0 + pretty-format: 25.5.0 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watcher@25.5.0: + resolution: {integrity: sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/test-result': 25.5.0 + '@jest/types': 25.5.0 + ansi-escapes: 4.3.2 + chalk: 3.0.0 + jest-util: 25.5.0 + string-length: 3.1.0 + dev: true + + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.16.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + + /jest-worker@25.5.0: + resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} + engines: {node: '>= 8.3'} + dependencies: + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.16.12 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.16.12 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.16.12 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@25.5.4: + resolution: {integrity: sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==} + engines: {node: '>= 8.3'} + hasBin: true + dependencies: + '@jest/core': 25.5.4 + import-local: 3.1.0 + jest-cli: 25.5.4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest@29.5.0(@types/node@18.16.12)(ts-node@10.9.2): + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.16.12)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + dev: true + + /jsdom@15.2.1: + resolution: {integrity: sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==} + engines: {node: '>=8'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 7.4.1 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + nwsapi: 2.2.7 + parse5: 5.1.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + saxes: 3.1.11 + symbol-tree: 3.2.4 + tough-cookie: 3.0.1 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 1.1.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonwebtoken@8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.2 + dev: false + + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.0 + dev: false + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /just-debounce@1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} + dev: true + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /kareem@2.6.0: + resolution: {integrity: sha512-B9wwgyKKKZkxYZXQzefvb/Ykh9eHixxR+ttTP2c/Pq8NvHi1iYIAImf3nj/DXkPcnenjGEffhPWXnCFRIbNAhw==} + engines: {node: '>=12.0.0'} + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /koa-body@4.2.0: + resolution: {integrity: sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==} + dependencies: + '@types/formidable': 1.2.8 + co-body: 5.2.0 + formidable: 1.2.6 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa-jwt@3.6.0: + resolution: {integrity: sha512-wNvqG+54oBUu3q1Wgm0/3rDRY+xXji1J2AVLERSTYe1ouv3bO+yERbxSSpbZTXkRKfSFnIL5ryE6elxQv/U1Nw==} + engines: {node: '>= 7.6.0'} + dependencies: + jsonwebtoken: 8.5.1 + koa-unless: 1.0.7 + p-any: 1.1.0 + dev: false + + /koa-logger@3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + dev: true + + /koa-router@8.0.8: + resolution: {integrity: sha512-2rNF2cgu/EWi/NV8GlBE5+H/QBoaof83X6Z0dULmalkbt7W610/lyP2EOLVqVrUUFfjsVWL/Ju5TVBcGJDY9XQ==} + engines: {node: '>= 8.0.0'} + deprecated: '**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173' + dependencies: + debug: 4.3.4 + http-errors: 1.8.1 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 1.8.0 + urijs: 1.19.11 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-send@3.3.0: + resolution: {integrity: sha512-5AH9ZrP8k9X13K5aAdyI+XPzqzKDMcM3omVgaWsTntQiZxIL9nkrvxgmjB8fmMXsNobvhIern21RNNSHCLSOeg==} + dependencies: + co: 4.6.0 + debug: 2.6.9 + mz: 2.7.0 + resolve-path: 1.4.0 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-static2@0.1.8: + resolution: {integrity: sha512-d+GFOi4Zjms4RR3DSl9XWsN3hWS1u2pdNHsOmVRplngYgJWSCIfWGOz9FxNLHzEftP++V+VulEUFDadGXyXuLA==} + dependencies: + babel-runtime: 6.26.0 + koa-send: 3.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-unless@1.0.7: + resolution: {integrity: sha512-NKiz+nk4KxSJFskiJMuJvxeA41Lcnx3d8Zy+8QETgifm4ab4aOeGD3RgR6bIz0FGNWwo3Fz0DtnK77mEIqHWxA==} + dev: false + + /koa@2.15.2: + resolution: {integrity: sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: true + + /last-run@1.1.1: + resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} + engines: {node: '>= 0.10'} + dependencies: + default-resolution: 2.0.0 + es6-weak-map: 2.0.3 + dev: true + + /lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.8 + dev: true + + /lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: true + + /lead@1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} + engines: {node: '>= 0.10'} + dependencies: + flush-write-stream: 1.1.1 + dev: true + + /lerna@7.4.2: + resolution: {integrity: sha512-gxavfzHfJ4JL30OvMunmlm4Anw7d7Tq6tdVHzUukLdS9nWnxCN/QB21qR+VJYp5tcyXogHKbdUEGh6qmeyzxSA==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@lerna/child-process': 7.4.2 + '@lerna/create': 7.4.2(typescript@5.4.3) + '@npmcli/run-script': 6.0.2 + '@nx/devkit': 16.10.0(nx@16.10.0) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 19.0.11 + byte-size: 8.1.1 + chalk: 4.1.0 + clone-deep: 4.0.1 + cmd-shim: 6.0.1 + columnify: 1.6.0 + conventional-changelog-angular: 7.0.0 + conventional-changelog-core: 5.0.1 + conventional-recommended-bump: 7.0.1 + cosmiconfig: 8.3.6(typescript@5.4.3) + dedent: 0.7.0 + envinfo: 7.8.1 + execa: 5.0.0 + fs-extra: 11.2.0 + get-port: 5.1.1 + get-stream: 6.0.0 + git-url-parse: 13.1.0 + glob-parent: 5.1.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + has-unicode: 2.0.1 + import-local: 3.1.0 + ini: 1.3.8 + init-package-json: 5.0.0 + inquirer: 8.2.6 + is-ci: 3.0.1 + is-stream: 2.0.0 + jest-diff: 29.7.0 + js-yaml: 4.1.0 + libnpmaccess: 7.0.2 + libnpmpublish: 7.3.0 + load-json-file: 6.2.0 + lodash: 4.17.21 + make-dir: 4.0.0 + minimatch: 3.0.5 + multimatch: 5.0.0 + node-fetch: 2.6.7 + npm-package-arg: 8.1.1 + npm-packlist: 5.1.1 + npm-registry-fetch: 14.0.5 + npmlog: 6.0.2 + nx: 16.10.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-pipe: 3.1.0 + p-queue: 6.6.2 + p-reduce: 2.1.0 + p-waterfall: 2.1.1 + pacote: 15.2.0 + pify: 5.0.0 + read-cmd-shim: 4.0.0 + read-package-json: 6.0.4 + resolve-from: 5.0.0 + rimraf: 4.4.1 + semver: 7.6.0 + signal-exit: 3.0.7 + slash: 3.0.0 + ssri: 9.0.1 + strong-log-transformer: 2.1.0 + tar: 6.1.11 + temp-dir: 1.0.0 + typescript: 5.4.3 + upath: 2.0.1 + uuid: 9.0.1 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 5.0.0 + write-file-atomic: 5.0.1 + write-pkg: 4.0.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bluebird + - debug + - encoding + - supports-color + dev: true + + /less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libnpmaccess@7.0.2: + resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /libnpmpublish@7.3.0: + resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ci-info: 3.9.0 + normalize-package-data: 5.0.0 + npm-package-arg: 10.1.0 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + semver: 7.6.0 + sigstore: 1.9.0 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /libphonenumber-js@1.10.59: + resolution: {integrity: sha512-HeTsOrDF/hWhEiKqZVwg9Cqlep5x2T+IYDENvT2VRj3iX8JQ7Y+omENv+AIn0vC8m6GYhivfCed5Cgfw27r5SA==} + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /liftoff@3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} + dependencies: + extend: 3.0.2 + findup-sync: 3.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.0.0 + debug: 4.3.4 + execa: 7.2.0 + lilconfig: 2.1.0 + listr2: 6.6.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 5.0.1 + rfdc: 1.3.1 + wrap-ansi: 8.1.0 + dev: true + + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lockfile@1.0.4: + resolution: {integrity: sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==} + dependencies: + signal-exit: 3.0.7 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.defaultsdeep@4.6.1: + resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} + dev: true + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 + dev: true + + /logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + dev: true + + /lolex@5.1.2: + resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + + /macos-release@2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} + engines: {node: '>=6'} + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.5.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + agentkeepalive: 4.5.0 + cacache: 17.1.4 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.4 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /matchdep@2.0.0: + resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} + engines: {node: '>= 0.10.0'} + dependencies: + findup-sync: 2.0.0 + micromatch: 3.1.0 + resolve: 1.22.8 + stack-trace: 0.0.10 + transitivePeerDependencies: + - supports-color + dev: true + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.5 + dev: true + + /memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + requiresBuild: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.4 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.0.5: + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mitt@1.1.2: + resolution: {integrity: sha512-3btxP0O9iGADGWAkteQ8mzDtEspZqu4I32y4GZYCV5BrwtzdcRpF4dQgNdJadCrbBx7Lu6Sq9AVrerMHR0Hkmw==} + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + dev: true + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /monaco-editor@0.33.0: + resolution: {integrity: sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==} + + /mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + dev: true + + /mongodb-connection-string-url@3.0.0: + resolution: {integrity: sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==} + dependencies: + '@types/whatwg-url': 11.0.4 + whatwg-url: 13.0.0 + dev: false + + /mongodb-memory-server-core@9.1.8: + resolution: {integrity: sha512-iCWwaP7De4lm1lRCUKB2ffUYr6GB0I/cj6fK0NV9dgwc9fA3xapHTTT/cPYRNx29M5gmAOSaOpUgjP7i2GZ/LQ==} + engines: {node: '>=14.20.1'} + dependencies: + async-mutex: 0.4.1 + camelcase: 6.3.0 + debug: 4.3.4 + find-cache-dir: 3.3.2 + follow-redirects: 1.15.6(debug@4.3.4) + https-proxy-agent: 7.0.4 + mongodb: 5.9.2 + new-find-package-json: 2.0.0 + semver: 7.6.0 + tar-stream: 3.1.7 + tslib: 2.6.2 + yauzl: 2.10.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - kerberos + - mongodb-client-encryption + - snappy + - supports-color + dev: true + + /mongodb-memory-server@9.1.8: + resolution: {integrity: sha512-QumPTOlWWWzgW6dtV4bf+ZFdTxenHSSGS4ZT85Vbb+FzPVoOtfcFwYlSfC9IM4e2nw7xvnQZvWtILYseO6HE9Q==} + engines: {node: '>=14.20.1'} + requiresBuild: true + dependencies: + mongodb-memory-server-core: 9.1.8 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - kerberos + - mongodb-client-encryption + - snappy + - supports-color + dev: true + + /mongodb@5.9.2: + resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} + engines: {node: '>=14.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.0.0 + kerberos: ^1.0.0 || ^2.0.0 + mongodb-client-encryption: '>=2.3.0 <3' + snappy: ^7.2.2 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + dependencies: + bson: 5.5.1 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.1 + optionalDependencies: + '@mongodb-js/saslprep': 1.1.5 + dev: true + + /mongodb@6.5.0: + resolution: {integrity: sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + dependencies: + '@mongodb-js/saslprep': 1.1.5 + bson: 6.6.0 + mongodb-connection-string-url: 3.0.0 + dev: false + + /mongoose@8.3.0: + resolution: {integrity: sha512-Y5QNnuA38CEin8hnA+q//nUVztIi4Xklu9xlmbkd1KdWHnIlemSwf5IL/evcI+e2zplL4g5Y6PMkO+nPSAnIdA==} + engines: {node: '>=16.20.1'} + dependencies: + bson: 6.6.0 + kareem: 2.6.0 + mongodb: 6.5.0 + mpath: 0.9.0 + mquery: 5.0.0 + ms: 2.1.3 + sift: 16.0.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + dev: false + + /mousetrap@1.6.5: + resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} + dev: false + + /mpath@0.9.0: + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} + dev: false + + /mquery@5.0.0: + resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} + engines: {node: '>=14.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multer@1.4.4-lts.1: + resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} + engines: {node: '>= 6.0.0'} + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + + /multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.0.5 + dev: true + + /mute-stdout@1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} + dev: true + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /mysql@2.18.1: + resolution: {integrity: sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==} + engines: {node: '>= 0.6'} + dependencies: + bignumber.js: 9.0.0 + readable-stream: 2.3.7 + safe-buffer: 5.1.2 + sqlstring: 2.3.1 + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + requiresBuild: true + dev: true + optional: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + sax: 1.3.0 + optional: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + + /node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + dev: true + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: true + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + dev: true + + /node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.0 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + dev: true + + /node-notifier@6.0.0: + resolution: {integrity: sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==} + requiresBuild: true + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 6.3.1 + shellwords: 0.1.1 + which: 1.3.1 + dev: true + optional: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.6.0 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.2 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.13.1 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /now-and-later@2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + dependencies: + once: 1.4.0 + dev: true + + /npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.6.0 + dev: true + + /npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.6.0 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-package-arg@8.1.1: + resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 3.0.8 + semver: 7.6.0 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-packlist@5.1.1: + resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.4 + dev: true + + /npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.6.0 + dev: true + + /npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.4 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /nx@16.10.0: + resolution: {integrity: sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg==} + hasBin: true + requiresBuild: true + peerDependencies: + '@swc-node/register': ^1.6.7 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + dependencies: + '@nrwl/tao': 16.10.0 + '@parcel/watcher': 2.0.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.0-rc.46 + '@zkochan/js-yaml': 0.0.6 + axios: 1.6.8 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.3.2 + dotenv-expand: 10.0.0 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 11.2.0 + glob: 7.1.4 + ignore: 5.3.1 + jest-diff: 29.7.0 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.4 + minimatch: 3.0.5 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + semver: 7.5.3 + string-width: 4.2.3 + strong-log-transformer: 2.1.0 + tar-stream: 2.2.0 + tmp: 0.2.3 + tsconfig-paths: 4.2.0 + tslib: 2.6.2 + v8-compile-cache: 2.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 16.10.0 + '@nx/nx-darwin-x64': 16.10.0 + '@nx/nx-freebsd-x64': 16.10.0 + '@nx/nx-linux-arm-gnueabihf': 16.10.0 + '@nx/nx-linux-arm64-gnu': 16.10.0 + '@nx/nx-linux-arm64-musl': 16.10.0 + '@nx/nx-linux-x64-gnu': 16.10.0 + '@nx/nx-linux-x64-musl': 16.10.0 + '@nx/nx-win32-arm64-msvc': 16.10.0 + '@nx/nx-win32-x64-msvc': 16.10.0 + transitivePeerDependencies: + - debug + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.reduce@1.0.1: + resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /ordered-read-streams@1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + dependencies: + readable-stream: 2.3.8 + dev: true + + /os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: true + + /os-name@4.0.1: + resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} + engines: {node: '>=10'} + dependencies: + macos-release: 2.5.1 + windows-release: 4.0.0 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-any@1.1.0: + resolution: {integrity: sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g==} + engines: {node: '>=4'} + dependencies: + p-some: 2.0.1 + dev: false + + /p-each-series@2.2.0: + resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} + engines: {node: '>=8'} + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-map-series@2.1.0: + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe@3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} + dev: true + + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + dev: true + + /p-some@2.0.1: + resolution: {integrity: sha512-f9CD3pAecrW6tH59pgqsuDmDNt5Hbb73qTxs1QNvtLuRe8/YyfeMMQ8H9aongmeGe/9pCXuwmupabHpjiEaF3A==} + engines: {node: '>=4'} + dependencies: + aggregate-error: 1.0.0 + dev: false + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /p-waterfall@2.1.1: + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} + dependencies: + p-reduce: 2.1.0 + dev: true + + /pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.4 + fs-minipass: 3.0.3 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.2 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.9.0 + ssri: 10.0.5 + tar: 6.2.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: true + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 + dev: true + + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 + dev: true + + /parse5@5.1.0: + resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /passthrough-counter@1.0.0: + resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + dev: true + + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: true + + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + dev: true + + /path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + dev: true + + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: false + + /path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: true + + /pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.6.1 + pathe: 1.1.2 + dev: true + + /plugin-error@1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} + dependencies: + ansi-colors: 1.1.0 + arr-diff: 4.0.0 + arr-union: 3.1.0 + extend-shallow: 3.0.2 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + /postcss-prefix-selector@1.16.0(postcss@5.2.18): + resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + /posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + dev: true + + /posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + dev: true + + /posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format@25.5.0: + resolution: {integrity: sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==} + engines: {node: '>= 8.3'} + dependencies: + '@jest/types': 25.5.0 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 16.13.1 + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + dev: true + + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /promzard@1.0.1: + resolution: {integrity: sha512-ulDF77aULEHUoJkN5XZgRV5loHXBaqd9eorMvLNLvi2gXMuRAtwH6Gh4zsMHQY1kTt7tyv/YZwZW5C2gtj8F2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + read: 3.0.1 + dev: true + + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true + optional: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + dev: true + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /ramda@0.29.1: + resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /read-cmd-shim@4.0.0: + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.1 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + glob: 10.3.12 + json-parse-even-better-errors: 3.0.1 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read@2.1.0: + resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + mute-stream: 1.0.0 + dev: true + + /read@3.0.1: + resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + mute-stream: 1.0.0 + dev: true + + /readable-stream@2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /realpath-native@2.0.0: + resolution: {integrity: sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==} + engines: {node: '>=8'} + dev: true + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-memory-server@0.10.0: + resolution: {integrity: sha512-D0CFfUzAOQv/64iYzRqxUs4MEV2LlaW227qDvuuiq2FR4FXLrxyfENFf7dj6v4IwGTcNSLxhDlNKQthYVncg3Q==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + dependencies: + camelcase: 6.3.0 + cross-spawn: 7.0.3 + debug: 4.3.4 + extract-zip: 2.0.1 + find-cache-dir: 3.3.2 + find-package-json: 1.2.0 + get-port: 5.1.1 + https-proxy-agent: 7.0.4 + lockfile: 1.0.4 + lodash.defaultsdeep: 4.6.1 + mkdirp: 3.0.1 + rimraf: 5.0.5 + semver: 7.6.0 + tar: 6.2.1 + tmp: 0.2.3 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + + /reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.24.4 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /regexpp@2.0.1: + resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} + engines: {node: '>=6.5.0'} + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /remove-bom-buffer@3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + is-utf8: 0.2.1 + dev: true + + /remove-bom-stream@1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} + engines: {node: '>= 0.10'} + dependencies: + remove-bom-buffer: 3.0.0 + safe-buffer: 5.2.1 + through2: 2.0.5 + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: true + + /replace-homedir@1.0.0: + resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + is-absolute: 1.0.0 + remove-trailing-separator: 1.1.0 + dev: true + + /request-promise-core@1.1.4(request@2.88.2): + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + dependencies: + lodash: 4.17.21 + request: 2.88.2 + dev: true + + /request-promise-native@1.0.9(request@2.88.2): + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-options@1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} + engines: {node: '>= 0.10'} + dependencies: + value-or-function: 3.0.0 + dev: true + + /resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + dev: false + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 9.3.5 + dev: true + + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.12 + dev: true + + /rollup-plugin-inject@3.0.2: + resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + dependencies: + estree-walker: 0.6.1 + magic-string: 0.25.9 + rollup-pluginutils: 2.8.2 + dev: true + + /rollup-plugin-node-polyfills@0.2.1: + resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} + dependencies: + rollup-plugin-inject: 3.0.2 + dev: true + + /rollup-plugin-polyfill-node@0.12.0(rollup@2.79.1): + resolution: {integrity: sha512-PWEVfDxLEKt8JX1nZ0NkUAgXpkZMTb85rO/Ru9AQ69wYW8VUCfDgP4CGRXXWYni5wDF0vIeR1UoF3Jmw/Lt3Ug==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@2.79.1) + rollup: 2.79.1 + dev: true + + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.24.2 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.30.3 + dev: true + + /rollup-plugin-visualizer@5.12.0(rollup@2.79.1): + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 2.79.1 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup@2.77.3: + resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + + /rsvp@4.8.5: + resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} + engines: {node: 6.* || >= 7.*} + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sane@4.1.0: + resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} + engines: {node: 6.* || 8.* || >= 10.*} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + '@cnakazawa/watch': 1.0.4 + anymatch: 2.0.0 + capture-exit: 2.0.0 + exec-sh: 0.3.6 + execa: 1.0.0 + fb-watchman: 2.0.2 + micromatch: 3.1.10 + minimist: 1.2.8 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + dev: true + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + requiresBuild: true + optional: true + + /saxes@3.1.11: + resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} + engines: {node: '>=8'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + + /semver-greatest-satisfied-range@1.1.0: + resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} + engines: {node: '>= 0.10'} + dependencies: + sver-compat: 1.5.0 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + requiresBuild: true + dev: true + optional: true + + /shepherd.js@11.0.1: + resolution: {integrity: sha512-K387AM8A0IbEje9ZRHIGOQHLzFkMoNtQlxZp5Rgw4FGnfReq8C4mPJHX6qA5OFKg+1atI7VjGonbJDzYEghd6Q==} + engines: {node: 12.* || 14.* || >= 16} + dependencies: + '@floating-ui/dom': 1.6.3 + deepmerge: 4.3.1 + dev: false + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + /sift@16.0.1: + resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} + dev: false + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 1.0.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socket.io-adapter@2.5.4: + resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} + dependencies: + debug: 4.3.4 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-client: 6.5.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4 + engine.io: 6.5.4 + socket.io-adapter: 2.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.8.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks@2.8.1: + resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + dev: true + + /sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sortablejs@1.15.2: + resolution: {integrity: sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==} + dev: false + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /sparkles@1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} + dev: true + + /sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + requiresBuild: true + dependencies: + memory-pager: 1.5.0 + + /spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + dev: true + + /sqlstring@2.3.1: + resolution: {integrity: sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==} + engines: {node: '>= 0.6'} + dev: true + + /ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + dev: true + + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + dev: true + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: true + + /stack-utils@1.0.5: + resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + dev: true + + /stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + dev: true + + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + dev: true + + /streamifier@0.1.1: + resolution: {integrity: sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==} + engines: {node: '>=0.10'} + dev: false + + /streamsaver@2.0.6: + resolution: {integrity: sha512-LK4e7TfCV8HzuM0PKXuVUfKyCB1FtT9L0EGxsFk5Up8njj0bXK8pJM9+Wq2Nya7/jslmCQwRK39LFm55h7NBTw==} + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + /streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + optionalDependencies: + bare-events: 2.2.2 + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-length@3.1.0: + resolution: {integrity: sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==} + engines: {node: '>=8'} + dependencies: + astral-regex: 1.0.0 + strip-ansi: 5.2.0 + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.3 + dev: true + + /strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.8 + through: 2.3.8 + dev: true + + /superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.4 + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 2.1.2 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.12.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /supertest@6.3.4: + resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} + engines: {node: '>=6.4.0'} + dependencies: + methods: 1.1.2 + superagent: 8.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /sver-compat@1.5.0: + resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + dev: true + + /svg-baker-runtime@1.4.7: + resolution: {integrity: sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==} + dependencies: + deepmerge: 1.3.2 + mitt: 1.1.2 + svg-baker: 1.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.0(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.8 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-sprite-loader@6.0.11: + resolution: {integrity: sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg==} + engines: {node: '>=6'} + dependencies: + bluebird: 3.7.2 + deepmerge: 1.3.2 + domready: 1.0.8 + escape-string-regexp: 1.0.5 + loader-utils: 1.4.2 + svg-baker: 1.7.0 + svg-baker-runtime: 1.4.7 + url-slug: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /table@5.4.6: + resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} + engines: {node: '>=6.0.0'} + dependencies: + ajv: 6.12.6 + lodash: 4.17.21 + slice-ansi: 2.1.0 + string-width: 3.1.0 + dev: true + + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tailwind-merge@1.14.0: + resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.16.1 + dev: true + + /tar@6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /temp-dir@1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser-webpack-plugin@5.3.10(webpack@5.82.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.30.3 + webpack: 5.82.1 + dev: true + + /terser-webpack-plugin@5.3.10(webpack@5.91.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.30.3 + webpack: 5.91.0 + dev: true + + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: true + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: true + + /through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + dependencies: + through2: 2.0.5 + xtend: 4.0.2 + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /time-stamp@1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} + engines: {node: '>=0.10.0'} + dev: true + + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-absolute-glob@2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} + engines: {node: '>=0.10.0'} + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + dev: true + + /to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /to-through@2.0.0: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} + engines: {node: '>= 0.10'} + dependencies: + through2: 2.0.5 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + dev: true + + /tough-cookie@3.0.1: + resolution: {integrity: sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==} + engines: {node: '>=6'} + dependencies: + ip-regex: 2.1.0 + psl: 1.9.0 + punycode: 2.3.1 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + dependencies: + punycode: 2.3.1 + dev: true + + /tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + dependencies: + punycode: 2.3.1 + dev: false + + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: true + + /ts-jest@29.1.0(@babel/core@7.18.13)(jest@29.5.0)(typescript@5.4.3): + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.18.13 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@18.16.12)(ts-node@10.9.2) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.0 + typescript: 5.4.3 + yargs-parser: 21.1.1 + dev: true + + /ts-loader@9.5.1(typescript@5.4.3)(webpack@5.91.0): + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.16.0 + micromatch: 4.0.5 + semver: 7.6.0 + source-map: 0.7.4 + typescript: 5.4.3 + webpack: 5.91.0 + dev: true + + /ts-node@10.9.2(@types/node@18.16.12)(typescript@5.4.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.16.12 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + dev: true + + /tsconfig-paths-webpack-plugin@4.0.1: + resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + engines: {node: '>=10.13.0'} + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.16.0 + tsconfig-paths: 4.2.0 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + + /tslib@2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + dev: false + + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /tsutils@3.21.0(typescript@5.4.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.4.3 + dev: true + + /tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.4 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.4.1: + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + /types-ramda@0.29.10: + resolution: {integrity: sha512-5PJiW/eiTPyXXBYGZOYGezMl6qj7keBiZheRwfjJZY26QPHsNrjfJnz0mru6oeqqoTHOni893Jfd6zyUXfQRWg==} + dependencies: + ts-toolbelt: 9.6.0 + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + dependencies: + '@lukeed/csprng': 1.1.0 + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /undertaker-registry@1.0.1: + resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} + engines: {node: '>= 0.10'} + dev: true + + /undertaker@1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} + dependencies: + arr-flatten: 1.1.0 + arr-map: 2.0.2 + bach: 1.2.0 + collection-map: 1.0.0 + es6-weak-map: 2.0.3 + fast-levenshtein: 1.1.4 + last-run: 1.1.1 + object.defaults: 1.1.0 + object.reduce: 1.0.1 + undertaker-registry: 1.0.1 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unidecode@0.1.8: + resolution: {integrity: sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA==} + engines: {node: '>= 0.4.12'} + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + dependencies: + json-stable-stringify-without-jsonify: 1.0.1 + through2-filter: 3.0.0 + dev: true + + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + dev: false + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-slug@2.0.0: + resolution: {integrity: sha512-aiNmSsVgrjCiJ2+KWPferjT46YFKoE8i0YX04BlMVDue022Xwhg/zYlnZ6V9/mP3p8Wj7LEp0myiTkC/p6sxew==} + dependencies: + unidecode: 0.1.8 + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + + /utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /v8-to-istanbul@4.1.4: + resolution: {integrity: sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==} + engines: {node: 8.x.x || >=10.10.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /v8flags@3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + dependencies: + builtins: 1.0.3 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + /value-or-function@3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} + engines: {node: '>= 0.10'} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vinyl-fs@3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + dependencies: + fs-mkdirp-stream: 1.0.0 + glob-stream: 6.1.0 + graceful-fs: 4.2.11 + is-valid-glob: 1.0.0 + lazystream: 1.0.1 + lead: 1.0.0 + object.assign: 4.1.5 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-bom-buffer: 3.0.0 + remove-bom-stream: 1.2.0 + resolve-options: 1.1.0 + through2: 2.0.5 + to-through: 2.0.0 + value-or-function: 3.0.0 + vinyl: 2.2.1 + vinyl-sourcemap: 1.1.0 + dev: true + + /vinyl-sourcemap@1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} + engines: {node: '>= 0.10'} + dependencies: + append-buffer: 1.0.2 + convert-source-map: 1.9.0 + graceful-fs: 4.2.11 + normalize-path: 2.1.1 + now-and-later: 2.0.1 + remove-bom-buffer: 3.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /vite-node@0.34.6(@types/node@18.16.12): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.6.1 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-plugin-css-injected-by-js@3.5.0(vite@4.5.3): + resolution: {integrity: sha512-d0QaHH9kS93J25SwRqJNEfE29PSuQS5jn51y9N9i2Yoq0FRO7rjuTeLvjM5zwklZlRrIn6SUdtOEDKyHokgJZg==} + peerDependencies: + vite: '>2.0.0-0' + dependencies: + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + dev: false + + /vite-plugin-monaco-editor@1.1.0(monaco-editor@0.33.0): + resolution: {integrity: sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==} + peerDependencies: + monaco-editor: '>=0.33.0' + dependencies: + monaco-editor: 0.33.0 + dev: true + + /vite-plugin-svg-icons@2.0.1(vite@4.5.3): + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.3.4 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@2.9.18: + resolution: {integrity: sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==} + engines: {node: '>=12.2.0'} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + dependencies: + esbuild: 0.14.54 + postcss: 8.4.38 + resolve: 1.22.8 + rollup: 2.77.3 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@4.5.3(@types/node@18.16.12)(less@4.2.0): + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.16.12 + esbuild: 0.18.20 + less: 4.2.0 + postcss: 8.4.38 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + + /vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.14 + '@types/chai-subset': 1.3.5 + '@types/node': 18.16.12 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.11.3 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.8 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.7.0 + vite: 4.5.3(@types/node@18.16.12)(less@4.2.0) + vite-node: 0.34.6(@types/node@18.16.12) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vue-clipboard3@2.0.0: + resolution: {integrity: sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==} + dependencies: + clipboard: 2.0.11 + dev: false + + /vue-demi@0.14.7(vue@3.2.45): + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.45 + dev: false + + /vue-demi@0.14.7(vue@3.4.21): + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.4.21 + dev: false + + /vue-draggable-next@2.1.0(sortablejs@1.15.2)(vue@3.2.45): + resolution: {integrity: sha512-xRMtOUxX/hYtY1C0irGJI1Opx9WRfQPwAqDR0qU3Tusa+iSxvTtiC3IQioU4THYmyior6V27rl0V8T3M19i/PA==} + peerDependencies: + sortablejs: ^1.14.0 + vue: ^3.2.2 + dependencies: + sortablejs: 1.15.2 + vue: 3.2.45 + vue-router: 4.3.0(vue@3.2.45) + dev: false + + /vue-eslint-parser@7.11.0(eslint@7.32.0): + resolution: {integrity: sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==} + engines: {node: '>=8.10'} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + debug: 4.3.4 + eslint: 7.32.0 + eslint-scope: 5.1.1 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-eslint-parser@8.3.0(eslint@8.57.0): + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + + /vue-i18n@9.11.0(vue@3.4.21): + resolution: {integrity: sha512-vU4gY6lu8Pdfs9BgKGiDAJmFDf88cceR47KcSB0VW4xJzUrXR/7qwqM7A8dQ2nedhoIDxoOm5Ro4pFd2KvJqbA==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': 9.11.0 + '@intlify/shared': 9.11.0 + '@vue/devtools-api': 6.6.1 + vue: 3.4.21 + dev: false + + /vue-i18n@9.2.2(vue@3.2.45): + resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} + engines: {node: '>= 14'} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': 9.2.2 + '@intlify/shared': 9.2.2 + '@intlify/vue-devtools': 9.2.2 + '@vue/devtools-api': 6.6.1 + vue: 3.2.45 + dev: false + + /vue-router@4.3.0(vue@3.2.45): + resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': 6.6.1 + vue: 3.2.45 + dev: false + + /vue@3.2.45: + resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} + dependencies: + '@vue/compiler-dom': 3.2.45 + '@vue/compiler-sfc': 3.2.45 + '@vue/runtime-dom': 3.2.45 + '@vue/server-renderer': 3.2.45(vue@3.2.45) + '@vue/shared': 3.2.45 + + /vue@3.4.21: + resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-sfc': 3.4.21 + '@vue/runtime-dom': 3.4.21 + '@vue/server-renderer': 3.4.21(vue@3.4.21) + '@vue/shared': 3.4.21 + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@1.1.2: + resolution: {integrity: sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==} + dependencies: + domexception: 1.0.1 + webidl-conversions: 4.0.2 + xml-name-validator: 3.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + /webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.82.1: + resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.5.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.82.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.5.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.91.0) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + dev: true + + /whatwg-url@13.0.0: + resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} + engines: {node: '>=16'} + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /windows-release@4.0.0: + resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + dev: true + + /winston-transport@4.7.0: + resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} + engines: {node: '>= 12.0.0'} + dependencies: + logform: 2.6.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: true + + /winston@3.13.0: + resolution: {integrity: sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.6.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.7.0 + dev: true + + /wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + + /write-json-file@3.2.0: + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.2.11 + make-dir: 2.1.0 + pify: 4.0.1 + sort-keys: 2.0.0 + write-file-atomic: 2.4.3 + dev: true + + /write-pkg@4.0.0: + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} + dependencies: + sort-keys: 2.0.0 + type-fest: 0.4.1 + write-json-file: 3.2.0 + dev: true + + /write@1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} + dependencies: + mkdirp: 0.5.6 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /xss@1.0.11: + resolution: {integrity: sha512-EimjrjThZeK2MO7WKR9mN5ZC1CSqivSl55wvUK5EtU6acf0rzEE1pN+9ZDrFXJ82BRp3JL38pPE6S4o/rpp1zQ==} + engines: {node: '>= 0.10.0'} + hasBin: true + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs-parser@5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + dependencies: + camelcase: 3.0.0 + object.assign: 4.1.5 + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yargs@7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + y18n: 3.2.2 + yargs-parser: 5.0.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yazl@2.5.1: + resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} + dependencies: + buffer-crc32: 0.2.13 + dev: false + + /ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zrender@5.2.1: + resolution: {integrity: sha512-M3bPGZuyLTNBC6LiNKXJwSCtglMp8XUEqEBG+2MdICDI3d1s500Y4P0CzldQGsqpRVB7fkvf3BKQQRxsEaTlsw==} + dependencies: + tslib: 2.3.0 + dev: false + + /zrender@5.4.1: + resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==} + dependencies: + tslib: 2.3.0 + dev: false + + /zrender@5.5.0: + resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==} + dependencies: + tslib: 2.3.0 + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..e74437c --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - ./dl-flow-backend + - ./dl-flow-frontend/** \ No newline at end of file diff --git a/public/3bb36ea8-b6cc-48ae-b227-1118f3b0a4c6.png b/public/3bb36ea8-b6cc-48ae-b227-1118f3b0a4c6.png new file mode 100644 index 0000000..5f4548c Binary files /dev/null and b/public/3bb36ea8-b6cc-48ae-b227-1118f3b0a4c6.png differ diff --git a/public/Snipaste_2024-03-24_21-37-53.png b/public/Snipaste_2024-03-24_21-37-53.png new file mode 100644 index 0000000..e657d3c Binary files /dev/null and b/public/Snipaste_2024-03-24_21-37-53.png differ diff --git a/public/sequenceDiagram.png b/public/sequenceDiagram.png new file mode 100644 index 0000000..68c9992 Binary files /dev/null and b/public/sequenceDiagram.png differ