diff --git a/.build_config/build.sh b/.build_config/build.sh new file mode 100644 index 0000000..836100d --- /dev/null +++ b/.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/.cid/lowcode-design-core.yml b/.cid/lowcode-design-core.yml new file mode 100644 index 0000000..de9333b --- /dev/null +++ b/.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/.codecheck/check.yml b/.codecheck/check.yml new file mode 100644 index 0000000..7ecb342 --- /dev/null +++ b/.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/.env.local b/.env.local new file mode 100644 index 0000000..a361a78 --- /dev/null +++ b/.env.local @@ -0,0 +1,5 @@ +SQL_HOST=localhost +SQL_PORT=3306 +SQL_USER=root +SQL_PASSWORD=admin +SQL_DATABASE=tiny_engine \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..997d732 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,9 @@ +.vscode +dist +public +package-lock.json +**/node_modules/** +tmp +temp +mockServer +packages/vue-generator/**/output/** diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..9d1f457 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +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: '^_' }] + } +} diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..b2afa90 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,81 @@ +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: input + id: project-name + attributes: + label: What is your project name + description: We also welcome you to fill in more detailed project information in the following issue [#334](https://github.com/opentiny/tiny-engine/issues/334). + placeholder: Please Input + validations: + required: true + - 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/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..157e35c --- /dev/null +++ b/.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-official), we will invite you to the WeChat discussion group later. diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..d864f3d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,31 @@ +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 + - type: input + id: project-name + attributes: + label: What is your project name + description: We also welcome you to fill in more detailed project information in the following issue [#334](https://github.com/opentiny/tiny-engine/issues/334). + placeholder: Please Input + validations: + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f4e2f22 --- /dev/null +++ b/.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/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md b/.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 0000000..6ceff4d --- /dev/null +++ b/.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/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..274543b --- /dev/null +++ b/.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/.github/workflows/ai-code-review.yml b/.github/workflows/ai-code-review.yml new file mode 100644 index 0000000..29777ff --- /dev/null +++ b/.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/.github/workflows/issue-translator.yml b/.github/workflows/issue-translator.yml new file mode 100644 index 0000000..8b3397b --- /dev/null +++ b/.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/.github/workflows/push-check.yml b/.github/workflows/push-check.yml new file mode 100644 index 0000000..7f0d4ed --- /dev/null +++ b/.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/.gitignore b/.gitignore new file mode 100644 index 0000000..3e3d94e --- /dev/null +++ b/.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/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..9179da3 --- /dev/null +++ b/.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/.npmignore b/.npmignore new file mode 100644 index 0000000..06d519d --- /dev/null +++ b/.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/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2f118da --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +dist +package-lock.json +**/node_modules/** \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d2baaec --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +semi: false +singleQuote: true +printWidth: 120 +trailingComma: 'none' +endOfLine: 'auto' \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3f29a69 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,17 @@ +# 更新日志 + +## v1.0.0-alpha.0 + +`2023/09/25` + +### 📢 破坏性变更 + +无 + +### ✨ 新特性 + +- 首个版本提交 + +### 🐞 缺陷修复 + +无 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..3070a8c --- /dev/null +++ b/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/CONTRIBUTING.zh-CN.md b/CONTRIBUTING.zh-CN.md new file mode 100644 index 0000000..6729ec5 --- /dev/null +++ b/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/LICENSE b/LICENSE new file mode 100644 index 0000000..91221a7 --- /dev/null +++ b/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/README.md b/README.md index 19869b4..57af470 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,108 @@ -# lowcode-design-core +

+ + OpenTiny Logo + +

+

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.

+ +English | [简体中文](README.zh-CN.md) + +🌈 Features: + +- Cross-end cross-frame front-end components +- Supports online real-time construction, secondary development, or being integrated. +- Directly generate deployable source code without engine support. +- Allows access to third-party components and customized extension plug-ins. +- Supports high-code and low-code, and hybrid development and deployment of applications. +- The platform accesses AI big model capabilities to help developers build applications. + +## Documentation + +- intro:https://opentiny.design/tiny-engine#/home +- tutorial:https://opentiny.design/tiny-engine#/help-center/course/engine +- playground:https://opentiny.design/tiny-engine#/tiny-engine-editor + +## Development + +### Dependencies required for installation + +```sh +$ pnpm install +``` + +### Local development: Start the local mock server and use the mock data of the local mock server. + +```sh +$ pnpm dev +``` + +## Local development, directly connected to the local tiny-engine-webservice server + +1. Start tiny-engine-data-center + +2. Start tiny-engine-webservice + +3. Modify the origin value in `vite.config.js` in the `packages/design-core/` directory of the tiny-engine project to be the address port of your local webService project (the webService port defaults to 7011), such as: + +Modify port + + +### Materials Synchronization [Solution](https://opentiny.design/tiny-engine#/help-center/course/engine/56) + +```sh +$ pnpm splitMaterials +``` + +```sh +$ pnpm buildMaterials +``` + +Open a browser: `http://localhost:8080/?type=app&id=918&tenant=1&pageid=NTJ4MjvqoVj8OVsc` +`url search` Parameters: + +- `type=app` Application type +- `id=xxx` Application ID +- `tenant=xxx` Organization ID +- `pageid=xxx` Page ID + +## Build + +```sh +# Build all plug-ins first +pnpm build:plugin + +# Build Designer +pnpm build:alpha or build:prod + +``` +The folder where the product is located after building +``` + tiny-engine/packages/design-core/dist/ +``` + +## Milestones + +```mermaid +gantt +dateFormat YYYY-MM-DD +axisFormat %Y-%m-%d + + 1.0.0-beta.x version :active,2023-09-25, 2024-03-31 + 1.0.0-rc version : 2024-04-01, 2024-06-30 + 1.0.0 version : 2024-07-01, 2024-07-31 + +``` + +## 🤝 Participation and Contribution + +If you are interested in our open source project, please join us! 🎉 + +Please read the [Contribution Guide](CONTRIBUTING.md) before participating in the contribution. + +- Add official assistant WeChat opentiny-official and join the technical exchange group +- Join the mailing list opentiny@googlegroups.com + +## License + +[MIT](LICENSE) diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..747f286 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,108 @@ +

+ + OpenTiny Logo + +

+ +

TinyEngine低代码引擎使能开发者定制低代码平台,支持在线实时构建低码平台,支持二次开发或集成低码平台能力

+ +[English](README.md) | 简体中文 + +🌈 特性: + +- 跨端跨框架前端组件 +- 支持在线实时构建、支持二次开发或被集成 +- 直接生成可部署的源码,运行时无需引擎支撑 +- 允许接入第三方组件、允许定制扩展插件 +- 支持高代码与低代码,混合开发部署应用 +- 平台接入 AI 大模型能力,辅助开发者构建应用 + +## 文档 + +- 介绍:https://opentiny.design/tiny-engine#/home +- 使用文档:https://opentiny.design/tiny-engine#/help-center/course/engine +- 演示应用:https://opentiny.design/tiny-engine#/tiny-engine-editor + +## 开发 + +### 安装所需的依赖 + +```sh +$ pnpm install +``` + +### 本地开发,启动本地 mock 服务器,使用本地 mock 服务器的 mock 数据 + +```sh +$ pnpm dev +``` + +### 本地开发,直连本地的tiny-engine-webservice服务端 + +1. 启动 tiny-engine-data-center + +2. 启动 tiny-engine-webservice + +3. 修改 tiny-engine 项目 `packages/design-core/` 目录下 `vite.config.js` 中origin的值为自己本地webService项目的地址端口(webService端口默认为7011),如: + +修改端口 + + +### 物料同步[方案](https://opentiny.design/tiny-engine#/help-center/course/engine/56) + +```sh +$ pnpm splitMaterials +``` + +```sh +$ pnpm buildMaterials +``` + +浏览器打开:`http://localhost:8080/?type=app&id=918&tenant=1&pageid=NTJ4MjvqoVj8OVsc` +`url search`参数: + +- `type=app` 应用类型 +- `id=xxx` 应用 ID +- `tenant=xxx` 组织 ID +- `pageid=xxx` 页面 ID + +## 构建 + +```sh +# 先构建所有插件 +pnpm run build:plugin + +# 构建设计器 +pnpm run build:alpha 或 build:prod + +``` +构建后产物所在文件夹 +``` + tiny-engine/packages/design-core/dist/ +``` + +## 里程碑 + +```mermaid +gantt +dateFormat YYYY-MM-DD +axisFormat %Y-%m-%d + + 1.0.0-beta.x version :active,2023-09-25, 2024-03-31 + 1.0.0-rc version : 2024-04-01, 2024-06-30 + 1.0.0 version : 2024-07-01, 2024-07-31 + +``` + +## 🤝 参与贡献 + +如果你对我们的开源项目感兴趣,欢迎加入我们!🎉 + +参与贡献之前请先阅读[贡献指南](CONTRIBUTING.zh-CN.md)。 + +- 添加官方小助手微信 opentiny-official,加入技术交流群 +- 加入邮件列表 opentiny@googlegroups.com + +## 开源协议 + +[MIT](LICENSE) diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..c366326 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,73 @@ +{ + "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/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"] + } + }, + "include": ["packages/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/lerna.json b/lerna.json new file mode 100644 index 0000000..74c0687 --- /dev/null +++ b/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/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 0000000..d673344 --- /dev/null +++ b/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/logo.svg b/logo.svg new file mode 100644 index 0000000..59d1b06 --- /dev/null +++ b/logo.svg @@ -0,0 +1,44 @@ + + + logo-top + + + + + + + + + + + + + + + + + + + + + + + + + + + + OpenTiny + + + + + + + + + + + + + \ No newline at end of file diff --git a/mockServer/.babelrc b/mockServer/.babelrc new file mode 100644 index 0000000..f9f35a2 --- /dev/null +++ b/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/mockServer/.editorconfig b/mockServer/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/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/mockServer/.eslintignore b/mockServer/.eslintignore new file mode 100644 index 0000000..e59172b --- /dev/null +++ b/mockServer/.eslintignore @@ -0,0 +1,3 @@ +build/*.js +assets/*.js +test/**/*.js \ No newline at end of file diff --git a/mockServer/.eslintrc.js b/mockServer/.eslintrc.js new file mode 100644 index 0000000..997ea0e --- /dev/null +++ b/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/mockServer/.gitignore b/mockServer/.gitignore new file mode 100644 index 0000000..89e6609 --- /dev/null +++ b/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/mockServer/.jsbeautifyrc b/mockServer/.jsbeautifyrc new file mode 100644 index 0000000..f4b0e8c --- /dev/null +++ b/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/mockServer/assets/css/0.1.20/index.css b/mockServer/assets/css/0.1.20/index.css new file mode 100644 index 0000000..9a0397a --- /dev/null +++ b/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/mockServer/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg b/mockServer/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg new file mode 100644 index 0000000..f5ef058 Binary files /dev/null and b/mockServer/assets/images/0055f57e0a38d45ced54e1b2b566cb29_308x180.jpg differ diff --git a/mockServer/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png b/mockServer/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png new file mode 100644 index 0000000..8c3fd36 Binary files /dev/null and b/mockServer/assets/images/0cfe4680-dd6c-11ec-a115-b53bbc5cfe9d.png differ diff --git a/mockServer/assets/images/120.jpg b/mockServer/assets/images/120.jpg new file mode 100644 index 0000000..cf9b61d Binary files /dev/null and b/mockServer/assets/images/120.jpg differ diff --git a/mockServer/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png b/mockServer/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png new file mode 100644 index 0000000..3290557 Binary files /dev/null and b/mockServer/assets/images/24b520f0-dd5d-11ec-9e28-e51c91ead705.png differ diff --git a/mockServer/assets/images/27f7f9d26edd98f6bb1ed8d594d408d9_100x100.jpg b/mockServer/assets/images/27f7f9d26edd98f6bb1ed8d594d408d9_100x100.jpg new file mode 100644 index 0000000..157b258 Binary files /dev/null and b/mockServer/assets/images/27f7f9d26edd98f6bb1ed8d594d408d9_100x100.jpg differ diff --git a/mockServer/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg b/mockServer/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg new file mode 100644 index 0000000..8280a90 Binary files /dev/null and b/mockServer/assets/images/627366463067fa2f1a59d7db4ac55885_308x100.jpg differ diff --git a/mockServer/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg b/mockServer/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg new file mode 100644 index 0000000..c7bf5fa Binary files /dev/null and b/mockServer/assets/images/777aad0c570f653f0a95b48b898c7b4b_308x180.jpg differ diff --git a/mockServer/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png b/mockServer/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png new file mode 100644 index 0000000..5fca3ce Binary files /dev/null and b/mockServer/assets/images/bbb35cd0-db30-11ec-a1c4-7b3b3de0a1d8.png differ diff --git a/mockServer/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png b/mockServer/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png new file mode 100644 index 0000000..8c3fd36 Binary files /dev/null and b/mockServer/assets/images/e4f27d446aef8318e4b4989f1f816b1e_220x220.png differ diff --git a/mockServer/assets/images/f750dc319828b039af713c643aad02bd_222x134.png b/mockServer/assets/images/f750dc319828b039af713c643aad02bd_222x134.png new file mode 100644 index 0000000..32659ba Binary files /dev/null and b/mockServer/assets/images/f750dc319828b039af713c643aad02bd_222x134.png differ diff --git a/mockServer/assets/images/logo.png b/mockServer/assets/images/logo.png new file mode 100644 index 0000000..6271b2d Binary files /dev/null and b/mockServer/assets/images/logo.png differ diff --git a/mockServer/assets/js/1005web-components.es.js b/mockServer/assets/js/1005web-components.es.js new file mode 100644 index 0000000..689d20a --- /dev/null +++ b/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/mockServer/assets/js/1005web-components.umd.js b/mockServer/assets/js/1005web-components.umd.js new file mode 100644 index 0000000..049e296 --- /dev/null +++ b/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/mockServer/assets/js/1505web-components.es.js b/mockServer/assets/js/1505web-components.es.js new file mode 100644 index 0000000..1d33e4e --- /dev/null +++ b/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/mockServer/assets/js/1505web-components.umd.js b/mockServer/assets/js/1505web-components.umd.js new file mode 100644 index 0000000..baf6863 --- /dev/null +++ b/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/mockServer/assets/js/989web-components.es.js b/mockServer/assets/js/989web-components.es.js new file mode 100644 index 0000000..338fa19 --- /dev/null +++ b/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/mockServer/assets/js/989web-components.umd.js b/mockServer/assets/js/989web-components.umd.js new file mode 100644 index 0000000..b98d7d8 --- /dev/null +++ b/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/mockServer/assets/js/998web-components.es.js b/mockServer/assets/js/998web-components.es.js new file mode 100644 index 0000000..173aa17 --- /dev/null +++ b/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/mockServer/assets/js/998web-components.umd.js b/mockServer/assets/js/998web-components.umd.js new file mode 100644 index 0000000..312b59e --- /dev/null +++ b/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/mockServer/assets/json/bundle.json b/mockServer/assets/json/bundle.json new file mode 100644 index 0000000..95c91c0 --- /dev/null +++ b/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": "TabItem", + "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": "BreadcrumbItem", + "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/mockServer/assets/uploads/.gitkeep b/mockServer/assets/uploads/.gitkeep new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/mockServer/assets/uploads/.gitkeep @@ -0,0 +1 @@ +1 diff --git a/mockServer/build/dev-server.js b/mockServer/build/dev-server.js new file mode 100644 index 0000000..f32a8a0 --- /dev/null +++ b/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/mockServer/config/config.js b/mockServer/config/config.js new file mode 100644 index 0000000..dcd70e9 --- /dev/null +++ b/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/mockServer/gulpfile.js b/mockServer/gulpfile.js new file mode 100644 index 0000000..c49d674 --- /dev/null +++ b/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/mockServer/logs/out.log b/mockServer/logs/out.log new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/mockServer/logs/out.log @@ -0,0 +1 @@ +ok diff --git a/mockServer/package.json b/mockServer/package.json new file mode 100644 index 0000000..7b51d4d --- /dev/null +++ b/mockServer/package.json @@ -0,0 +1,69 @@ +{ + "name": "@opentiny/tiny-engine-mock", + "version": "1.0.3", + "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.3", + "@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/mockServer/pm2.js b/mockServer/pm2.js new file mode 100644 index 0000000..b4de90c --- /dev/null +++ b/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/mockServer/src/app.js b/mockServer/src/app.js new file mode 100644 index 0000000..26c5b34 --- /dev/null +++ b/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/mockServer/src/database/blockCategories.db b/mockServer/src/database/blockCategories.db new file mode 100644 index 0000000..85744f5 --- /dev/null +++ b/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/mockServer/src/database/blockGroups.db b/mockServer/src/database/blockGroups.db new file mode 100644 index 0000000..fe904aa --- /dev/null +++ b/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/mockServer/src/database/blocks.db b/mockServer/src/database/blocks.db new file mode 100644 index 0000000..387c640 --- /dev/null +++ b/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,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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":{}},"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/mockServer/src/database/defaultData/default.db b/mockServer/src/database/defaultData/default.db new file mode 100644 index 0000000..e9fbf49 --- /dev/null +++ b/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/mockServer/src/database/pages.db b/mockServer/src/database/pages.db new file mode 100644 index 0000000..103c886 --- /dev/null +++ b/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/mockServer/src/middleware/ErrorRoutesCatch.js b/mockServer/src/middleware/ErrorRoutesCatch.js new file mode 100644 index 0000000..b1d4244 --- /dev/null +++ b/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/mockServer/src/mock/get/app-center/apps/detail/918.json b/mockServer/src/mock/get/app-center/apps/detail/918.json new file mode 100644 index 0000000..efd46d5 --- /dev/null +++ b/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/mockServer/src/mock/get/app-center/apps/extension/delete.json b/mockServer/src/mock/get/app-center/apps/extension/delete.json new file mode 100644 index 0000000..a41dcbb --- /dev/null +++ b/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/mockServer/src/mock/get/app-center/apps/extension/list.json b/mockServer/src/mock/get/app-center/apps/extension/list.json new file mode 100644 index 0000000..d3f2008 --- /dev/null +++ b/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/mockServer/src/mock/get/app-center/i18n/entries.json b/mockServer/src/mock/get/app-center/i18n/entries.json new file mode 100644 index 0000000..84127ff --- /dev/null +++ b/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/mockServer/src/mock/get/app-center/source_tpl.json b/mockServer/src/mock/get/app-center/source_tpl.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/get/app-center/source_tpl.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/get/app-center/sources/list/918.json b/mockServer/src/mock/get/app-center/sources/list/918.json new file mode 100644 index 0000000..6329279 --- /dev/null +++ b/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/mockServer/src/mock/get/app-center/v1/apps/schema/918.json b/mockServer/src/mock/get/app-center/v1/apps/schema/918.json new file mode 100644 index 0000000..668014e --- /dev/null +++ b/mockServer/src/mock/get/app-center/v1/apps/schema/918.json @@ -0,0 +1,2104 @@ +{ + "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;z-index:1;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": "TinyButton", + "package": "@opentiny/vue", + "exportName": "Button", + "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/mockServer/src/mock/get/platform-center/courses.json b/mockServer/src/mock/get/platform-center/courses.json new file mode 100644 index 0000000..dcd1c3b --- /dev/null +++ b/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/mockServer/src/mock/get/platform-center/user/me.json b/mockServer/src/mock/get/platform-center/user/me.json new file mode 100644 index 0000000..c1876b8 --- /dev/null +++ b/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/mockServer/src/mock/post/app-center/apps/extension/create.json b/mockServer/src/mock/post/app-center/apps/extension/create.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/apps/extension/create.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/apps/extension/update.json b/mockServer/src/mock/post/app-center/apps/extension/update.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/apps/extension/update.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/apps/update/918.json b/mockServer/src/mock/post/app-center/apps/update/918.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/apps/update/918.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/i18n/entries/bulk/delete.json b/mockServer/src/mock/post/app-center/i18n/entries/bulk/delete.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/i18n/entries/bulk/delete.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/i18n/entries/update.json b/mockServer/src/mock/post/app-center/i18n/entries/update.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/i18n/entries/update.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/sources/create.json b/mockServer/src/mock/post/app-center/sources/create.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/sources/create.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/sources/delete.json b/mockServer/src/mock/post/app-center/sources/delete.json new file mode 100644 index 0000000..9c6b044 --- /dev/null +++ b/mockServer/src/mock/post/app-center/sources/delete.json @@ -0,0 +1 @@ +{ "data": [], "locale": "zh-cn" } diff --git a/mockServer/src/mock/post/app-center/sources/update.json b/mockServer/src/mock/post/app-center/sources/update.json new file mode 100644 index 0000000..284dfe6 --- /dev/null +++ b/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/mockServer/src/routes/error-routes.js b/mockServer/src/routes/error-routes.js new file mode 100644 index 0000000..aca3532 --- /dev/null +++ b/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/mockServer/src/routes/main-routes.js b/mockServer/src/routes/main-routes.js new file mode 100644 index 0000000..06280c4 --- /dev/null +++ b/mockServer/src/routes/main-routes.js @@ -0,0 +1,227 @@ +/** + * 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 fs from 'fs-extra' +import * as glob from 'glob' +import KoaRouter from 'koa-router' +import path from 'path' +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 === 0) { + ctx.body = result + } else 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 if (result.data.length === 1) { + 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/mockServer/src/services/.gitkeep b/mockServer/src/services/.gitkeep new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/mockServer/src/services/.gitkeep @@ -0,0 +1 @@ +1 diff --git a/mockServer/src/services/app.js b/mockServer/src/services/app.js new file mode 100644 index 0000000..60821e4 --- /dev/null +++ b/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/mockServer/src/services/appinfo.json b/mockServer/src/services/appinfo.json new file mode 100644 index 0000000..ab75552 --- /dev/null +++ b/mockServer/src/services/appinfo.json @@ -0,0 +1,29712 @@ +{ + "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": "TabItem", + "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": "BreadcrumbItem", + "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"] + } + } + }, + { + "name": { + "zh_CN": "日期选择" + }, + "component": "TinyDatePicker", + "icon": "datepick", + "description": "用于输入或选择日期", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DatePicker", + "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": "日期", + "value": "date" + }, + { + "label": "日期时间", + "value": "datetime" + }, + { + "label": "周", + "value": "week" + }, + { + "label": "月份", + "value": "month" + }, + { + "label": "年份", + "value": "year" + } + ] + } + }, + "description": { + "zh_CN": "设置日期框的type属性" + } + }, + { + "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": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "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": "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": "" + } + } + }, + "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"] + } + } + }, + { + "name": { + "zh_CN": "数字输入框" + }, + "component": "TinyNumeric", + "icon": "numeric", + "description": "通过鼠标或键盘输入字符", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Numeric", + "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, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "allow-empty", + "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": false, + "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": "controls", + "label": { + "text": { + "zh_CN": "是否使用加减按钮" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "controls-position", + "label": { + "text": { + "zh_CN": "加减按钮位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "左右两侧", + "value": "" + }, + { + "label": "只在右侧", + "value": "right" + } + ] + } + }, + "description": { + "zh_CN": "加减按钮位置" + }, + "labelPosition": "left" + }, + { + "property": "precision", + "label": { + "text": { + "zh_CN": "数值精度" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "数值精度" + }, + "labelPosition": "left" + }, + { + "property": "step", + "label": { + "text": { + "zh_CN": "步长" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "步长" + }, + "labelPosition": "left" + }, + { + "property": "max", + "label": { + "text": { + "zh_CN": "可输入的最大数值" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "可输入的最大数值" + }, + "labelPosition": "left" + }, + { + "property": "min", + "label": { + "text": { + "zh_CN": "可输入的最小数值" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "可输入的最大数值" + }, + "labelPosition": "left" + } + ] + } + ], + "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": "" + } + } + }, + "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"] + } + } + } + ] + }, + "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/mockServer/src/services/block.js b/mockServer/src/services/block.js new file mode 100644 index 0000000..c8071fe --- /dev/null +++ b/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/mockServer/src/services/blockCategory.js b/mockServer/src/services/blockCategory.js new file mode 100644 index 0000000..401b963 --- /dev/null +++ b/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/mockServer/src/services/blockGroup.js b/mockServer/src/services/blockGroup.js new file mode 100644 index 0000000..01cd868 --- /dev/null +++ b/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/mockServer/src/services/blocks.json b/mockServer/src/services/blocks.json new file mode 100644 index 0000000..df91f08 --- /dev/null +++ b/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/mockServer/src/services/mockService.js b/mockServer/src/services/mockService.js new file mode 100644 index 0000000..5f05fd3 --- /dev/null +++ b/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/mockServer/src/services/pageSchema.js b/mockServer/src/services/pageSchema.js new file mode 100644 index 0000000..2b78b9b --- /dev/null +++ b/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/mockServer/src/services/pages.js b/mockServer/src/services/pages.js new file mode 100644 index 0000000..07b743e --- /dev/null +++ b/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/mockServer/src/services/schema2code.js b/mockServer/src/services/schema2code.js new file mode 100644 index 0000000..9b27000 --- /dev/null +++ b/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/mockServer/src/services/source.js b/mockServer/src/services/source.js new file mode 100644 index 0000000..be25719 --- /dev/null +++ b/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/mockServer/src/services/sources.json b/mockServer/src/services/sources.json new file mode 100644 index 0000000..2c0c8b8 --- /dev/null +++ b/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/mockServer/src/services/utils.js b/mockServer/src/services/utils.js new file mode 100644 index 0000000..853dc42 --- /dev/null +++ b/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/mockServer/src/tool/Common.js b/mockServer/src/tool/Common.js new file mode 100644 index 0000000..23d7988 --- /dev/null +++ b/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/mockServer/test/app.test.js b/mockServer/test/app.test.js new file mode 100644 index 0000000..1af2aa3 --- /dev/null +++ b/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/package.json b/package.json new file mode 100644 index 0000000..8586040 --- /dev/null +++ b/package.json @@ -0,0 +1,74 @@ +{ + "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", + "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/node": "^18.0.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "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" + }, + "pnpm": { + "patchedDependencies": { + "@vue/repl@2.9.0": "patches/@vue__repl@2.9.0.patch" + } + } +} diff --git a/packages/blockToWebComponentTemplate/README.md b/packages/blockToWebComponentTemplate/README.md new file mode 100644 index 0000000..cb10454 --- /dev/null +++ b/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/packages/blockToWebComponentTemplate/package.json b/packages/blockToWebComponentTemplate/package.json new file mode 100644 index 0000000..c857539 --- /dev/null +++ b/packages/blockToWebComponentTemplate/package.json @@ -0,0 +1,47 @@ +{ + "name": "@opentiny/tiny-engine-block-build", + "version": "1.0.2", + "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.4.15", + "vue-i18n": "^9.9.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.5.2", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + } +} diff --git a/packages/blockToWebComponentTemplate/src/BlockFileName.vue b/packages/blockToWebComponentTemplate/src/BlockFileName.vue new file mode 100644 index 0000000..90791a4 --- /dev/null +++ b/packages/blockToWebComponentTemplate/src/BlockFileName.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/packages/blockToWebComponentTemplate/src/lib.js b/packages/blockToWebComponentTemplate/src/lib.js new file mode 100644 index 0000000..61a538b --- /dev/null +++ b/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/packages/blockToWebComponentTemplate/vite.config.js b/packages/blockToWebComponentTemplate/vite.config.js new file mode 100644 index 0000000..446d005 --- /dev/null +++ b/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/packages/builtinComponent/README.md b/packages/builtinComponent/README.md new file mode 100644 index 0000000..5670a81 --- /dev/null +++ b/packages/builtinComponent/README.md @@ -0,0 +1,9 @@ +# 内置组件 + +## 目前内置的组件 + +### CanvasRow + +### CanvasCol + +### CanvasRowColContainer diff --git a/packages/builtinComponent/index.js b/packages/builtinComponent/index.js new file mode 100644 index 0000000..99242b7 --- /dev/null +++ b/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/packages/builtinComponent/package.json b/packages/builtinComponent/package.json new file mode 100644 index 0000000..92ff6b3 --- /dev/null +++ b/packages/builtinComponent/package.json @@ -0,0 +1,31 @@ +{ + "name": "@opentiny/tiny-engine-builtin-component", + "version": "1.0.1", + "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.1.0", + "vite": "^4.5.0" + } +} diff --git a/packages/builtinComponent/src/components/CanvasCol.vue b/packages/builtinComponent/src/components/CanvasCol.vue new file mode 100644 index 0000000..7bbaeb4 --- /dev/null +++ b/packages/builtinComponent/src/components/CanvasCol.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/packages/builtinComponent/src/components/CanvasRow.vue b/packages/builtinComponent/src/components/CanvasRow.vue new file mode 100644 index 0000000..5c7ba54 --- /dev/null +++ b/packages/builtinComponent/src/components/CanvasRow.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/packages/builtinComponent/src/components/CanvasRowColContainer.vue b/packages/builtinComponent/src/components/CanvasRowColContainer.vue new file mode 100644 index 0000000..ad46e40 --- /dev/null +++ b/packages/builtinComponent/src/components/CanvasRowColContainer.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/packages/builtinComponent/src/components/helper.js b/packages/builtinComponent/src/components/helper.js new file mode 100644 index 0000000..5920027 --- /dev/null +++ b/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/packages/builtinComponent/src/meta/CanvasCol.json b/packages/builtinComponent/src/meta/CanvasCol.json new file mode 100644 index 0000000..33c68b5 --- /dev/null +++ b/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/packages/builtinComponent/src/meta/CanvasRow.json b/packages/builtinComponent/src/meta/CanvasRow.json new file mode 100644 index 0000000..5033b30 --- /dev/null +++ b/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/packages/builtinComponent/src/meta/CanvasRowColContainer.json b/packages/builtinComponent/src/meta/CanvasRowColContainer.json new file mode 100644 index 0000000..e363530 --- /dev/null +++ b/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/packages/builtinComponent/src/meta/index.js b/packages/builtinComponent/src/meta/index.js new file mode 100644 index 0000000..fa2fca6 --- /dev/null +++ b/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/packages/builtinComponent/vite.config.js b/packages/builtinComponent/vite.config.js new file mode 100644 index 0000000..d77e390 --- /dev/null +++ b/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/packages/canvas/.eslintrc.js b/packages/canvas/.eslintrc.js new file mode 100644 index 0000000..7e042cf --- /dev/null +++ b/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/packages/canvas/.gitignore b/packages/canvas/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/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/packages/canvas/README.md b/packages/canvas/README.md new file mode 100644 index 0000000..eea15ce --- /dev/null +++ b/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/packages/canvas/index.html b/packages/canvas/index.html new file mode 100644 index 0000000..030a6ff --- /dev/null +++ b/packages/canvas/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/packages/canvas/package.json b/packages/canvas/package.json new file mode 100644 index 0000000..2725df3 --- /dev/null +++ b/packages/canvas/package.json @@ -0,0 +1,52 @@ +{ + "name": "@opentiny/tiny-engine-canvas", + "version": "1.0.3", + "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-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/core": "^9.6.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "rollup-plugin-terser": "^7.0.2", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15", + "vue-i18n": "^9.9.0" + } +} diff --git a/packages/canvas/public/favicon.ico b/packages/canvas/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/packages/canvas/public/favicon.ico differ diff --git a/packages/canvas/src/Design.vue b/packages/canvas/src/Design.vue new file mode 100644 index 0000000..886bc7d --- /dev/null +++ b/packages/canvas/src/Design.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/canvas/src/assets/logo.png b/packages/canvas/src/assets/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/packages/canvas/src/assets/logo.png differ diff --git a/packages/canvas/src/canvas.js b/packages/canvas/src/canvas.js new file mode 100644 index 0000000..853f02f --- /dev/null +++ b/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/packages/canvas/src/components/builtin/CanvasBox.vue b/packages/canvas/src/components/builtin/CanvasBox.vue new file mode 100644 index 0000000..96beea7 --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasBox.vue @@ -0,0 +1,22 @@ + + + diff --git a/packages/canvas/src/components/builtin/CanvasCol.vue b/packages/canvas/src/components/builtin/CanvasCol.vue new file mode 100644 index 0000000..5c0a5cb --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasCol.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/packages/canvas/src/components/builtin/CanvasCollection.js b/packages/canvas/src/components/builtin/CanvasCollection.js new file mode 100644 index 0000000..98def24 --- /dev/null +++ b/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/packages/canvas/src/components/builtin/CanvasCollection.vue b/packages/canvas/src/components/builtin/CanvasCollection.vue new file mode 100644 index 0000000..35173f1 --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasCollection.vue @@ -0,0 +1,106 @@ + + + diff --git a/packages/canvas/src/components/builtin/CanvasIcon.vue b/packages/canvas/src/components/builtin/CanvasIcon.vue new file mode 100644 index 0000000..4256731 --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasIcon.vue @@ -0,0 +1,30 @@ + + + diff --git a/packages/canvas/src/components/builtin/CanvasImg.vue b/packages/canvas/src/components/builtin/CanvasImg.vue new file mode 100644 index 0000000..2581381 --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasImg.vue @@ -0,0 +1,18 @@ + + + diff --git a/packages/canvas/src/components/builtin/CanvasPlaceholder.vue b/packages/canvas/src/components/builtin/CanvasPlaceholder.vue new file mode 100644 index 0000000..698df4d --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasPlaceholder.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/packages/canvas/src/components/builtin/CanvasRow.vue b/packages/canvas/src/components/builtin/CanvasRow.vue new file mode 100644 index 0000000..03c86db --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasRow.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/packages/canvas/src/components/builtin/CanvasRowColContainer.vue b/packages/canvas/src/components/builtin/CanvasRowColContainer.vue new file mode 100644 index 0000000..ccef5fb --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasRowColContainer.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/packages/canvas/src/components/builtin/CanvasSlot.vue b/packages/canvas/src/components/builtin/CanvasSlot.vue new file mode 100644 index 0000000..2c54559 --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasSlot.vue @@ -0,0 +1,22 @@ + + + diff --git a/packages/canvas/src/components/builtin/CanvasText.vue b/packages/canvas/src/components/builtin/CanvasText.vue new file mode 100644 index 0000000..ec9de29 --- /dev/null +++ b/packages/canvas/src/components/builtin/CanvasText.vue @@ -0,0 +1,18 @@ + + + diff --git a/packages/canvas/src/components/builtin/builtin.json b/packages/canvas/src/components/builtin/builtin.json new file mode 100644 index 0000000..79c6782 --- /dev/null +++ b/packages/canvas/src/components/builtin/builtin.json @@ -0,0 +1,526 @@ +{ + "data": { + "materials": { + "components": [ + { + "group": "内置组件", + "children": [ + { + "icon": "Box", + "name": { + "zh_CN": "Box" + }, + "component": "div", + "schema": { + "slots": {}, + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true, + "isContainer": true, + "nestingRule": { + "childWhitelist": [], + "descendantBlacklist": [] + } + } + }, + { + "icon": "slot", + "name": { + "zh_CN": "Slot" + }, + "component": "Slot", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "type": "String", + "label": { + "text": { + "zh_CN": "插槽名称" + } + }, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "params", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "作用域参数" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": { + "language": "json", + "tips": { + "title": { "zh_CN": "提示:数据为数组类型" }, + "demo": { + "zh_CN": "示例:\n[\n {\n \"name\": \"text\",\n \"value\": {\n \"type\": \"JSExpression\",\n \"value\": \"this.state.greetingMessage\"\n }\n },\n {\n \"name\": \"count\",\n \"value\": 1\n }\n]" + } + } + } + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "isContainer": true + } + }, + { + "icon": "Collection", + "name": { + "zh_CN": "Collection" + }, + "component": "Collection", + "schema": { + "slots": {}, + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "Boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "style", + "type": "String", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "样式" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "dataSource", + "type": "String", + "defaultValue": "", + "bindState": false, + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaCollection", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "isContainer": true + } + }, + { + "icon": "Text", + "name": { + "zh_CN": "Text" + }, + "component": "Text", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "type": "String", + "defaultValue": "TinyEngine 前端可视化设计器,为设计器开发者提供定制服务,在线构建出自己专属的设计器。", + "label": { + "text": { + "zh_CN": "文本内容" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaInput", + "props": { + "type": "textarea", + "autosize": true + } + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": ["text"] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true + } + }, + { + "icon": "icon", + "name": { + "zh_CN": "Icon" + }, + "component": "Icon", + "container": false, + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "name", + "type": "String", + "defaultValue": "IconDel", + "bindState": true, + "label": { + "text": { + "zh_CN": "图标类型" + } + }, + "cols": 12, + "rules": [], + "widget": { + "component": "MetaSelectIcon", + "props": {} + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": ["name"] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true + } + }, + { + "icon": "Image", + "name": { + "zh_CN": "Img" + }, + "component": "Img", + "container": false, + "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": {} + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "点击事件" + }, + "description": { + "zh_CN": "点击时触发的回调函数" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": ["src"] + }, + "contentMenu": { + "actions": [] + } + }, + "configure": { + "loop": true + } + } + ] + } + ], + "snippets": [ + { + "group": "内置组件", + "children": [ + { + "name": { + "zh_CN": "Box" + }, + "screenshot": "", + "snippetName": "Box", + "icon": "Box", + "schema": { + "componentName": "div", + "props": {} + } + }, + { + "name": { + "zh_CN": "Slot" + }, + "screenshot": "", + "snippetName": "Slot", + "icon": "slot", + "schema": { + "componentName": "Slot", + "props": {} + } + }, + { + "name": { + "zh_CN": "Collection" + }, + "screenshot": "", + "snippetName": "Collection", + "icon": "Collection", + "schema": { + "componentName": "Collection", + "props": {} + } + }, + { + "name": { + "zh_CN": "Text" + }, + "screenshot": "", + "snippetName": "Text", + "icon": "Text", + "schema": { + "componentName": "Text", + "props": { + "text": "TinyEngine 前端可视化设计器,为设计器开发者提供定制服务,在线构建出自己专属的设计器。" + } + } + }, + { + "name": { + "zh_CN": "Icon" + }, + "screenshot": "", + "snippetName": "Icon", + "icon": "icon", + "schema": { + "componentName": "Icon", + "props": { + "name": "IconDel" + } + } + }, + { + "name": { + "zh_CN": "Img" + }, + "screenshot": "", + "snippetName": "Img", + "icon": "Image", + "schema": { + "componentName": "Img", + "props": { + "src": "https://tinyengine-assets.obs.cn-north-4.myhuaweicloud.com/files/designer-default-icon.jpg" + } + } + } + ] + } + ] + } + } +} diff --git a/packages/canvas/src/components/builtin/helper.js b/packages/canvas/src/components/builtin/helper.js new file mode 100644 index 0000000..8f884f7 --- /dev/null +++ b/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/packages/canvas/src/components/builtin/index.js b/packages/canvas/src/components/builtin/index.js new file mode 100644 index 0000000..f857ff1 --- /dev/null +++ b/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/packages/canvas/src/components/common/index.js b/packages/canvas/src/components/common/index.js new file mode 100644 index 0000000..68a7097 --- /dev/null +++ b/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/packages/canvas/src/components/container/CanvasAction.vue b/packages/canvas/src/components/container/CanvasAction.vue new file mode 100644 index 0000000..5008e1c --- /dev/null +++ b/packages/canvas/src/components/container/CanvasAction.vue @@ -0,0 +1,700 @@ + + + + diff --git a/packages/canvas/src/components/container/CanvasContainer.vue b/packages/canvas/src/components/container/CanvasContainer.vue new file mode 100644 index 0000000..21abc30 --- /dev/null +++ b/packages/canvas/src/components/container/CanvasContainer.vue @@ -0,0 +1,272 @@ + + + + diff --git a/packages/canvas/src/components/container/CanvasDivider.vue b/packages/canvas/src/components/container/CanvasDivider.vue new file mode 100644 index 0000000..84c1fcf --- /dev/null +++ b/packages/canvas/src/components/container/CanvasDivider.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/packages/canvas/src/components/container/CanvasDragItem.vue b/packages/canvas/src/components/container/CanvasDragItem.vue new file mode 100644 index 0000000..864670c --- /dev/null +++ b/packages/canvas/src/components/container/CanvasDragItem.vue @@ -0,0 +1,51 @@ + + + + diff --git a/packages/canvas/src/components/container/CanvasFooter.vue b/packages/canvas/src/components/container/CanvasFooter.vue new file mode 100644 index 0000000..84293a9 --- /dev/null +++ b/packages/canvas/src/components/container/CanvasFooter.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/packages/canvas/src/components/container/CanvasMenu.vue b/packages/canvas/src/components/container/CanvasMenu.vue new file mode 100644 index 0000000..d7392ec --- /dev/null +++ b/packages/canvas/src/components/container/CanvasMenu.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/packages/canvas/src/components/container/CanvasResize.vue b/packages/canvas/src/components/container/CanvasResize.vue new file mode 100644 index 0000000..bdf0e01 --- /dev/null +++ b/packages/canvas/src/components/container/CanvasResize.vue @@ -0,0 +1,203 @@ + + + diff --git a/packages/canvas/src/components/container/CanvasResizeBorder.vue b/packages/canvas/src/components/container/CanvasResizeBorder.vue new file mode 100644 index 0000000..df91fe9 --- /dev/null +++ b/packages/canvas/src/components/container/CanvasResizeBorder.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/packages/canvas/src/components/container/container.js b/packages/canvas/src/components/container/container.js new file mode 100644 index 0000000..5812825 --- /dev/null +++ b/packages/canvas/src/components/container/container.js @@ -0,0 +1,854 @@ +/** + * 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-controller/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 getRenderer = () => canvasState.renderer + +export const getController = () => canvasState.controller + +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 getGlobalState = () => getRenderer().getGlobalState() + +export const getNode = (id, parent) => getRenderer()?.getNode(id, parent) + +export const getSchema = () => getRenderer()?.getSchema() + +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, + doc: null +} + +// 选中画布中元素时的状态 +export const selectState = reactive({ + ...initialRectState +}) + +// 鼠标移入画布中元素时的状态 +export const hoverState = reactive({ + ...initialRectState +}) + +// 拖拽时的位置状态 +export const lineState = reactive({ + ...initialLineState +}) + +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') +} + +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 + } +} + +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 + } + + // 如果当前元素是画布的html,返回画布的body + if (element === element.ownerDocument.documentElement) { + return element.ownerDocument.body + } + + 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 getRect = (element) => { + if (element === getDocument().body) { + const { innerWidth: width, innerHeight: height } = getWindow() + return { + left: 0, + top: 0, + right: width, + bottom: height, + width, + height, + x: 0, + y: 0 + } + } + return element.getBoundingClientRect() +} + +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 querySelectById = (id) => { + 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) + +// 滚动页面后,目标元素与页面边界至少保留的边距 +const SCROLL_MARGIN = 15 + +export const scrollToNode = (element) => { + if (element) { + const container = getDocument().documentElement + const { clientWidth, clientHeight } = container + const { x, y, width, height } = element.getBoundingClientRect() + const option = {} + + if (x < 0) { + option.left = container.scrollLeft + x - SCROLL_MARGIN + } else if (x > clientWidth) { + option.left = x + width - clientWidth + SCROLL_MARGIN + } + + if (y < 0) { + option.top = container.scrollTop + y - SCROLL_MARGIN + } else if (y > clientHeight) { + option.top = y + height - clientHeight + SCROLL_MARGIN + } + + if (typeof option.left === 'number' || typeof option.top === 'number') { + container.scrollTo(option) + } + } + + return nextTick() +} +const setSelectRect = (element) => { + element = element || getDocument().body + + const { left, height, top, width } = getRect(element) + const { x, y } = getOffset(element) + const siteCanvasRect = document.querySelector('.site-canvas').getBoundingClientRect() + const componentName = getCurrent().schema?.componentName || '' + const scale = useLayout().getScale() + clearHover() + Object.assign(selectState, { + width: width * scale, + height: height * scale, + top: top * scale + y - siteCanvasRect.y, + left: left * scale + x - siteCanvasRect.x, + componentName, + doc: getDocument() + }) +} + +export const updateRect = (id) => { + id = (typeof id === 'string' && id) || getCurrent().schema?.id + clearHover() + + if (id) { + setTimeout(() => setSelectRect(querySelectById(id))) + } else { + // 如果选中的是body,不清除选中框 + if (!selectState.componentName && selectState.width > 0) { + return + } + clearSelect() + } +} + +export const getConfigure = (targetName) => { + const material = getController().getMaterial(targetName) + + // 这里如果是区块插槽,则返回标识为容器的对象 + if (targetName === 'Template') { + return { + isContainer: true + } + } + + return material?.content?.configure || material.configure || {} +} + +/** + * 是否允许插入 + * @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 +} + +// 获取位置信息,返回状态 +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 } +} + +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 = getRect(element) + const { left, height, top, width } = rect + const { x, y } = getOffset(element) + const siteCanvasRect = document.querySelector('.site-canvas').getBoundingClientRect() + 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 = getRect(childEle) + const { left, height, top, width } = childRect + const { x, y } = getOffset(childEle) + Object.assign(lineState, { + width: width * scale, + height: height * scale, + top: top * scale + y - siteCanvasRect.y, + left: left * scale + x - siteCanvasRect.x, + position: canvasState.type === 'absolute' || getPosLine(childRect, lineState.configure).type + }) + } else { + Object.assign(lineState, { + width: width * scale, + height: height * scale, + top: top * scale + y - siteCanvasRect.y, + left: left * scale + x - siteCanvasRect.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 - siteCanvasRect.y, + left: left * scale + x - siteCanvasRect.x, + componentName + }) + return undefined +} + +// 绝对布局 +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 }) + } +} + +// 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 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 = () => { + 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() +} + +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 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 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/packages/canvas/src/components/container/keyboard.js b/packages/canvas/src/components/container/keyboard.js new file mode 100644 index 0000000..3ac5242 --- /dev/null +++ b/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/packages/canvas/src/components/container/shortCutPopover.vue b/packages/canvas/src/components/container/shortCutPopover.vue new file mode 100644 index 0000000..592f13b --- /dev/null +++ b/packages/canvas/src/components/container/shortCutPopover.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/packages/canvas/src/components/render/CanvasEmpty.vue b/packages/canvas/src/components/render/CanvasEmpty.vue new file mode 100644 index 0000000..c6dc2c4 --- /dev/null +++ b/packages/canvas/src/components/render/CanvasEmpty.vue @@ -0,0 +1,14 @@ + + + diff --git a/packages/canvas/src/components/render/RenderMain.js b/packages/canvas/src/components/render/RenderMain.js new file mode 100644 index 0000000..97040fc --- /dev/null +++ b/packages/canvas/src/components/render/RenderMain.js @@ -0,0 +1,442 @@ +/** + * 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' +import { getCurrent, setLocales, updateRect, addStyle, addScript, canvasDispatch } from '../container/container' +import Builtin from '../builtin/builtin.json' + +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() { + // 渲染画布增加根节点,与出码和预览保持一致 + const rootChildrenSchema = { + componentName: 'div', + props: schema.props, + children: schema.children + } + + return h( + 'tiny-i18n-host', + { + locale: 'zh_CN', + key: refreshKey.value, + ref: 'page', + className: 'design-page' + }, + schema.children?.length ? h(renderer, { schema: rootChildrenSchema, 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 +} + +const canvasApi = { + getCurrent, + setLocales, + getNodeById: getNode, + updateRect, + addStyle, + addScript, + canvasDispatch +} + +window.api = api +window.canvasApi = canvasApi +window.Builtin = Builtin diff --git a/packages/canvas/src/components/render/context.js b/packages/canvas/src/components/render/context.js new file mode 100644 index 0000000..96b8ca6 --- /dev/null +++ b/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/packages/canvas/src/components/render/render.js b/packages/canvas/src/components/render/render.js new file mode 100644 index 0000000..cb94380 --- /dev/null +++ b/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/packages/canvas/src/components/render/runner.js b/packages/canvas/src/components/render/runner.js new file mode 100644 index 0000000..bf70d32 --- /dev/null +++ b/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-controller/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/packages/canvas/src/i18n.js b/packages/canvas/src/i18n.js new file mode 100644 index 0000000..d50d960 --- /dev/null +++ b/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/packages/canvas/src/i18n/en.json b/packages/canvas/src/i18n/en.json new file mode 100644 index 0000000..7d106f5 --- /dev/null +++ b/packages/canvas/src/i18n/en.json @@ -0,0 +1,5 @@ +{ + "tip": { + "ok": "are you ok" + } +} diff --git a/packages/canvas/src/i18n/zh.json b/packages/canvas/src/i18n/zh.json new file mode 100644 index 0000000..e15179f --- /dev/null +++ b/packages/canvas/src/i18n/zh.json @@ -0,0 +1,5 @@ +{ + "tip": { + "ok": "准备好了吗?" + } +} diff --git a/packages/canvas/src/index.js b/packages/canvas/src/index.js new file mode 100644 index 0000000..fcf1d07 --- /dev/null +++ b/packages/canvas/src/index.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 CanvasContainer from './components/container/CanvasContainer.vue' +import CanvasAction from './components/container/CanvasAction.vue' +import CanvasDragItem from './components/container/CanvasDragItem.vue' +import CanvasFooter from './components/container/CanvasFooter.vue' +import CanvasResize from './components/container/CanvasResize.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' + +export { + CanvasContainer, + CanvasAction, + CanvasFooter, + CanvasDragItem, + CanvasResize, + 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 +} + +export default CanvasContainer diff --git a/packages/canvas/src/locale.js b/packages/canvas/src/locale.js new file mode 100644 index 0000000..00aea38 --- /dev/null +++ b/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/packages/canvas/src/lowcode.js b/packages/canvas/src/lowcode.js new file mode 100644 index 0000000..0c453d8 --- /dev/null +++ b/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/packages/canvas/src/main.js b/packages/canvas/src/main.js new file mode 100644 index 0000000..64201a2 --- /dev/null +++ b/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/packages/canvas/test/form.json b/packages/canvas/test/form.json new file mode 100644 index 0000000..ff5f714 --- /dev/null +++ b/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/packages/canvas/test/group.json b/packages/canvas/test/group.json new file mode 100644 index 0000000..914cba4 --- /dev/null +++ b/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/packages/canvas/test/jsslot.json b/packages/canvas/test/jsslot.json new file mode 100644 index 0000000..8a6cf5b --- /dev/null +++ b/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/packages/canvas/vite.config.js b/packages/canvas/vite.config.js new file mode 100644 index 0000000..1f4a573 --- /dev/null +++ b/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/packages/common/component/BindI18n.vue b/packages/common/component/BindI18n.vue new file mode 100644 index 0000000..9a93a24 --- /dev/null +++ b/packages/common/component/BindI18n.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/packages/common/component/BlockDeployDialog.vue b/packages/common/component/BlockDeployDialog.vue new file mode 100644 index 0000000..f5aa6c9 --- /dev/null +++ b/packages/common/component/BlockDeployDialog.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/packages/common/component/BlockDescription.vue b/packages/common/component/BlockDescription.vue new file mode 100644 index 0000000..5bf9653 --- /dev/null +++ b/packages/common/component/BlockDescription.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/packages/common/component/BlockHistoryList.vue b/packages/common/component/BlockHistoryList.vue new file mode 100644 index 0000000..d34e119 --- /dev/null +++ b/packages/common/component/BlockHistoryList.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/packages/common/component/BlockHistoryTemplate.vue b/packages/common/component/BlockHistoryTemplate.vue new file mode 100644 index 0000000..7e7cbbb --- /dev/null +++ b/packages/common/component/BlockHistoryTemplate.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/packages/common/component/BlockLinkEvent.vue b/packages/common/component/BlockLinkEvent.vue new file mode 100644 index 0000000..cfc1624 --- /dev/null +++ b/packages/common/component/BlockLinkEvent.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/packages/common/component/BlockLinkField.vue b/packages/common/component/BlockLinkField.vue new file mode 100644 index 0000000..95d2a2b --- /dev/null +++ b/packages/common/component/BlockLinkField.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/packages/common/component/ButtonGroup.vue b/packages/common/component/ButtonGroup.vue new file mode 100644 index 0000000..81d65c9 --- /dev/null +++ b/packages/common/component/ButtonGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/packages/common/component/CloseIcon.vue b/packages/common/component/CloseIcon.vue new file mode 100644 index 0000000..c105b75 --- /dev/null +++ b/packages/common/component/CloseIcon.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/packages/common/component/ConfigCollapse.vue b/packages/common/component/ConfigCollapse.vue new file mode 100644 index 0000000..1ba8b20 --- /dev/null +++ b/packages/common/component/ConfigCollapse.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/packages/common/component/ConfigGroup.vue b/packages/common/component/ConfigGroup.vue new file mode 100644 index 0000000..329959d --- /dev/null +++ b/packages/common/component/ConfigGroup.vue @@ -0,0 +1,59 @@ + + + diff --git a/packages/common/component/ConfigItem.vue b/packages/common/component/ConfigItem.vue new file mode 100644 index 0000000..c0fd195 --- /dev/null +++ b/packages/common/component/ConfigItem.vue @@ -0,0 +1,696 @@ + + + + + + + diff --git a/packages/common/component/ConfigRender.vue b/packages/common/component/ConfigRender.vue new file mode 100644 index 0000000..f7bd2b6 --- /dev/null +++ b/packages/common/component/ConfigRender.vue @@ -0,0 +1,101 @@ + + + diff --git a/packages/common/component/EmptyTip.vue b/packages/common/component/EmptyTip.vue new file mode 100644 index 0000000..8e72800 --- /dev/null +++ b/packages/common/component/EmptyTip.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/packages/common/component/LifeCycles.vue b/packages/common/component/LifeCycles.vue new file mode 100644 index 0000000..a608d0a --- /dev/null +++ b/packages/common/component/LifeCycles.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/packages/common/component/LinkButton.vue b/packages/common/component/LinkButton.vue new file mode 100644 index 0000000..11a80d6 --- /dev/null +++ b/packages/common/component/LinkButton.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/packages/common/component/MaskModal.vue b/packages/common/component/MaskModal.vue new file mode 100644 index 0000000..6005276 --- /dev/null +++ b/packages/common/component/MaskModal.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/packages/common/component/MetaArrayItem.vue b/packages/common/component/MetaArrayItem.vue new file mode 100644 index 0000000..b6ea09b --- /dev/null +++ b/packages/common/component/MetaArrayItem.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/packages/common/component/MetaBindI18n.vue b/packages/common/component/MetaBindI18n.vue new file mode 100644 index 0000000..dfe0377 --- /dev/null +++ b/packages/common/component/MetaBindI18n.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/packages/common/component/MetaBindVariable.vue b/packages/common/component/MetaBindVariable.vue new file mode 100644 index 0000000..970d4a4 --- /dev/null +++ b/packages/common/component/MetaBindVariable.vue @@ -0,0 +1,714 @@ + + + + + diff --git a/packages/common/component/MetaButtonGroup.vue b/packages/common/component/MetaButtonGroup.vue new file mode 100644 index 0000000..ca4dfa1 --- /dev/null +++ b/packages/common/component/MetaButtonGroup.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/packages/common/component/MetaCascader.vue b/packages/common/component/MetaCascader.vue new file mode 100644 index 0000000..519f859 --- /dev/null +++ b/packages/common/component/MetaCascader.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/packages/common/component/MetaCheckBox.vue b/packages/common/component/MetaCheckBox.vue new file mode 100644 index 0000000..5dfcce8 --- /dev/null +++ b/packages/common/component/MetaCheckBox.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/common/component/MetaCheckboxGroup.vue b/packages/common/component/MetaCheckboxGroup.vue new file mode 100644 index 0000000..7d3c3bd --- /dev/null +++ b/packages/common/component/MetaCheckboxGroup.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/packages/common/component/MetaChildItem.vue b/packages/common/component/MetaChildItem.vue new file mode 100644 index 0000000..3c8a6a8 --- /dev/null +++ b/packages/common/component/MetaChildItem.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/packages/common/component/MetaCodeEditor.vue b/packages/common/component/MetaCodeEditor.vue new file mode 100644 index 0000000..85b2a2c --- /dev/null +++ b/packages/common/component/MetaCodeEditor.vue @@ -0,0 +1,371 @@ + + + + + diff --git a/packages/common/component/MetaCodeEditorList.vue b/packages/common/component/MetaCodeEditorList.vue new file mode 100644 index 0000000..578a9c3 --- /dev/null +++ b/packages/common/component/MetaCodeEditorList.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/packages/common/component/MetaCollection.vue b/packages/common/component/MetaCollection.vue new file mode 100644 index 0000000..601709f --- /dev/null +++ b/packages/common/component/MetaCollection.vue @@ -0,0 +1,94 @@ + + + + diff --git a/packages/common/component/MetaColor.vue b/packages/common/component/MetaColor.vue new file mode 100644 index 0000000..d1662a6 --- /dev/null +++ b/packages/common/component/MetaColor.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/packages/common/component/MetaContainer.vue b/packages/common/component/MetaContainer.vue new file mode 100644 index 0000000..be0e300 --- /dev/null +++ b/packages/common/component/MetaContainer.vue @@ -0,0 +1,102 @@ + + + diff --git a/packages/common/component/MetaDatePicker.vue b/packages/common/component/MetaDatePicker.vue new file mode 100644 index 0000000..e886607 --- /dev/null +++ b/packages/common/component/MetaDatePicker.vue @@ -0,0 +1,45 @@ + + + diff --git a/packages/common/component/MetaDescription.vue b/packages/common/component/MetaDescription.vue new file mode 100644 index 0000000..d6609e2 --- /dev/null +++ b/packages/common/component/MetaDescription.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/packages/common/component/MetaForm.vue b/packages/common/component/MetaForm.vue new file mode 100644 index 0000000..a2999ec --- /dev/null +++ b/packages/common/component/MetaForm.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/packages/common/component/MetaGroupItem.vue b/packages/common/component/MetaGroupItem.vue new file mode 100644 index 0000000..6833289 --- /dev/null +++ b/packages/common/component/MetaGroupItem.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/packages/common/component/MetaHtmlAttributes.vue b/packages/common/component/MetaHtmlAttributes.vue new file mode 100644 index 0000000..f98c7f3 --- /dev/null +++ b/packages/common/component/MetaHtmlAttributes.vue @@ -0,0 +1,239 @@ + + + + diff --git a/packages/common/component/MetaHtmlText.vue b/packages/common/component/MetaHtmlText.vue new file mode 100644 index 0000000..bb8a28d --- /dev/null +++ b/packages/common/component/MetaHtmlText.vue @@ -0,0 +1,110 @@ + + + + diff --git a/packages/common/component/MetaInput.vue b/packages/common/component/MetaInput.vue new file mode 100644 index 0000000..f44e0bc --- /dev/null +++ b/packages/common/component/MetaInput.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/packages/common/component/MetaIpSection.vue b/packages/common/component/MetaIpSection.vue new file mode 100644 index 0000000..ebd7382 --- /dev/null +++ b/packages/common/component/MetaIpSection.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/packages/common/component/MetaJsSlot.vue b/packages/common/component/MetaJsSlot.vue new file mode 100644 index 0000000..87af9ae --- /dev/null +++ b/packages/common/component/MetaJsSlot.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/packages/common/component/MetaLayoutGrid.vue b/packages/common/component/MetaLayoutGrid.vue new file mode 100644 index 0000000..c8734f8 --- /dev/null +++ b/packages/common/component/MetaLayoutGrid.vue @@ -0,0 +1,336 @@ + + + + + diff --git a/packages/common/component/MetaList.vue b/packages/common/component/MetaList.vue new file mode 100644 index 0000000..f844b45 --- /dev/null +++ b/packages/common/component/MetaList.vue @@ -0,0 +1,36 @@ + + + diff --git a/packages/common/component/MetaListActions.vue b/packages/common/component/MetaListActions.vue new file mode 100644 index 0000000..2f77a06 --- /dev/null +++ b/packages/common/component/MetaListActions.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/packages/common/component/MetaListItem.vue b/packages/common/component/MetaListItem.vue new file mode 100644 index 0000000..014dd3a --- /dev/null +++ b/packages/common/component/MetaListItem.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/packages/common/component/MetaListItems.vue b/packages/common/component/MetaListItems.vue new file mode 100644 index 0000000..92da0e0 --- /dev/null +++ b/packages/common/component/MetaListItems.vue @@ -0,0 +1,191 @@ + + + + diff --git a/packages/common/component/MetaListTitle.vue b/packages/common/component/MetaListTitle.vue new file mode 100644 index 0000000..c69e60c --- /dev/null +++ b/packages/common/component/MetaListTitle.vue @@ -0,0 +1,14 @@ + + + diff --git a/packages/common/component/MetaModal.vue b/packages/common/component/MetaModal.vue new file mode 100644 index 0000000..8bd2115 --- /dev/null +++ b/packages/common/component/MetaModal.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/packages/common/component/MetaModalItem.vue b/packages/common/component/MetaModalItem.vue new file mode 100644 index 0000000..e7343bb --- /dev/null +++ b/packages/common/component/MetaModalItem.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/packages/common/component/MetaNumber.md b/packages/common/component/MetaNumber.md new file mode 100644 index 0000000..4826bcd --- /dev/null +++ b/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/packages/common/component/MetaNumber.vue b/packages/common/component/MetaNumber.vue new file mode 100644 index 0000000..cce0a68 --- /dev/null +++ b/packages/common/component/MetaNumber.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/packages/common/component/MetaPopover.vue b/packages/common/component/MetaPopover.vue new file mode 100644 index 0000000..d396c2f --- /dev/null +++ b/packages/common/component/MetaPopover.vue @@ -0,0 +1,43 @@ + + + diff --git a/packages/common/component/MetaRadio.vue b/packages/common/component/MetaRadio.vue new file mode 100644 index 0000000..0f2279b --- /dev/null +++ b/packages/common/component/MetaRadio.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/packages/common/component/MetaRadioGroup.vue b/packages/common/component/MetaRadioGroup.vue new file mode 100644 index 0000000..8655c71 --- /dev/null +++ b/packages/common/component/MetaRadioGroup.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/packages/common/component/MetaRelatedColumns.vue b/packages/common/component/MetaRelatedColumns.vue new file mode 100644 index 0000000..38154ef --- /dev/null +++ b/packages/common/component/MetaRelatedColumns.vue @@ -0,0 +1,79 @@ + + + diff --git a/packages/common/component/MetaRelatedEditor.vue b/packages/common/component/MetaRelatedEditor.vue new file mode 100644 index 0000000..81d2941 --- /dev/null +++ b/packages/common/component/MetaRelatedEditor.vue @@ -0,0 +1,139 @@ + + + + diff --git a/packages/common/component/MetaSelect.vue b/packages/common/component/MetaSelect.vue new file mode 100644 index 0000000..d9a59b8 --- /dev/null +++ b/packages/common/component/MetaSelect.vue @@ -0,0 +1,122 @@ + + + + diff --git a/packages/common/component/MetaSelectIcon.vue b/packages/common/component/MetaSelectIcon.vue new file mode 100644 index 0000000..d428041 --- /dev/null +++ b/packages/common/component/MetaSelectIcon.vue @@ -0,0 +1,176 @@ + + + + diff --git a/packages/common/component/MetaSlider.vue b/packages/common/component/MetaSlider.vue new file mode 100644 index 0000000..6fd6c6d --- /dev/null +++ b/packages/common/component/MetaSlider.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/packages/common/component/MetaSlot.vue b/packages/common/component/MetaSlot.vue new file mode 100644 index 0000000..e135796 --- /dev/null +++ b/packages/common/component/MetaSlot.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/packages/common/component/MetaSwitch.vue b/packages/common/component/MetaSwitch.vue new file mode 100644 index 0000000..afb8b15 --- /dev/null +++ b/packages/common/component/MetaSwitch.vue @@ -0,0 +1,38 @@ + + + diff --git a/packages/common/component/MetaTableColumns.vue b/packages/common/component/MetaTableColumns.vue new file mode 100644 index 0000000..502335e --- /dev/null +++ b/packages/common/component/MetaTableColumns.vue @@ -0,0 +1,33 @@ + + + diff --git a/packages/common/component/MonacoEditor.vue b/packages/common/component/MonacoEditor.vue new file mode 100644 index 0000000..dadf837 --- /dev/null +++ b/packages/common/component/MonacoEditor.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/packages/common/component/MultiTypeSelector.vue b/packages/common/component/MultiTypeSelector.vue new file mode 100644 index 0000000..8d7ebd1 --- /dev/null +++ b/packages/common/component/MultiTypeSelector.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/packages/common/component/Pane.vue b/packages/common/component/Pane.vue new file mode 100644 index 0000000..5bd3793 --- /dev/null +++ b/packages/common/component/Pane.vue @@ -0,0 +1,61 @@ + + + diff --git a/packages/common/component/PluginBlockList.vue b/packages/common/component/PluginBlockList.vue new file mode 100644 index 0000000..e4e6b25 --- /dev/null +++ b/packages/common/component/PluginBlockList.vue @@ -0,0 +1,735 @@ + + + + + + + diff --git a/packages/common/component/PluginPanel.vue b/packages/common/component/PluginPanel.vue new file mode 100644 index 0000000..7aa6b73 --- /dev/null +++ b/packages/common/component/PluginPanel.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/packages/common/component/PluginSetting.vue b/packages/common/component/PluginSetting.vue new file mode 100644 index 0000000..cd622ed --- /dev/null +++ b/packages/common/component/PluginSetting.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/packages/common/component/ProgressBar.vue b/packages/common/component/ProgressBar.vue new file mode 100644 index 0000000..2c76153 --- /dev/null +++ b/packages/common/component/ProgressBar.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/packages/common/component/PublicIcon.vue b/packages/common/component/PublicIcon.vue new file mode 100644 index 0000000..4367175 --- /dev/null +++ b/packages/common/component/PublicIcon.vue @@ -0,0 +1,30 @@ + + + diff --git a/packages/common/component/SaveNewBlock.vue b/packages/common/component/SaveNewBlock.vue new file mode 100644 index 0000000..3ca22e1 --- /dev/null +++ b/packages/common/component/SaveNewBlock.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/packages/common/component/SplitPanes.vue b/packages/common/component/SplitPanes.vue new file mode 100644 index 0000000..09e368c --- /dev/null +++ b/packages/common/component/SplitPanes.vue @@ -0,0 +1,686 @@ + + + diff --git a/packages/common/component/SvgButton.vue b/packages/common/component/SvgButton.vue new file mode 100644 index 0000000..e46650d --- /dev/null +++ b/packages/common/component/SvgButton.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/packages/common/component/VideoGuide.vue b/packages/common/component/VideoGuide.vue new file mode 100644 index 0000000..825d9d1 --- /dev/null +++ b/packages/common/component/VideoGuide.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/packages/common/component/VueMonaco.vue b/packages/common/component/VueMonaco.vue new file mode 100644 index 0000000..d102449 --- /dev/null +++ b/packages/common/component/VueMonaco.vue @@ -0,0 +1,196 @@ + + diff --git a/packages/common/i18n/en-us.json b/packages/common/i18n/en-us.json new file mode 100644 index 0000000..62a2d85 --- /dev/null +++ b/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/packages/common/i18n/zh-cn.json b/packages/common/i18n/zh-cn.json new file mode 100644 index 0000000..a1d40db --- /dev/null +++ b/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/packages/common/index.js b/packages/common/index.js new file mode 100644 index 0000000..cab3818 --- /dev/null +++ b/packages/common/index.js @@ -0,0 +1,210 @@ +/** + * 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 i18n, { i18nKeyMaps } from '@opentiny/tiny-engine-controller/js/i18n' + +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) + +const globalComponents = { + SaveNewBlock, + ConfigGroup, + ConfigItem +} + +export const injectGlobalComponents = { + install: (app) => { + Object.entries(globalComponents).forEach(([name, component]) => { + app.component(name, component) + }) + } +} + +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, + MetaContainer, + MonacoEditor, + MaskModal, + MetaHtmlAttributes, + VueMonaco, + PublicIcon, + SaveNewBlock, + BindI18n, + BlockDeployDialog, + ProgressBar, + MetaTableColumns +} diff --git a/packages/common/package.json b/packages/common/package.json new file mode 100644 index 0000000..1c70160 --- /dev/null +++ b/packages/common/package.json @@ -0,0 +1,50 @@ +{ + "name": "@opentiny/tiny-engine-common", + "version": "1.0.2", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "exports": { + ".": "./dist/index.js" + }, + "files": [ + "dist" + ], + "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": { + "@opentiny/tiny-engine-canvas": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0", + "@vue/shared": "^3.3.4", + "monaco-editor": "0.33.0", + "prettier": "2.7.1", + "vue-draggable-next": "2.1.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/common/vite.config.js b/packages/common/vite.config.js new file mode 100644 index 0000000..fbd436c --- /dev/null +++ b/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.*/] + } + } +}) diff --git a/packages/controller/adapter.js b/packages/controller/adapter.js new file mode 100644 index 0000000..403b66e --- /dev/null +++ b/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/packages/controller/js/app.js b/packages/controller/js/app.js new file mode 100644 index 0000000..9d2383f --- /dev/null +++ b/packages/controller/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/packages/controller/js/ast.js b/packages/controller/js/ast.js new file mode 100644 index 0000000..18026c0 --- /dev/null +++ b/packages/controller/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/packages/controller/js/canvas.js b/packages/controller/js/canvas.js new file mode 100644 index 0000000..c73f81c --- /dev/null +++ b/packages/controller/js/canvas.js @@ -0,0 +1,40 @@ +/** + * 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 from '../src/useEditorInfo' +import useResource from '../src/useResource' + +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/packages/controller/js/completion.js b/packages/controller/js/completion.js new file mode 100644 index 0000000..ddd1138 --- /dev/null +++ b/packages/controller/js/completion.js @@ -0,0 +1,206 @@ +/** + * 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 from '../src/useCanvas' +import useResource from '../src/useResource' + +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/packages/controller/js/constants.js b/packages/controller/js/constants.js new file mode 100644 index 0000000..5b9a76c --- /dev/null +++ b/packages/controller/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/packages/controller/js/css.js b/packages/controller/js/css.js new file mode 100644 index 0000000..e00ea3b --- /dev/null +++ b/packages/controller/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 '../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/packages/controller/js/environments.js b/packages/controller/js/environments.js new file mode 100644 index 0000000..9da87a6 --- /dev/null +++ b/packages/controller/js/environments.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. + * + */ + +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 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/packages/controller/js/http.js b/packages/controller/js/http.js new file mode 100644 index 0000000..28446e5 --- /dev/null +++ b/packages/controller/js/http.js @@ -0,0 +1,70 @@ +/** + * 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 from '../src/usePage' +import useCanvas from '../src/useCanvas' +import useNotify from '../src/useNotify' +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 = (url, params) => http.post(url, 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/packages/controller/js/i18n.js b/packages/controller/js/i18n.js new file mode 100644 index 0000000..cd71630 --- /dev/null +++ b/packages/controller/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/packages/controller/js/linter.js b/packages/controller/js/linter.js new file mode 100644 index 0000000..14e9e7e --- /dev/null +++ b/packages/controller/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/packages/controller/js/monitor.js b/packages/controller/js/monitor.js new file mode 100644 index 0000000..b2628ca --- /dev/null +++ b/packages/controller/js/monitor.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 { requestEvent } from './http.js' + +let monitorUrl = '' + +/** + * 全局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(monitorUrl, { + 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(monitorUrl, { + 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(monitorUrl, { + event_type: 'design_iframeError', + url: window.location.href, + unit: getUrlUnit(), + content: JSON.stringify({ + errorMessage: errorMessage, + scriptURI: scriptURI, + columnNo: columnNo, + error: error + }) + }) + } +} + +export const initMonitor = (url) => { + monitorUrl = url + globalMonitoring() + promiseMonitoring() +} diff --git a/packages/controller/js/preview.js b/packages/controller/js/preview.js new file mode 100644 index 0000000..1284056 --- /dev/null +++ b/packages/controller/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 '../src/useResource' +// 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/packages/controller/js/verification.js b/packages/controller/js/verification.js new file mode 100644 index 0000000..3276983 --- /dev/null +++ b/packages/controller/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/packages/controller/js/vscodeGenerateFile.js b/packages/controller/js/vscodeGenerateFile.js new file mode 100644 index 0000000..35ea136 --- /dev/null +++ b/packages/controller/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/packages/controller/package.json b/packages/controller/package.json new file mode 100644 index 0000000..b247c6f --- /dev/null +++ b/packages/controller/package.json @@ -0,0 +1,58 @@ +{ + "name": "@opentiny/tiny-engine-controller", + "version": "1.0.3", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "vite build" + }, + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist", + "js" + ], + "exports": { + ".": "./dist/index.js", + "./js/": "./dist/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": { + "@babel/generator": "7.18.13", + "@babel/parser": "7.18.13", + "@babel/traverse": "7.18.13", + "@opentiny/tiny-engine-builtin-component": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-i18n-host": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~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", + "prettier": "2.7.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "glob": "^10.3.4", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15", + "vue-i18n": "^9.9.0" + } +} diff --git a/packages/controller/src/example.js b/packages/controller/src/example.js new file mode 100644 index 0000000..42a7b7b --- /dev/null +++ b/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/packages/controller/src/globalConfig.js b/packages/controller/src/globalConfig.js new file mode 100644 index 0000000..062d379 --- /dev/null +++ b/packages/controller/src/globalConfig.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. +* +*/ + +let globalConfig = null + +export const getGlobalConfig = () => globalConfig + +export const setGlobalConfig = (config) => { + globalConfig = config +} diff --git a/packages/controller/src/index.js b/packages/controller/src/index.js new file mode 100644 index 0000000..322c248 --- /dev/null +++ b/packages/controller/src/index.js @@ -0,0 +1,59 @@ +/** + * 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' + +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 +} diff --git a/packages/controller/src/useApp.js b/packages/controller/src/useApp.js new file mode 100644 index 0000000..9a3b840 --- /dev/null +++ b/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/packages/controller/src/useBlock.js b/packages/controller/src/useBlock.js new file mode 100644 index 0000000..0aaaf71 --- /dev/null +++ b/packages/controller/src/useBlock.js @@ -0,0 +1,766 @@ +/** + * 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 { constants } from '@opentiny/tiny-engine-utils' +import { getCanvasStatus } from '../js/canvas' +import { ast2String, parseExpression } from '../js/ast' +import { getCssObjectFromStyleStr } from '../js/css' +import useCanvas from './useCanvas' +import useTranslate from './useTranslate' +import useEditorInfo from './useEditorInfo' +import useBreadcrumb from './useBreadcrumb' +import useLayout from './useLayout' +import { getGlobalConfig } from './globalConfig' + +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 = useCanvas().renderer.value?.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 } = useCanvas().renderer.value?.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/packages/controller/src/useBreadcrumb.js b/packages/controller/src/useBreadcrumb.js new file mode 100644 index 0000000..3ac0af7 --- /dev/null +++ b/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/packages/controller/src/useCanvas.js b/packages/controller/src/useCanvas.js new file mode 100644 index 0000000..c97b65f --- /dev/null +++ b/packages/controller/src/useCanvas.js @@ -0,0 +1,162 @@ +/** + * 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, ref } from 'vue' +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 renderer = ref(null) + +const pageState = reactive({ ...defaultPageState, loading: true }) +// 重置画布数据 +const resetCanvasState = async (state = {}) => { + Object.assign(pageState, defaultPageState, state) + + await renderer.value?.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, + renderer, + isBlock, + isSaved, + isLoading, + initData, + setSaved, + clearCanvas, + getPageSchema, + resetPageCanvasState, + resetBlockCanvasState, + clearCurrentState, + getDataSourceMap: renderer.value?.getDataSourceMap, + setDataSourceMap: renderer.value?.setDataSourceMap, + getCurrentSchema, + setCurrentSchema, + getCurrentPage + } +} diff --git a/packages/controller/src/useData.js b/packages/controller/src/useData.js new file mode 100644 index 0000000..417e50b --- /dev/null +++ b/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/packages/controller/src/useDataSource.js b/packages/controller/src/useDataSource.js new file mode 100644 index 0000000..e1e93af --- /dev/null +++ b/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/packages/controller/src/useEditorInfo.js b/packages/controller/src/useEditorInfo.js new file mode 100644 index 0000000..bd4b1e1 --- /dev/null +++ b/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/packages/controller/src/useHelp.js b/packages/controller/src/useHelp.js new file mode 100644 index 0000000..8240c3c --- /dev/null +++ b/packages/controller/src/useHelp.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. + * + */ + +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, + stylePanel: 6 + } +} + +const getDocsUrl = (plugin) => { + return `${getBaseUrl()}${helpState.docsUrl[plugin]}` +} + +export default () => ({ + getBaseUrl, + getDocsUrl +}) diff --git a/packages/controller/src/useHistory.js b/packages/controller/src/useHistory.js new file mode 100644 index 0000000..943dd92 --- /dev/null +++ b/packages/controller/src/useHistory.js @@ -0,0 +1,123 @@ +/** + * 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' + +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 + useCanvas().renderer.value?.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 clear = () => { + list.splice(0) + Object.assign(historyState, { + index: 0, + back: false, + forward: false + }) +} + +const addHistory = (schema) => { + if (!schema) { + useCanvas().setSaved(false) + push(useCanvas().renderer.value?.getSchema()) + } else { + clear() + // 初始 schema 需要设置为第一条历史记录 + push(schema) + } +} + +// 监控下标,判断是否允许前进后退标志 +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/packages/controller/src/useLayout.js b/packages/controller/src/useLayout.js new file mode 100644 index 0000000..368b771 --- /dev/null +++ b/packages/controller/src/useLayout.js @@ -0,0 +1,135 @@ +/** + * 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' +} + +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/packages/controller/src/useMessage.js b/packages/controller/src/useMessage.js new file mode 100644 index 0000000..5681c1b --- /dev/null +++ b/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/packages/controller/src/useModal.jsx b/packages/controller/src/useModal.jsx new file mode 100644 index 0000000..3c0b0bf --- /dev/null +++ b/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/packages/controller/src/useNotify.jsx b/packages/controller/src/useNotify.jsx new file mode 100644 index 0000000..c9a27b3 --- /dev/null +++ b/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/packages/controller/src/usePage.js b/packages/controller/src/usePage.js new file mode 100644 index 0000000..8af5fc0 --- /dev/null +++ b/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/packages/controller/src/useProperties.js b/packages/controller/src/useProperties.js new file mode 100644 index 0000000..8c0a91c --- /dev/null +++ b/packages/controller/src/useProperties.js @@ -0,0 +1,234 @@ +/** + * 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 { constants } from '@opentiny/tiny-engine-utils' +import useCanvas from './useCanvas' +import useResource from './useResource' +import useTranslate from './useTranslate' + +const { COMPONENT_NAME } = constants +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 isPageOrBlock = (schema) => [COMPONENT_NAME.Block, COMPONENT_NAME.Page].includes(schema?.componentName) + +const getProps = (schema, parent) => { + // 1 现在选中的节点和当前节点一样,不需要重新计算, 2 默认进来由于scheme和properities.schema相等,因此判断如果是“页面或者区块”需要进入if判断 + if (schema && (properties.schema !== schema || isPageOrBlock(schema))) { + const { props, componentName } = schema + // 若选中的是page或者 blcok,没有对应schema,ComponentName 给 div 设置根节点属性 + const { + schema: metaSchema, + content, + properties + } = useResource().getMaterial(isPageOrBlock(schema) ? 'div' : 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, type) => { + if (!properties.schema) { + return + } + + properties.schema.props = properties.schema.props || {} + + if ((value === '' && type !== 'String') || value === undefined || value === null) { + delete properties.schema.props[name] + } else { + properties.schema.props[name] = value + } + + // 没有父级,或者不在节点上面,要更新内容。就用setState + const { getNode, setState, updateRect } = useCanvas().renderer.value || {} + getNode(properties.schema.id, true)?.parent || setState(useCanvas().getPageSchema().state) + propsUpdateKey.value++ + + // 更新根节点props不用updateRect + if (!properties.schema.id) { + return + } + + 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/packages/controller/src/useProperty.js b/packages/controller/src/useProperty.js new file mode 100644 index 0000000..f6e8a93 --- /dev/null +++ b/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/packages/controller/src/useResource.js b/packages/controller/src/useResource.js new file mode 100644 index 0000000..e8e462a --- /dev/null +++ b/packages/controller/src/useResource.js @@ -0,0 +1,477 @@ +/** + * 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 { getGlobalConfig } from './globalConfig' +import { useHttp } from '@opentiny/tiny-engine-http' +import { utils, constants } from '@opentiny/tiny-engine-utils' +import { meta as BuiltinComponentMaterials } from '@opentiny/tiny-engine-builtin-component' +import { getCanvasStatus } from '../js/canvas' +import useApp from './useApp' +import useCanvas from './useCanvas' +import useTranslate from './useTranslate' +import useEditorInfo from './useEditorInfo' +import useBreadcrumb from './useBreadcrumb' +import useLayout from './useLayout' +import useBlock from './useBlock' +import useNotify from './useNotify' + +const { camelize, capitalize } = utils +const { MATERIAL_TYPE, COMPONENT_NAME, DEFAULT_INTERCEPTOR } = constants + +// 这里存放TinyVue组件、原生HTML、内置组件的缓存 +const resource = new Map() + +// 这里涉及到区块发布后的更新问题,所以需要单独缓存区块 +const blockResource = new Map() + +const http = useHttp() + +const resState = reactive({ + components: [], + blocks: [], + dataSource: [], + pageTree: [], + langs: {}, + utils: {}, + globalState: [], + thirdPartyDeps: { scripts: [], styles: new Set() } +}) + +const getSnippet = (component) => { + let schema = {} + resState.components.forEach(({ children }) => { + const child = children.find(({ snippetName }) => snippetName === component) + child && (schema = child.schema) + }) + + return schema +} + +const generateNode = ({ type, component }) => { + const schema = { + componentName: component, + props: {}, + ...getSnippet(component) + } + + if (type === 'block') { + schema.componentType = 'Block' + } + + return schema +} + +const registerComponent = (data) => { + if (Array.isArray(data.component)) { + const { component, ...others } = data + component.forEach((item) => { + resource.set(item, { item, ...others, type: MATERIAL_TYPE.Component }) + }) + } else { + resource.set(data.component, { ...data, type: MATERIAL_TYPE.Component }) + } + + return data +} + +const fetchBlockDetail = async (blockName) => { + const { getBlockAssetsByVersion } = useBlock() + const currentVersion = resState.componentsMap?.[blockName]?.version + const block = (await http.get(`/material-center/api/block?label=${blockName}`))?.[0] + + if (!block) { + throw new Error(`区块${blockName}不存在!`) + } + + block.assets = getBlockAssetsByVersion(block, currentVersion) + block.assets = history?.assets || block.assets + + return block +} + +/** + * registerBlock 注册区块 + * @param {String|Object} data 当为字符串时请求详细信息 + * @param {*} notFetchResouce 是否添加js css资源到页面 + * @returns + */ +const registerBlock = async (data, notFetchResouce) => { + let block = data + + if (typeof block === 'string') { + try { + block = await fetchBlockDetail(block) + } catch (error) { + useNotify({ + type: 'warning', + title: '区块读取错误', + message: error?.message || error + }) + + return false + } + } + + if (!block) { + return false + } + + block.type = MATERIAL_TYPE.Block + block.component = block.component || block.blockName || block.label || block.fileName + // 区块还原备份时, 后台改变current_history, 所以assets优先从current_history里取 + const assets = block.assets + const label = block.component + const { scripts = [], styles = [] } = assets || {} + + if (notFetchResouce) { + return block + } else { + if (!blockResource.get(label)) { + const { addScript, addStyle } = useCanvas().renderer.value + const promises = scripts + .filter((item) => item.includes('umd.js')) + .map(addScript) + .concat(styles.map(addStyle)) + // 此处删除await,提前放行区块数据,在区块渲染前找到区块数据源映射关系 + Promise.allSettled(promises) + blockResource.set(label, block.content) + } + } + + return block +} + +const clearMaterials = () => { + resState.components = [] + resState.blocks = [] + resource.clear() +} + +const clearBlockResources = () => blockResource.clear() + +/** + * 收集第三方组件库依赖 + * @param {array} components 组件物料列表 + */ +const generateThirdPartyDeps = (components) => { + const styles = [] + const scripts = [] + + components.forEach((item) => { + const { npm, component } = item + + if (!npm || !Object.keys(npm).length) return + + const { package: pkg, script, exportName, css } = npm + const currentPkg = scripts.find((item) => item.package === pkg) + + if (currentPkg) { + // 保存组件id和导出组件名的对应关系 TinyButton: Button + currentPkg.components[component] = exportName + } else { + scripts.push({ + package: pkg, + script, + components: { + [component]: exportName + } + }) + } + + if (css) { + styles.push(css) + } + }) + + resState.thirdPartyDeps.scripts.push(...scripts) + styles.forEach((item) => resState.thirdPartyDeps.styles.add(item)) +} + +const addMaterials = (materials = {}) => { + generateThirdPartyDeps(materials.components) + resState.components.push(...materials.snippets) + materials.components.map(registerComponent) + + const promises = materials?.blocks?.map((item) => registerBlock(item, true)) + Promise.allSettled(promises).then((blocks) => { + if (!blocks?.length) { + return + } + // 默认区块都会展示在默认分组中 + if (!resState.blocks?.[0]?.children) { + resState.blocks.push({ + groupId: useBlock().DEFAULT_GROUP_ID, + groupName: useBlock().DEFAULT_GROUP_NAME, + children: [] + }) + } + resState.blocks[0].children.unshift(...blocks.filter((res) => res.status === 'fulfilled').map((res) => res.value)) + }) +} + +const getMaterial = (name) => { + if (name) { + // 先读取组件缓存,再读取区块缓存 + return ( + resource.get(name) || + resource.get(capitalize(camelize(name))) || + blockResource.get(name) || + blockResource.get(capitalize(camelize(name))) || + {} + ) + } else { + return {} + } +} + +const setMaterial = (name, data) => { + resource.set(name, data) +} + +const getConfigureMap = () => { + const entries = Object.entries(Object.fromEntries(resource)).map(([key, value]) => { + return [key, value.content?.configure || value.configure] + }) + return Object.fromEntries(entries) +} + +const fetchMaterial = async () => { + const { dslMode, canvasOptions } = getGlobalConfig() + const bundleUrls = canvasOptions[dslMode].material + const materials = await Promise.allSettled(bundleUrls.map((url) => http.get(url))) + + materials.forEach((response) => { + if (response.status === 'fulfilled' && response.value.materials) { + addMaterials(response.value.materials) + } + }) +} + +const initPage = (pageInfo) => { + try { + if (pageInfo.meta) { + const { occupier } = pageInfo.meta + + useLayout().layoutState.pageStatus = getCanvasStatus(occupier) + } else { + useLayout().layoutState.pageStatus = { + state: 'empty', + data: {} + } + } + + pageInfo.id = pageInfo.meta?.id + } catch (error) { + console.log(error) // eslint-disable-line + } + + const { id, meta, ...pageSchema } = pageInfo + // 画布传递 schema ,多余的数据不能传递 + useCanvas().initData(pageSchema, { + id, + name: pageInfo?.fileName + }) + useBreadcrumb().setBreadcrumbPage([pageInfo.fileName]) +} + +/** + * 根据区块 id 初始化应用 + * @param {string} blockId 区块 id + */ +const initBlock = async (blockId) => { + const { PLUGIN_NAME, getPluginApi } = useLayout() + const blockApi = getPluginApi(PLUGIN_NAME.BlockManage) + const blockContent = await blockApi.getBlockById(blockId) + + if (blockContent.public_scope_tenants.length) { + blockContent.public_scope_tenants = blockContent.public_scope_tenants.map((e) => e.id) + } + + useLayout().layoutState.pageStatus = getCanvasStatus(blockContent?.occupier) + + // 请求区块详情 + useBlock().initBlock(blockContent, {}, true) +} + +const initPageOrBlock = async () => { + const { pageId, blockId } = useEditorInfo().useInfo() + const { setBreadcrumbPage } = useBreadcrumb() + + if (pageId) { + const { PLUGIN_NAME, getPluginApi } = useLayout() + const pagePluginApi = getPluginApi(PLUGIN_NAME.AppManage) + + const data = await pagePluginApi.getPageById(pageId) + + useLayout().layoutState.pageStatus = getCanvasStatus(data.occupier) + useCanvas().initData(data.page_content, data) + setBreadcrumbPage([data.name]) + return + } + + if (blockId) { + await initBlock(blockId) + + return + } + + // url 没有 pageid 或 blockid,到页面首页或第一页 + const pageInfo = resState.pageTree.find((page) => page?.meta?.isHome) || + resState.pageTree.find( + (page) => page.componentName === COMPONENT_NAME.Page && page?.meta?.group !== 'publicPages' + ) || { + componentName: COMPONENT_NAME.Page + } + initPage(pageInfo) +} + +const handlePopStateEvent = async () => { + const { id, type } = useEditorInfo().useInfo() + + await initPageOrBlock() + + // 国际化貌似有 app 和区块之分,但是目前其实都存到了 app 里面,需要确认是否需要修复 + await useTranslate().initI18n({ host: id, hostType: type }) +} + +/** + * 获取区块保存的依赖信息,合并到resState.thirdPartyDeps + * @param {object} dependencies 区块保存的依赖信息 + */ +const getBlockDeps = (dependencies = {}) => { + const { scripts = [], styles = [] } = dependencies + + scripts.length && + scripts.forEach((npm) => { + const { package: pkg, script, css, components } = npm + const npmInfo = resState.thirdPartyDeps.scripts.find((item) => item.package === pkg) + + if (!npmInfo || !npmInfo.script) { + resState.thirdPartyDeps.scripts.push({ package: pkg, script, css, components }) + } else { + const components = npmInfo.components || {} + + npmInfo.components = { ...components, ...npm.components } + } + }) + + styles?.forEach((item) => resState.thirdPartyDeps.styles.add(item)) +} + +const fetchResource = async ({ isInit = true } = {}) => { + const { id, type } = useEditorInfo().useInfo() + useApp().appInfoState.selectedId = id + + const Builtin = window.Builtin + Builtin.data.materials.components[0].children.map(registerComponent) + BuiltinComponentMaterials.components[0].children.map(registerComponent) + + const builtinSnippets = { + group: '内置组件', + children: [...Builtin.data.materials.snippets[0].children, ...BuiltinComponentMaterials.snippets[0].children] + } + + resState.components.push(builtinSnippets) + + const appData = await useHttp().get(`/app-center/v1/api/apps/schema/${id}`) + resState.pageTree = appData.componentsTree + resState.dataSource = appData.dataSource?.list + resState.dataHandler = appData.dataSource?.dataHandler || DEFAULT_INTERCEPTOR.dataHandler + resState.willFetch = appData.dataSource?.willFetch || DEFAULT_INTERCEPTOR.willFetch + resState.errorHandler = appData.dataSource?.errorHandler || DEFAULT_INTERCEPTOR.errorHandler + + resState.bridge = appData.bridge + resState.utils = appData.utils + resState.isDemo = appData.meta?.is_demo + resState.globalState = appData?.meta.global_state + + if (isInit) { + resState.componentsMap = appData.componentsMap?.reduce((componentsMap, component) => { + if (component.dependencies) { + getBlockDeps(component.dependencies) + } + + return { ...componentsMap, [component.componentName]: component } + }, {}) + } + + // 词条语言为空时使用默认的语言 + const defaultLocales = [ + { lang: 'zh_CN', label: 'zh_CN' }, + { lang: 'en_US', label: 'en_US' } + ] + const locales = Object.keys(appData.i18n).length + ? Object.keys(appData.i18n).map((key) => ({ lang: key, label: key })) + : defaultLocales + resState.langs = { + locales, + messages: appData.i18n + } + + try { + await fetchMaterial() + + if (isInit) { + await initPageOrBlock() + } + + await useTranslate().initI18n({ host: id, hostType: type, init: true }) + } catch (error) { + console.log(error) // eslint-disable-line + } +} + +const getSnippetRelationship = (component) => { + let relationship = {} + resState.components.forEach(({ children }) => { + const child = children.find(({ snippetName }) => snippetName === component) + child && (relationship = child.relationship) + }) + + return relationship +} + +/** + * 获取新增区块的依赖,更新画布中的组件依赖 + * @param {array} blocks 新增的区块列表 + */ +const updateCanvasDependencies = (blocks) => { + blocks.forEach((block) => { + if (!block.content.dependencies) return + + getBlockDeps(block.content.dependencies) + }) + + useCanvas().renderer.value?.canvasDispatch('updateDependencies', { detail: resState.thirdPartyDeps }) +} + +export default function () { + return { + resState, + fetchResource, + fetchMaterial, + generateNode, + addMaterials, + clearMaterials, + clearBlockResources, + getMaterial, + setMaterial, + getConfigureMap, + registerComponent, + registerBlock, + getSnippetRelationship, + initPageOrBlock, + handlePopStateEvent, + updateCanvasDependencies + } +} diff --git a/packages/controller/src/useSaveLocal.js b/packages/controller/src/useSaveLocal.js new file mode 100644 index 0000000..7bbc5fb --- /dev/null +++ b/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 '../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/packages/controller/src/useTranslate.js b/packages/controller/src/useTranslate.js new file mode 100644 index 0000000..3df0e94 --- /dev/null +++ b/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 { isVsCodeEnv } from '../js/environments' +import { constants } from '@opentiny/tiny-engine-utils' +import { generateI18n } from '../js/vscodeGenerateFile' +import useResource from './useResource' +import { PROP_DATA_TYPE } from '../utils' +import useCanvas from './useCanvas' + +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 + } + }) + + useCanvas().renderer.value?.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 + }) + useCanvas().renderer.value?.setLocales(i18nResource.messages) + } +} + +const initBlockI18n = async (blockId) => { + if (blockId) { + await initI18n({ + host: blockId, + hostType: HOST_TYPE.Block + }) + useCanvas().renderer.value?.setLocales(i18nResource.messages) + } +} + +const initBlockLocalI18n = async (langs = {}) => { + setLangs(langs) + await initI18n({ + host: '', + hostType: HOST_TYPE.Block, + local: true + }) + useCanvas().renderer.value?.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/packages/controller/utils.js b/packages/controller/utils.js new file mode 100644 index 0000000..9c22b48 --- /dev/null +++ b/packages/controller/utils.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 { 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 +} diff --git a/packages/controller/vite.config.js b/packages/controller/vite.config.js new file mode 100644 index 0000000..5602cfc --- /dev/null +++ b/packages/controller/vite.config.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 { defineConfig } from 'vite' +import path from 'path' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import { glob } from 'glob' +import { fileURLToPath } from 'node:url' + +const jsEntries = glob.sync('./js/**.js').map((file) => { + return [file.slice(0, file.length - path.extname(file).length), fileURLToPath(new URL(file, import.meta.url))] +}) + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + publicDir: false, + resolve: {}, + define: { + 'process.env': {}, + 'import.meta': 'import.meta' + }, + build: { + cssCodeSplit: false, + lib: { + entry: { + index: path.resolve(__dirname, './src/index.js'), + adapter: path.resolve(__dirname, './adapter.js'), + utils: path.resolve(__dirname, './utils.js'), + ...Object.fromEntries(jsEntries) + }, + name: 'controller', + fileName: (formats, entryName) => `${entryName}.js`, + formats: ['es'] + }, + rollupOptions: { + external: ['vue', 'vue-i18n', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/, /^prettier.*/, /^@babel.*/] + } + } +}) diff --git a/packages/design-core/.env.alpha b/packages/design-core/.env.alpha new file mode 100644 index 0000000..cfd059c --- /dev/null +++ b/packages/design-core/.env.alpha @@ -0,0 +1,10 @@ +# alpha mode, used by the "build:alpha" script + +NODE_ENV=production +VITE_CDN_DOMAIN=https://npm.onmicrosoft.cn +# VITE_ORIGIN= + +# 错误监控上报 url +VITE_ERROR_MONITOR_URL=/platform-center/api/platform/monitoring/event +# 是否开启错误监控 +VITE_ERROR_MONITOR=false diff --git a/packages/design-core/.env.development b/packages/design-core/.env.development new file mode 100644 index 0000000..05e65af --- /dev/null +++ b/packages/design-core/.env.development @@ -0,0 +1,6 @@ +# development mode, used by the "vite" command + +NODE_ENV=development +VITE_CDN_DOMAIN=https://npm.onmicrosoft.cn +# request data via alpha service +# VITE_ORIGIN= \ No newline at end of file diff --git a/packages/design-core/.env.prod b/packages/design-core/.env.prod new file mode 100644 index 0000000..00c129a --- /dev/null +++ b/packages/design-core/.env.prod @@ -0,0 +1,5 @@ +# prod mode, used by the "build:prod" script + +NODE_ENV=production +VITE_CDN_DOMAIN=https://npm.onmicrosoft.cn +#VITE_ORIGIN= \ No newline at end of file diff --git a/packages/design-core/.npmignore b/packages/design-core/.npmignore new file mode 100644 index 0000000..474a335 --- /dev/null +++ b/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/packages/design-core/assets/AI.png b/packages/design-core/assets/AI.png new file mode 100644 index 0000000..05ea374 Binary files /dev/null and b/packages/design-core/assets/AI.png differ diff --git a/packages/design-core/assets/accessdeclined.svg b/packages/design-core/assets/accessdeclined.svg new file mode 100644 index 0000000..ecc26a9 --- /dev/null +++ b/packages/design-core/assets/accessdeclined.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/accordion.svg b/packages/design-core/assets/accordion.svg new file mode 100644 index 0000000..a58c5db --- /dev/null +++ b/packages/design-core/assets/accordion.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/achart.svg b/packages/design-core/assets/achart.svg new file mode 100644 index 0000000..3f0b059 --- /dev/null +++ b/packages/design-core/assets/achart.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/add-collection.svg b/packages/design-core/assets/add-collection.svg new file mode 100644 index 0000000..322b2e7 --- /dev/null +++ b/packages/design-core/assets/add-collection.svg @@ -0,0 +1,13 @@ + + + 操作/添加 2 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/add-folder.svg b/packages/design-core/assets/add-folder.svg new file mode 100644 index 0000000..a357eb3 --- /dev/null +++ b/packages/design-core/assets/add-folder.svg @@ -0,0 +1,12 @@ + + + 类型/新建文件夹 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/add-group.svg b/packages/design-core/assets/add-group.svg new file mode 100644 index 0000000..23a31ee --- /dev/null +++ b/packages/design-core/assets/add-group.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/design-core/assets/add-page-new.svg b/packages/design-core/assets/add-page-new.svg new file mode 100644 index 0000000..55ca792 --- /dev/null +++ b/packages/design-core/assets/add-page-new.svg @@ -0,0 +1,13 @@ + + + 操作/添加 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/add-page.svg b/packages/design-core/assets/add-page.svg new file mode 100644 index 0000000..011725e --- /dev/null +++ b/packages/design-core/assets/add-page.svg @@ -0,0 +1,9 @@ + + ic_redirect_plus_lined + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/add-utils.svg b/packages/design-core/assets/add-utils.svg new file mode 100644 index 0000000..23b8ea0 --- /dev/null +++ b/packages/design-core/assets/add-utils.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/design-core/assets/add.svg b/packages/design-core/assets/add.svg new file mode 100644 index 0000000..44f21fa --- /dev/null +++ b/packages/design-core/assets/add.svg @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/alert.svg b/packages/design-core/assets/alert.svg new file mode 100644 index 0000000..02be2f4 --- /dev/null +++ b/packages/design-core/assets/alert.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/align-content-center.svg b/packages/design-core/assets/align-content-center.svg new file mode 100644 index 0000000..9005992 --- /dev/null +++ b/packages/design-core/assets/align-content-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-content-end.svg b/packages/design-core/assets/align-content-end.svg new file mode 100644 index 0000000..1009658 --- /dev/null +++ b/packages/design-core/assets/align-content-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-content-space-around.svg b/packages/design-core/assets/align-content-space-around.svg new file mode 100644 index 0000000..c200c8e --- /dev/null +++ b/packages/design-core/assets/align-content-space-around.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-content-space-between.svg b/packages/design-core/assets/align-content-space-between.svg new file mode 100644 index 0000000..90e9cc8 --- /dev/null +++ b/packages/design-core/assets/align-content-space-between.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-content-start.svg b/packages/design-core/assets/align-content-start.svg new file mode 100644 index 0000000..8acd3ae --- /dev/null +++ b/packages/design-core/assets/align-content-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-content-stretch.svg b/packages/design-core/assets/align-content-stretch.svg new file mode 100644 index 0000000..6f13565 --- /dev/null +++ b/packages/design-core/assets/align-content-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-items-baseline.svg b/packages/design-core/assets/align-items-baseline.svg new file mode 100644 index 0000000..be7f60e --- /dev/null +++ b/packages/design-core/assets/align-items-baseline.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-items-center.svg b/packages/design-core/assets/align-items-center.svg new file mode 100644 index 0000000..ac4d44c --- /dev/null +++ b/packages/design-core/assets/align-items-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-items-end.svg b/packages/design-core/assets/align-items-end.svg new file mode 100644 index 0000000..cda47ff --- /dev/null +++ b/packages/design-core/assets/align-items-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-items-start.svg b/packages/design-core/assets/align-items-start.svg new file mode 100644 index 0000000..b52a39b --- /dev/null +++ b/packages/design-core/assets/align-items-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/align-items-stretch.svg b/packages/design-core/assets/align-items-stretch.svg new file mode 100644 index 0000000..7cf7af4 --- /dev/null +++ b/packages/design-core/assets/align-items-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/background-color.svg b/packages/design-core/assets/background-color.svg new file mode 100644 index 0000000..5a5b788 --- /dev/null +++ b/packages/design-core/assets/background-color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/background-image.svg b/packages/design-core/assets/background-image.svg new file mode 100644 index 0000000..229cae5 --- /dev/null +++ b/packages/design-core/assets/background-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/bar.svg b/packages/design-core/assets/bar.svg new file mode 100644 index 0000000..5f95d02 --- /dev/null +++ b/packages/design-core/assets/bar.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/basic-search.svg b/packages/design-core/assets/basic-search.svg new file mode 100644 index 0000000..c819bf7 --- /dev/null +++ b/packages/design-core/assets/basic-search.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/bdlayout.svg b/packages/design-core/assets/bdlayout.svg new file mode 100644 index 0000000..213803f --- /dev/null +++ b/packages/design-core/assets/bdlayout.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/packages/design-core/assets/beingmaintained.svg b/packages/design-core/assets/beingmaintained.svg new file mode 100644 index 0000000..ce9ff98 --- /dev/null +++ b/packages/design-core/assets/beingmaintained.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/bem.svg b/packages/design-core/assets/bem.svg new file mode 100644 index 0000000..d8b74b2 --- /dev/null +++ b/packages/design-core/assets/bem.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/beta.svg b/packages/design-core/assets/beta.svg new file mode 100644 index 0000000..d9bb147 --- /dev/null +++ b/packages/design-core/assets/beta.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/bind-variable.svg b/packages/design-core/assets/bind-variable.svg new file mode 100644 index 0000000..9ccc2b6 --- /dev/null +++ b/packages/design-core/assets/bind-variable.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/block-default-img.svg b/packages/design-core/assets/block-default-img.svg new file mode 100644 index 0000000..543ff6a --- /dev/null +++ b/packages/design-core/assets/block-default-img.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/block-manage.svg b/packages/design-core/assets/block-manage.svg new file mode 100644 index 0000000..9ad7e7b --- /dev/null +++ b/packages/design-core/assets/block-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-all.svg b/packages/design-core/assets/border-all.svg new file mode 100644 index 0000000..4ffa181 --- /dev/null +++ b/packages/design-core/assets/border-all.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-bottom.svg b/packages/design-core/assets/border-bottom.svg new file mode 100644 index 0000000..8f93e91 --- /dev/null +++ b/packages/design-core/assets/border-bottom.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-left.svg b/packages/design-core/assets/border-left.svg new file mode 100644 index 0000000..a6f8940 --- /dev/null +++ b/packages/design-core/assets/border-left.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-radius-bottomleft.svg b/packages/design-core/assets/border-radius-bottomleft.svg new file mode 100644 index 0000000..59f226f --- /dev/null +++ b/packages/design-core/assets/border-radius-bottomleft.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-radius-bottomright.svg b/packages/design-core/assets/border-radius-bottomright.svg new file mode 100644 index 0000000..d271d9e --- /dev/null +++ b/packages/design-core/assets/border-radius-bottomright.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-radius-multiple.svg b/packages/design-core/assets/border-radius-multiple.svg new file mode 100644 index 0000000..f1fef4b --- /dev/null +++ b/packages/design-core/assets/border-radius-multiple.svg @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-radius-single.svg b/packages/design-core/assets/border-radius-single.svg new file mode 100644 index 0000000..be7c187 --- /dev/null +++ b/packages/design-core/assets/border-radius-single.svg @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-radius-topleft.svg b/packages/design-core/assets/border-radius-topleft.svg new file mode 100644 index 0000000..b9fb600 --- /dev/null +++ b/packages/design-core/assets/border-radius-topleft.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-radius-topright.svg b/packages/design-core/assets/border-radius-topright.svg new file mode 100644 index 0000000..dce377c --- /dev/null +++ b/packages/design-core/assets/border-radius-topright.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-right.svg b/packages/design-core/assets/border-right.svg new file mode 100644 index 0000000..3692a90 --- /dev/null +++ b/packages/design-core/assets/border-right.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-style-dashed.svg b/packages/design-core/assets/border-style-dashed.svg new file mode 100644 index 0000000..df7c5c9 --- /dev/null +++ b/packages/design-core/assets/border-style-dashed.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-style-dotted.svg b/packages/design-core/assets/border-style-dotted.svg new file mode 100644 index 0000000..2318c01 --- /dev/null +++ b/packages/design-core/assets/border-style-dotted.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-style-solid.svg b/packages/design-core/assets/border-style-solid.svg new file mode 100644 index 0000000..1fa74bb --- /dev/null +++ b/packages/design-core/assets/border-style-solid.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/border-top.svg b/packages/design-core/assets/border-top.svg new file mode 100644 index 0000000..b73d8a4 --- /dev/null +++ b/packages/design-core/assets/border-top.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/box.svg b/packages/design-core/assets/box.svg new file mode 100644 index 0000000..582efb3 --- /dev/null +++ b/packages/design-core/assets/box.svg @@ -0,0 +1,10 @@ + + + + diff --git a/packages/design-core/assets/breadcrumb.svg b/packages/design-core/assets/breadcrumb.svg new file mode 100644 index 0000000..bd90eda --- /dev/null +++ b/packages/design-core/assets/breadcrumb.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/packages/design-core/assets/bridge.svg b/packages/design-core/assets/bridge.svg new file mode 100644 index 0000000..53d4fd6 --- /dev/null +++ b/packages/design-core/assets/bridge.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/button.svg b/packages/design-core/assets/button.svg new file mode 100644 index 0000000..b0e05b7 --- /dev/null +++ b/packages/design-core/assets/button.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/buttons.svg b/packages/design-core/assets/buttons.svg new file mode 100644 index 0000000..b9efa9c --- /dev/null +++ b/packages/design-core/assets/buttons.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/packages/design-core/assets/cancel-full-screen.svg b/packages/design-core/assets/cancel-full-screen.svg new file mode 100644 index 0000000..f2ae2e9 --- /dev/null +++ b/packages/design-core/assets/cancel-full-screen.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/canvas-fit.svg b/packages/design-core/assets/canvas-fit.svg new file mode 100644 index 0000000..ac33f3c --- /dev/null +++ b/packages/design-core/assets/canvas-fit.svg @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/carousel.svg b/packages/design-core/assets/carousel.svg new file mode 100644 index 0000000..0da9548 --- /dev/null +++ b/packages/design-core/assets/carousel.svg @@ -0,0 +1,15 @@ + + + + + + + diff --git a/packages/design-core/assets/carouselitem.svg b/packages/design-core/assets/carouselitem.svg new file mode 100644 index 0000000..b40cfe4 --- /dev/null +++ b/packages/design-core/assets/carouselitem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/chat-maximize.svg b/packages/design-core/assets/chat-maximize.svg new file mode 100644 index 0000000..0ea8607 --- /dev/null +++ b/packages/design-core/assets/chat-maximize.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/chat-message.svg b/packages/design-core/assets/chat-message.svg new file mode 100644 index 0000000..9e7fd69 --- /dev/null +++ b/packages/design-core/assets/chat-message.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/chat-microphone.svg b/packages/design-core/assets/chat-microphone.svg new file mode 100644 index 0000000..486f8a6 --- /dev/null +++ b/packages/design-core/assets/chat-microphone.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/chat-minimize.svg b/packages/design-core/assets/chat-minimize.svg new file mode 100644 index 0000000..88f0c3f --- /dev/null +++ b/packages/design-core/assets/chat-minimize.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/design-core/assets/checkbox.svg b/packages/design-core/assets/checkbox.svg new file mode 100644 index 0000000..f2de5a9 --- /dev/null +++ b/packages/design-core/assets/checkbox.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/packages/design-core/assets/checkboxgroup.svg b/packages/design-core/assets/checkboxgroup.svg new file mode 100644 index 0000000..b312c70 --- /dev/null +++ b/packages/design-core/assets/checkboxgroup.svg @@ -0,0 +1,10 @@ + + + + diff --git a/packages/design-core/assets/checkboxs.svg b/packages/design-core/assets/checkboxs.svg new file mode 100644 index 0000000..fdbbaa2 --- /dev/null +++ b/packages/design-core/assets/checkboxs.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/checkin.svg b/packages/design-core/assets/checkin.svg new file mode 100644 index 0000000..3ad506e --- /dev/null +++ b/packages/design-core/assets/checkin.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/checkout.svg b/packages/design-core/assets/checkout.svg new file mode 100644 index 0000000..ca19c63 --- /dev/null +++ b/packages/design-core/assets/checkout.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/clear.svg b/packages/design-core/assets/clear.svg new file mode 100644 index 0000000..8619e21 --- /dev/null +++ b/packages/design-core/assets/clear.svg @@ -0,0 +1,13 @@ + + + ic_eraser_lined + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/clock-small.svg b/packages/design-core/assets/clock-small.svg new file mode 100644 index 0000000..e2b9ae8 --- /dev/null +++ b/packages/design-core/assets/clock-small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/clock-wise-counter.svg b/packages/design-core/assets/clock-wise-counter.svg new file mode 100644 index 0000000..c1737d2 --- /dev/null +++ b/packages/design-core/assets/clock-wise-counter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/clock-wise.svg b/packages/design-core/assets/clock-wise.svg new file mode 100644 index 0000000..ec7b481 --- /dev/null +++ b/packages/design-core/assets/clock-wise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/close.svg b/packages/design-core/assets/close.svg new file mode 100644 index 0000000..ce53f7c --- /dev/null +++ b/packages/design-core/assets/close.svg @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/closest-corner.svg b/packages/design-core/assets/closest-corner.svg new file mode 100644 index 0000000..8defcf2 --- /dev/null +++ b/packages/design-core/assets/closest-corner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/closest-side.svg b/packages/design-core/assets/closest-side.svg new file mode 100644 index 0000000..37515b3 --- /dev/null +++ b/packages/design-core/assets/closest-side.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cloud-shell.svg b/packages/design-core/assets/cloud-shell.svg new file mode 100644 index 0000000..e04bbba --- /dev/null +++ b/packages/design-core/assets/cloud-shell.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/cn.svg b/packages/design-core/assets/cn.svg new file mode 100644 index 0000000..17459c6 --- /dev/null +++ b/packages/design-core/assets/cn.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/packages/design-core/assets/col.svg b/packages/design-core/assets/col.svg new file mode 100644 index 0000000..fbda1f5 --- /dev/null +++ b/packages/design-core/assets/col.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/design-core/assets/collapse.svg b/packages/design-core/assets/collapse.svg new file mode 100644 index 0000000..080b417 --- /dev/null +++ b/packages/design-core/assets/collapse.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/packages/design-core/assets/collection.svg b/packages/design-core/assets/collection.svg new file mode 100644 index 0000000..8f455f9 --- /dev/null +++ b/packages/design-core/assets/collection.svg @@ -0,0 +1,11 @@ + + + + diff --git a/packages/design-core/assets/copy-outline.svg b/packages/design-core/assets/copy-outline.svg new file mode 100644 index 0000000..d6c3e64 --- /dev/null +++ b/packages/design-core/assets/copy-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/copy.svg b/packages/design-core/assets/copy.svg new file mode 100644 index 0000000..f8d5297 --- /dev/null +++ b/packages/design-core/assets/copy.svg @@ -0,0 +1,8 @@ + + + 操作/复制 + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/cross.svg b/packages/design-core/assets/cross.svg new file mode 100644 index 0000000..4bdee7c --- /dev/null +++ b/packages/design-core/assets/cross.svg @@ -0,0 +1,10 @@ + + + 全局/关闭 + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-alias.svg b/packages/design-core/assets/cursor-alias.svg new file mode 100644 index 0000000..cf615aa --- /dev/null +++ b/packages/design-core/assets/cursor-alias.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-auto.svg b/packages/design-core/assets/cursor-auto.svg new file mode 100644 index 0000000..a2ecb13 --- /dev/null +++ b/packages/design-core/assets/cursor-auto.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-cell.svg b/packages/design-core/assets/cursor-cell.svg new file mode 100644 index 0000000..b5ddd25 --- /dev/null +++ b/packages/design-core/assets/cursor-cell.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-col-resize.svg b/packages/design-core/assets/cursor-col-resize.svg new file mode 100644 index 0000000..7ee4630 --- /dev/null +++ b/packages/design-core/assets/cursor-col-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-context-menu.svg b/packages/design-core/assets/cursor-context-menu.svg new file mode 100644 index 0000000..88decec --- /dev/null +++ b/packages/design-core/assets/cursor-context-menu.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-copy.svg b/packages/design-core/assets/cursor-copy.svg new file mode 100644 index 0000000..fe39ffb --- /dev/null +++ b/packages/design-core/assets/cursor-copy.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-crosshair.svg b/packages/design-core/assets/cursor-crosshair.svg new file mode 100644 index 0000000..3a94a5e --- /dev/null +++ b/packages/design-core/assets/cursor-crosshair.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-e-resize.svg b/packages/design-core/assets/cursor-e-resize.svg new file mode 100644 index 0000000..5032785 --- /dev/null +++ b/packages/design-core/assets/cursor-e-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-ew-resize.svg b/packages/design-core/assets/cursor-ew-resize.svg new file mode 100644 index 0000000..74f7a48 --- /dev/null +++ b/packages/design-core/assets/cursor-ew-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-grab.svg b/packages/design-core/assets/cursor-grab.svg new file mode 100644 index 0000000..8ff2b2c --- /dev/null +++ b/packages/design-core/assets/cursor-grab.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-grabbing.svg b/packages/design-core/assets/cursor-grabbing.svg new file mode 100644 index 0000000..47df374 --- /dev/null +++ b/packages/design-core/assets/cursor-grabbing.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-help.svg b/packages/design-core/assets/cursor-help.svg new file mode 100644 index 0000000..952c6ec --- /dev/null +++ b/packages/design-core/assets/cursor-help.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-move.svg b/packages/design-core/assets/cursor-move.svg new file mode 100644 index 0000000..da2d388 --- /dev/null +++ b/packages/design-core/assets/cursor-move.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-n-resize.svg b/packages/design-core/assets/cursor-n-resize.svg new file mode 100644 index 0000000..b7295e2 --- /dev/null +++ b/packages/design-core/assets/cursor-n-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-ne-resize.svg b/packages/design-core/assets/cursor-ne-resize.svg new file mode 100644 index 0000000..9ba4622 --- /dev/null +++ b/packages/design-core/assets/cursor-ne-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-nesw-resize.svg b/packages/design-core/assets/cursor-nesw-resize.svg new file mode 100644 index 0000000..b2bc180 --- /dev/null +++ b/packages/design-core/assets/cursor-nesw-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-none.svg b/packages/design-core/assets/cursor-none.svg new file mode 100644 index 0000000..a3d7e3e --- /dev/null +++ b/packages/design-core/assets/cursor-none.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-not-allowed.svg b/packages/design-core/assets/cursor-not-allowed.svg new file mode 100644 index 0000000..324df30 --- /dev/null +++ b/packages/design-core/assets/cursor-not-allowed.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-ns-resize.svg b/packages/design-core/assets/cursor-ns-resize.svg new file mode 100644 index 0000000..ff628d1 --- /dev/null +++ b/packages/design-core/assets/cursor-ns-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-nw-resize.svg b/packages/design-core/assets/cursor-nw-resize.svg new file mode 100644 index 0000000..e00c770 --- /dev/null +++ b/packages/design-core/assets/cursor-nw-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-nwse-resize.svg b/packages/design-core/assets/cursor-nwse-resize.svg new file mode 100644 index 0000000..fa046f6 --- /dev/null +++ b/packages/design-core/assets/cursor-nwse-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-pointer.svg b/packages/design-core/assets/cursor-pointer.svg new file mode 100644 index 0000000..5e798a4 --- /dev/null +++ b/packages/design-core/assets/cursor-pointer.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-progress.svg b/packages/design-core/assets/cursor-progress.svg new file mode 100644 index 0000000..c6a2771 --- /dev/null +++ b/packages/design-core/assets/cursor-progress.svg @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-row-resize.svg b/packages/design-core/assets/cursor-row-resize.svg new file mode 100644 index 0000000..7ca65ed --- /dev/null +++ b/packages/design-core/assets/cursor-row-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-s-resize.svg b/packages/design-core/assets/cursor-s-resize.svg new file mode 100644 index 0000000..1d18741 --- /dev/null +++ b/packages/design-core/assets/cursor-s-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-se-resize.svg b/packages/design-core/assets/cursor-se-resize.svg new file mode 100644 index 0000000..3faeb42 --- /dev/null +++ b/packages/design-core/assets/cursor-se-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-sw-resize.svg b/packages/design-core/assets/cursor-sw-resize.svg new file mode 100644 index 0000000..c88a666 --- /dev/null +++ b/packages/design-core/assets/cursor-sw-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-text.svg b/packages/design-core/assets/cursor-text.svg new file mode 100644 index 0000000..d486055 --- /dev/null +++ b/packages/design-core/assets/cursor-text.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-vertical-text.svg b/packages/design-core/assets/cursor-vertical-text.svg new file mode 100644 index 0000000..a699b14 --- /dev/null +++ b/packages/design-core/assets/cursor-vertical-text.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-w-resize.svg b/packages/design-core/assets/cursor-w-resize.svg new file mode 100644 index 0000000..16c98fd --- /dev/null +++ b/packages/design-core/assets/cursor-w-resize.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-wait.svg b/packages/design-core/assets/cursor-wait.svg new file mode 100644 index 0000000..0528fb3 --- /dev/null +++ b/packages/design-core/assets/cursor-wait.svg @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-zoom-in.svg b/packages/design-core/assets/cursor-zoom-in.svg new file mode 100644 index 0000000..2801ba5 --- /dev/null +++ b/packages/design-core/assets/cursor-zoom-in.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/cursor-zoom-out.svg b/packages/design-core/assets/cursor-zoom-out.svg new file mode 100644 index 0000000..f4c5704 --- /dev/null +++ b/packages/design-core/assets/cursor-zoom-out.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/data.svg b/packages/design-core/assets/data.svg new file mode 100644 index 0000000..de1c97b --- /dev/null +++ b/packages/design-core/assets/data.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/datepick.svg b/packages/design-core/assets/datepick.svg new file mode 100644 index 0000000..677b860 --- /dev/null +++ b/packages/design-core/assets/datepick.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/packages/design-core/assets/daterange.svg b/packages/design-core/assets/daterange.svg new file mode 100644 index 0000000..9159c82 --- /dev/null +++ b/packages/design-core/assets/daterange.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/delete.svg b/packages/design-core/assets/delete.svg new file mode 100644 index 0000000..03d1807 --- /dev/null +++ b/packages/design-core/assets/delete.svg @@ -0,0 +1,11 @@ + + + 操作/删除 + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/descend.svg b/packages/design-core/assets/descend.svg new file mode 100644 index 0000000..d1bdb91 --- /dev/null +++ b/packages/design-core/assets/descend.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/desktop-large.svg b/packages/design-core/assets/desktop-large.svg new file mode 100644 index 0000000..51690b6 --- /dev/null +++ b/packages/design-core/assets/desktop-large.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/dialogbox.svg b/packages/design-core/assets/dialogbox.svg new file mode 100644 index 0000000..3889208 --- /dev/null +++ b/packages/design-core/assets/dialogbox.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/display-block.svg b/packages/design-core/assets/display-block.svg new file mode 100644 index 0000000..99e4c35 --- /dev/null +++ b/packages/design-core/assets/display-block.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/display-flex.svg b/packages/design-core/assets/display-flex.svg new file mode 100644 index 0000000..98bdc1d --- /dev/null +++ b/packages/design-core/assets/display-flex.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/display-grid.svg b/packages/design-core/assets/display-grid.svg new file mode 100644 index 0000000..305e298 --- /dev/null +++ b/packages/design-core/assets/display-grid.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/display-inline-block.svg b/packages/design-core/assets/display-inline-block.svg new file mode 100644 index 0000000..1c10000 --- /dev/null +++ b/packages/design-core/assets/display-inline-block.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/display-inline.svg b/packages/design-core/assets/display-inline.svg new file mode 100644 index 0000000..214c2a4 --- /dev/null +++ b/packages/design-core/assets/display-inline.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/dragger.svg b/packages/design-core/assets/dragger.svg new file mode 100644 index 0000000..ed906ca --- /dev/null +++ b/packages/design-core/assets/dragger.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/dropdown.svg b/packages/design-core/assets/dropdown.svg new file mode 100644 index 0000000..bf4ce3d --- /dev/null +++ b/packages/design-core/assets/dropdown.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/edit.svg b/packages/design-core/assets/edit.svg new file mode 100644 index 0000000..aeafe44 --- /dev/null +++ b/packages/design-core/assets/edit.svg @@ -0,0 +1,11 @@ + + + 操作/编辑 2 + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/ellipsis.svg b/packages/design-core/assets/ellipsis.svg new file mode 100644 index 0000000..7f0e7b6 --- /dev/null +++ b/packages/design-core/assets/ellipsis.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/empty-action.svg b/packages/design-core/assets/empty-action.svg new file mode 100644 index 0000000..357df95 --- /dev/null +++ b/packages/design-core/assets/empty-action.svg @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/empty-data.svg b/packages/design-core/assets/empty-data.svg new file mode 100644 index 0000000..26dccc9 --- /dev/null +++ b/packages/design-core/assets/empty-data.svg @@ -0,0 +1,19 @@ + + emptydata + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/empty.svg b/packages/design-core/assets/empty.svg new file mode 100644 index 0000000..055253a --- /dev/null +++ b/packages/design-core/assets/empty.svg @@ -0,0 +1,27 @@ + + + 空数据 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/en.svg b/packages/design-core/assets/en.svg new file mode 100644 index 0000000..877870f --- /dev/null +++ b/packages/design-core/assets/en.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/error.svg b/packages/design-core/assets/error.svg new file mode 100644 index 0000000..9da1b4b --- /dev/null +++ b/packages/design-core/assets/error.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/events.svg b/packages/design-core/assets/events.svg new file mode 100644 index 0000000..d96ad7e --- /dev/null +++ b/packages/design-core/assets/events.svg @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/expand.svg b/packages/design-core/assets/expand.svg new file mode 100644 index 0000000..3a6bfa6 --- /dev/null +++ b/packages/design-core/assets/expand.svg @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/eye-invisible.svg b/packages/design-core/assets/eye-invisible.svg new file mode 100644 index 0000000..cbe2feb --- /dev/null +++ b/packages/design-core/assets/eye-invisible.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/eye.svg b/packages/design-core/assets/eye.svg new file mode 100644 index 0000000..42be6ff --- /dev/null +++ b/packages/design-core/assets/eye.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/farthest-corner.svg b/packages/design-core/assets/farthest-corner.svg new file mode 100644 index 0000000..c791bda --- /dev/null +++ b/packages/design-core/assets/farthest-corner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/farthest-side.svg b/packages/design-core/assets/farthest-side.svg new file mode 100644 index 0000000..f1890e8 --- /dev/null +++ b/packages/design-core/assets/farthest-side.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/fixed.svg b/packages/design-core/assets/fixed.svg new file mode 100644 index 0000000..d7c8ce6 --- /dev/null +++ b/packages/design-core/assets/fixed.svg @@ -0,0 +1,7 @@ + + + 操作/未固定 + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-alignbaselinerow.svg b/packages/design-core/assets/flex-alignbaselinerow.svg new file mode 100644 index 0000000..3609843 --- /dev/null +++ b/packages/design-core/assets/flex-alignbaselinerow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-aligncenterrow.svg b/packages/design-core/assets/flex-aligncenterrow.svg new file mode 100644 index 0000000..8050c98 --- /dev/null +++ b/packages/design-core/assets/flex-aligncenterrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-alignflex-endrow.svg b/packages/design-core/assets/flex-alignflex-endrow.svg new file mode 100644 index 0000000..946d635 --- /dev/null +++ b/packages/design-core/assets/flex-alignflex-endrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-alignflex-startrow.svg b/packages/design-core/assets/flex-alignflex-startrow.svg new file mode 100644 index 0000000..1ae35c0 --- /dev/null +++ b/packages/design-core/assets/flex-alignflex-startrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-alignstretchrow.svg b/packages/design-core/assets/flex-alignstretchrow.svg new file mode 100644 index 0000000..259602e --- /dev/null +++ b/packages/design-core/assets/flex-alignstretchrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-directioncolumn-reverse.svg b/packages/design-core/assets/flex-directioncolumn-reverse.svg new file mode 100644 index 0000000..517c724 --- /dev/null +++ b/packages/design-core/assets/flex-directioncolumn-reverse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-directioncolumn.svg b/packages/design-core/assets/flex-directioncolumn.svg new file mode 100644 index 0000000..2f1ff77 --- /dev/null +++ b/packages/design-core/assets/flex-directioncolumn.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-directionrow-reverse.svg b/packages/design-core/assets/flex-directionrow-reverse.svg new file mode 100644 index 0000000..cbaa8cd --- /dev/null +++ b/packages/design-core/assets/flex-directionrow-reverse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-directionrow.svg b/packages/design-core/assets/flex-directionrow.svg new file mode 100644 index 0000000..bd4b7d5 --- /dev/null +++ b/packages/design-core/assets/flex-directionrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-justifycenterrow.svg b/packages/design-core/assets/flex-justifycenterrow.svg new file mode 100644 index 0000000..bfe683f --- /dev/null +++ b/packages/design-core/assets/flex-justifycenterrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-justifyflex-endrow.svg b/packages/design-core/assets/flex-justifyflex-endrow.svg new file mode 100644 index 0000000..7f970a0 --- /dev/null +++ b/packages/design-core/assets/flex-justifyflex-endrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-justifyflex-startrow.svg b/packages/design-core/assets/flex-justifyflex-startrow.svg new file mode 100644 index 0000000..a788a94 --- /dev/null +++ b/packages/design-core/assets/flex-justifyflex-startrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-justifyspace-aroundrow.svg b/packages/design-core/assets/flex-justifyspace-aroundrow.svg new file mode 100644 index 0000000..063c656 --- /dev/null +++ b/packages/design-core/assets/flex-justifyspace-aroundrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flex-justifyspace-betweenrow.svg b/packages/design-core/assets/flex-justifyspace-betweenrow.svg new file mode 100644 index 0000000..2ceea34 --- /dev/null +++ b/packages/design-core/assets/flex-justifyspace-betweenrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-add.svg b/packages/design-core/assets/flow-add.svg new file mode 100644 index 0000000..73ffde4 --- /dev/null +++ b/packages/design-core/assets/flow-add.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-align-bottom.svg b/packages/design-core/assets/flow-align-bottom.svg new file mode 100644 index 0000000..0ff7d00 --- /dev/null +++ b/packages/design-core/assets/flow-align-bottom.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/design-core/assets/flow-align-left.svg b/packages/design-core/assets/flow-align-left.svg new file mode 100644 index 0000000..e237485 --- /dev/null +++ b/packages/design-core/assets/flow-align-left.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/design-core/assets/flow-align-level.svg b/packages/design-core/assets/flow-align-level.svg new file mode 100644 index 0000000..cdde2e5 --- /dev/null +++ b/packages/design-core/assets/flow-align-level.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/design-core/assets/flow-align-rf.svg b/packages/design-core/assets/flow-align-rf.svg new file mode 100644 index 0000000..d33e4ea --- /dev/null +++ b/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/packages/design-core/assets/flow-align-right.svg b/packages/design-core/assets/flow-align-right.svg new file mode 100644 index 0000000..2fc31a2 --- /dev/null +++ b/packages/design-core/assets/flow-align-right.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/design-core/assets/flow-align-top.svg b/packages/design-core/assets/flow-align-top.svg new file mode 100644 index 0000000..8dcc0f6 --- /dev/null +++ b/packages/design-core/assets/flow-align-top.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/design-core/assets/flow-align-vertical.svg b/packages/design-core/assets/flow-align-vertical.svg new file mode 100644 index 0000000..2963685 --- /dev/null +++ b/packages/design-core/assets/flow-align-vertical.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/design-core/assets/flow-box-select-rf.svg b/packages/design-core/assets/flow-box-select-rf.svg new file mode 100644 index 0000000..402dc90 --- /dev/null +++ b/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/packages/design-core/assets/flow-box-select.svg b/packages/design-core/assets/flow-box-select.svg new file mode 100644 index 0000000..4e9fb70 --- /dev/null +++ b/packages/design-core/assets/flow-box-select.svg @@ -0,0 +1,41 @@ + + + + +Created with Sketch. + + + + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/flow-checkmark.svg b/packages/design-core/assets/flow-checkmark.svg new file mode 100644 index 0000000..799de6c --- /dev/null +++ b/packages/design-core/assets/flow-checkmark.svg @@ -0,0 +1 @@ +checkmark \ No newline at end of file diff --git a/packages/design-core/assets/flow-clear.svg b/packages/design-core/assets/flow-clear.svg new file mode 100644 index 0000000..d0d8780 --- /dev/null +++ b/packages/design-core/assets/flow-clear.svg @@ -0,0 +1,16 @@ + + + icon7 + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-cross.svg b/packages/design-core/assets/flow-cross.svg new file mode 100644 index 0000000..266e8ec --- /dev/null +++ b/packages/design-core/assets/flow-cross.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/flow-delete.svg b/packages/design-core/assets/flow-delete.svg new file mode 100644 index 0000000..47b3f64 --- /dev/null +++ b/packages/design-core/assets/flow-delete.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-download.svg b/packages/design-core/assets/flow-download.svg new file mode 100644 index 0000000..9f7cb78 --- /dev/null +++ b/packages/design-core/assets/flow-download.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/design-core/assets/flow-edit.svg b/packages/design-core/assets/flow-edit.svg new file mode 100644 index 0000000..ea80621 --- /dev/null +++ b/packages/design-core/assets/flow-edit.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-empty.svg b/packages/design-core/assets/flow-empty.svg new file mode 100644 index 0000000..d580e0f --- /dev/null +++ b/packages/design-core/assets/flow-empty.svg @@ -0,0 +1,26 @@ + + 小 暂无数据 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-failure.svg b/packages/design-core/assets/flow-failure.svg new file mode 100644 index 0000000..cd15fca --- /dev/null +++ b/packages/design-core/assets/flow-failure.svg @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-file-download.svg b/packages/design-core/assets/flow-file-download.svg new file mode 100644 index 0000000..f215dc1 --- /dev/null +++ b/packages/design-core/assets/flow-file-download.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/design-core/assets/flow-fullscreen-icon.svg b/packages/design-core/assets/flow-fullscreen-icon.svg new file mode 100644 index 0000000..8b8b07b --- /dev/null +++ b/packages/design-core/assets/flow-fullscreen-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/design-core/assets/flow-guide.svg b/packages/design-core/assets/flow-guide.svg new file mode 100644 index 0000000..8ad4496 --- /dev/null +++ b/packages/design-core/assets/flow-guide.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-help-center.svg b/packages/design-core/assets/flow-help-center.svg new file mode 100644 index 0000000..cb1234b --- /dev/null +++ b/packages/design-core/assets/flow-help-center.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/flow-location.svg b/packages/design-core/assets/flow-location.svg new file mode 100644 index 0000000..3e18a61 --- /dev/null +++ b/packages/design-core/assets/flow-location.svg @@ -0,0 +1,21 @@ + + + icon5 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-minscreen-icon.svg b/packages/design-core/assets/flow-minscreen-icon.svg new file mode 100644 index 0000000..8c0f398 --- /dev/null +++ b/packages/design-core/assets/flow-minscreen-icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/flow-navigation.svg b/packages/design-core/assets/flow-navigation.svg new file mode 100644 index 0000000..cc1b5ca --- /dev/null +++ b/packages/design-core/assets/flow-navigation.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/design-core/assets/flow-params-rf.svg b/packages/design-core/assets/flow-params-rf.svg new file mode 100644 index 0000000..9f701ac --- /dev/null +++ b/packages/design-core/assets/flow-params-rf.svg @@ -0,0 +1,9 @@ + + + 画板 + + + + + + diff --git a/packages/design-core/assets/flow-params.svg b/packages/design-core/assets/flow-params.svg new file mode 100644 index 0000000..a4f7bed --- /dev/null +++ b/packages/design-core/assets/flow-params.svg @@ -0,0 +1,49 @@ + + + 编组 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-prompt.svg b/packages/design-core/assets/flow-prompt.svg new file mode 100644 index 0000000..58b2bad --- /dev/null +++ b/packages/design-core/assets/flow-prompt.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-redo.svg b/packages/design-core/assets/flow-redo.svg new file mode 100644 index 0000000..0361bdd --- /dev/null +++ b/packages/design-core/assets/flow-redo.svg @@ -0,0 +1,15 @@ + + + xiugai111 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-reduce.svg b/packages/design-core/assets/flow-reduce.svg new file mode 100644 index 0000000..460059e --- /dev/null +++ b/packages/design-core/assets/flow-reduce.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-refresh.svg b/packages/design-core/assets/flow-refresh.svg new file mode 100644 index 0000000..dfc3c4a --- /dev/null +++ b/packages/design-core/assets/flow-refresh.svg @@ -0,0 +1,12 @@ + + + 刷新 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-requirestar.svg b/packages/design-core/assets/flow-requirestar.svg new file mode 100644 index 0000000..4d42822 --- /dev/null +++ b/packages/design-core/assets/flow-requirestar.svg @@ -0,0 +1,14 @@ + + + 星号 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-select.svg b/packages/design-core/assets/flow-select.svg new file mode 100644 index 0000000..68445c1 --- /dev/null +++ b/packages/design-core/assets/flow-select.svg @@ -0,0 +1,18 @@ + + + + +Created with Sketch. + + + + + + + + diff --git a/packages/design-core/assets/flow-set-bottom.svg b/packages/design-core/assets/flow-set-bottom.svg new file mode 100644 index 0000000..c34ff14 --- /dev/null +++ b/packages/design-core/assets/flow-set-bottom.svg @@ -0,0 +1,27 @@ + + + icon0 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-set-top.svg b/packages/design-core/assets/flow-set-top.svg new file mode 100644 index 0000000..b78cb94 --- /dev/null +++ b/packages/design-core/assets/flow-set-top.svg @@ -0,0 +1,27 @@ + + + icon-a + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-success.svg b/packages/design-core/assets/flow-success.svg new file mode 100644 index 0000000..c75a6c6 --- /dev/null +++ b/packages/design-core/assets/flow-success.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-undo.svg b/packages/design-core/assets/flow-undo.svg new file mode 100644 index 0000000..a6dcf09 --- /dev/null +++ b/packages/design-core/assets/flow-undo.svg @@ -0,0 +1,16 @@ + + + xiugai111 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-view-rf.svg b/packages/design-core/assets/flow-view-rf.svg new file mode 100644 index 0000000..6c934fb --- /dev/null +++ b/packages/design-core/assets/flow-view-rf.svg @@ -0,0 +1,13 @@ + + + 编组 31 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-view.svg b/packages/design-core/assets/flow-view.svg new file mode 100644 index 0000000..0568015 --- /dev/null +++ b/packages/design-core/assets/flow-view.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/packages/design-core/assets/flow-zoom-in.svg b/packages/design-core/assets/flow-zoom-in.svg new file mode 100644 index 0000000..ae64378 --- /dev/null +++ b/packages/design-core/assets/flow-zoom-in.svg @@ -0,0 +1,12 @@ + + + icon4 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/flow-zoom-out.svg b/packages/design-core/assets/flow-zoom-out.svg new file mode 100644 index 0000000..4a0300b --- /dev/null +++ b/packages/design-core/assets/flow-zoom-out.svg @@ -0,0 +1,12 @@ + + + icon4 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/fold-outline.svg b/packages/design-core/assets/fold-outline.svg new file mode 100644 index 0000000..a13f5ec --- /dev/null +++ b/packages/design-core/assets/fold-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/folder-wold.svg b/packages/design-core/assets/folder-wold.svg new file mode 100644 index 0000000..1aa966c --- /dev/null +++ b/packages/design-core/assets/folder-wold.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/folder.svg b/packages/design-core/assets/folder.svg new file mode 100644 index 0000000..ce14556 --- /dev/null +++ b/packages/design-core/assets/folder.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/font-style-italic.svg b/packages/design-core/assets/font-style-italic.svg new file mode 100644 index 0000000..cbb3036 --- /dev/null +++ b/packages/design-core/assets/font-style-italic.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/font-style-none.svg b/packages/design-core/assets/font-style-none.svg new file mode 100644 index 0000000..8dcdd57 --- /dev/null +++ b/packages/design-core/assets/font-style-none.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/form.svg b/packages/design-core/assets/form.svg new file mode 100644 index 0000000..3eb5cf0 --- /dev/null +++ b/packages/design-core/assets/form.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/formfield.svg b/packages/design-core/assets/formfield.svg new file mode 100644 index 0000000..35daddc --- /dev/null +++ b/packages/design-core/assets/formfield.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/packages/design-core/assets/formitem.svg b/packages/design-core/assets/formitem.svg new file mode 100644 index 0000000..c097e40 --- /dev/null +++ b/packages/design-core/assets/formitem.svg @@ -0,0 +1,2 @@ + + diff --git a/packages/design-core/assets/frozenpage.svg b/packages/design-core/assets/frozenpage.svg new file mode 100644 index 0000000..5f6066f --- /dev/null +++ b/packages/design-core/assets/frozenpage.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/full-screen.svg b/packages/design-core/assets/full-screen.svg new file mode 100644 index 0000000..71f2eb1 --- /dev/null +++ b/packages/design-core/assets/full-screen.svg @@ -0,0 +1,30 @@ + + + 操作/全屏 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/generate-code.svg b/packages/design-core/assets/generate-code.svg new file mode 100644 index 0000000..2c78583 --- /dev/null +++ b/packages/design-core/assets/generate-code.svg @@ -0,0 +1,17 @@ + + + 操作/下载 + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/grid-column-flex.svg b/packages/design-core/assets/grid-column-flex.svg new file mode 100644 index 0000000..c855bf0 --- /dev/null +++ b/packages/design-core/assets/grid-column-flex.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/grid-row-auto.svg b/packages/design-core/assets/grid-row-auto.svg new file mode 100644 index 0000000..c0e1295 --- /dev/null +++ b/packages/design-core/assets/grid-row-auto.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/grid.svg b/packages/design-core/assets/grid.svg new file mode 100644 index 0000000..32abffe --- /dev/null +++ b/packages/design-core/assets/grid.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/h1.svg b/packages/design-core/assets/h1.svg new file mode 100644 index 0000000..79506ba --- /dev/null +++ b/packages/design-core/assets/h1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/h16.svg b/packages/design-core/assets/h16.svg new file mode 100644 index 0000000..c3f7d7f --- /dev/null +++ b/packages/design-core/assets/h16.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/packages/design-core/assets/h2.svg b/packages/design-core/assets/h2.svg new file mode 100644 index 0000000..34ee332 --- /dev/null +++ b/packages/design-core/assets/h2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/h3.svg b/packages/design-core/assets/h3.svg new file mode 100644 index 0000000..85f4886 --- /dev/null +++ b/packages/design-core/assets/h3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/h4.svg b/packages/design-core/assets/h4.svg new file mode 100644 index 0000000..b3e2183 --- /dev/null +++ b/packages/design-core/assets/h4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/h5.svg b/packages/design-core/assets/h5.svg new file mode 100644 index 0000000..11d5a58 --- /dev/null +++ b/packages/design-core/assets/h5.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/h6.svg b/packages/design-core/assets/h6.svg new file mode 100644 index 0000000..008ebf3 --- /dev/null +++ b/packages/design-core/assets/h6.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/help-center.svg b/packages/design-core/assets/help-center.svg new file mode 100644 index 0000000..45b4885 --- /dev/null +++ b/packages/design-core/assets/help-center.svg @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/help.svg b/packages/design-core/assets/help.svg new file mode 100644 index 0000000..68233e3 --- /dev/null +++ b/packages/design-core/assets/help.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/histogram.svg b/packages/design-core/assets/histogram.svg new file mode 100644 index 0000000..d0ed4ef --- /dev/null +++ b/packages/design-core/assets/histogram.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/home-outline.svg b/packages/design-core/assets/home-outline.svg new file mode 100644 index 0000000..6ccdc65 --- /dev/null +++ b/packages/design-core/assets/home-outline.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/packages/design-core/assets/home.svg b/packages/design-core/assets/home.svg new file mode 100644 index 0000000..2cb522a --- /dev/null +++ b/packages/design-core/assets/home.svg @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/hr.svg b/packages/design-core/assets/hr.svg new file mode 100644 index 0000000..4ae70e2 --- /dev/null +++ b/packages/design-core/assets/hr.svg @@ -0,0 +1,8 @@ + + + + diff --git a/packages/design-core/assets/icon.svg b/packages/design-core/assets/icon.svg new file mode 100644 index 0000000..34dae44 --- /dev/null +++ b/packages/design-core/assets/icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/packages/design-core/assets/image.svg b/packages/design-core/assets/image.svg new file mode 100644 index 0000000..07c59d4 --- /dev/null +++ b/packages/design-core/assets/image.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/packages/design-core/assets/input.svg b/packages/design-core/assets/input.svg new file mode 100644 index 0000000..6a47c50 --- /dev/null +++ b/packages/design-core/assets/input.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/packages/design-core/assets/internationalization.svg b/packages/design-core/assets/internationalization.svg new file mode 100644 index 0000000..e14a32d --- /dev/null +++ b/packages/design-core/assets/internationalization.svg @@ -0,0 +1,13 @@ + + + 国际化 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/js.svg b/packages/design-core/assets/js.svg new file mode 100644 index 0000000..25c11a4 --- /dev/null +++ b/packages/design-core/assets/js.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/design-core/assets/json.svg b/packages/design-core/assets/json.svg new file mode 100644 index 0000000..84ffaee --- /dev/null +++ b/packages/design-core/assets/json.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/justify-content-center.svg b/packages/design-core/assets/justify-content-center.svg new file mode 100644 index 0000000..c34402e --- /dev/null +++ b/packages/design-core/assets/justify-content-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-content-end.svg b/packages/design-core/assets/justify-content-end.svg new file mode 100644 index 0000000..db8fda4 --- /dev/null +++ b/packages/design-core/assets/justify-content-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-content-space-around.svg b/packages/design-core/assets/justify-content-space-around.svg new file mode 100644 index 0000000..e4b2f03 --- /dev/null +++ b/packages/design-core/assets/justify-content-space-around.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-content-space-between.svg b/packages/design-core/assets/justify-content-space-between.svg new file mode 100644 index 0000000..3a1861d --- /dev/null +++ b/packages/design-core/assets/justify-content-space-between.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-content-start.svg b/packages/design-core/assets/justify-content-start.svg new file mode 100644 index 0000000..e9a323a --- /dev/null +++ b/packages/design-core/assets/justify-content-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-content-stretch.svg b/packages/design-core/assets/justify-content-stretch.svg new file mode 100644 index 0000000..fa7ef67 --- /dev/null +++ b/packages/design-core/assets/justify-content-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-items-baseline.svg b/packages/design-core/assets/justify-items-baseline.svg new file mode 100644 index 0000000..bb52268 --- /dev/null +++ b/packages/design-core/assets/justify-items-baseline.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-items-center.svg b/packages/design-core/assets/justify-items-center.svg new file mode 100644 index 0000000..8f1387a --- /dev/null +++ b/packages/design-core/assets/justify-items-center.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-items-end.svg b/packages/design-core/assets/justify-items-end.svg new file mode 100644 index 0000000..20a3fc4 --- /dev/null +++ b/packages/design-core/assets/justify-items-end.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-items-start.svg b/packages/design-core/assets/justify-items-start.svg new file mode 100644 index 0000000..ab1a1a4 --- /dev/null +++ b/packages/design-core/assets/justify-items-start.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/justify-items-stretch.svg b/packages/design-core/assets/justify-items-stretch.svg new file mode 100644 index 0000000..bbc5d53 --- /dev/null +++ b/packages/design-core/assets/justify-items-stretch.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/language.svg b/packages/design-core/assets/language.svg new file mode 100644 index 0000000..068f881 --- /dev/null +++ b/packages/design-core/assets/language.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/packages/design-core/assets/laptop-cut-corner.svg b/packages/design-core/assets/laptop-cut-corner.svg new file mode 100644 index 0000000..3b49fe0 --- /dev/null +++ b/packages/design-core/assets/laptop-cut-corner.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/line.svg b/packages/design-core/assets/line.svg new file mode 100644 index 0000000..a1d1eae --- /dev/null +++ b/packages/design-core/assets/line.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/linear-gradient.svg b/packages/design-core/assets/linear-gradient.svg new file mode 100644 index 0000000..c1c4c32 --- /dev/null +++ b/packages/design-core/assets/linear-gradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/link.svg b/packages/design-core/assets/link.svg new file mode 100644 index 0000000..85f8219 --- /dev/null +++ b/packages/design-core/assets/link.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/packages/design-core/assets/list.svg b/packages/design-core/assets/list.svg new file mode 100644 index 0000000..05edc61 --- /dev/null +++ b/packages/design-core/assets/list.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/loading.svg b/packages/design-core/assets/loading.svg new file mode 100644 index 0000000..299e8aa --- /dev/null +++ b/packages/design-core/assets/loading.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/design-core/assets/location.svg b/packages/design-core/assets/location.svg new file mode 100644 index 0000000..a5e4e9a --- /dev/null +++ b/packages/design-core/assets/location.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/locked-outline.svg b/packages/design-core/assets/locked-outline.svg new file mode 100644 index 0000000..69f5b2e --- /dev/null +++ b/packages/design-core/assets/locked-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/locked.svg b/packages/design-core/assets/locked.svg new file mode 100644 index 0000000..dc8a8eb --- /dev/null +++ b/packages/design-core/assets/locked.svg @@ -0,0 +1,10 @@ + + + ic_locked_lined + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/logout.svg b/packages/design-core/assets/logout.svg new file mode 100644 index 0000000..5026ac9 --- /dev/null +++ b/packages/design-core/assets/logout.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/margin.svg b/packages/design-core/assets/margin.svg new file mode 100644 index 0000000..faf1eb7 --- /dev/null +++ b/packages/design-core/assets/margin.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/materials.svg b/packages/design-core/assets/materials.svg new file mode 100644 index 0000000..7cf24ce --- /dev/null +++ b/packages/design-core/assets/materials.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/menu.svg b/packages/design-core/assets/menu.svg new file mode 100644 index 0000000..9f13785 --- /dev/null +++ b/packages/design-core/assets/menu.svg @@ -0,0 +1,13 @@ + + + ic_menul_line_lined + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/mobile-landscape.svg b/packages/design-core/assets/mobile-landscape.svg new file mode 100644 index 0000000..50786bd --- /dev/null +++ b/packages/design-core/assets/mobile-landscape.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/mobile-portrai.svg b/packages/design-core/assets/mobile-portrai.svg new file mode 100644 index 0000000..7b0a1dd --- /dev/null +++ b/packages/design-core/assets/mobile-portrai.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/new-page.svg b/packages/design-core/assets/new-page.svg new file mode 100644 index 0000000..ef15cdd --- /dev/null +++ b/packages/design-core/assets/new-page.svg @@ -0,0 +1,13 @@ + + + 操作/定位到面板 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/news.svg b/packages/design-core/assets/news.svg new file mode 100644 index 0000000..5b97910 --- /dev/null +++ b/packages/design-core/assets/news.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/nonsupportregion.svg b/packages/design-core/assets/nonsupportregion.svg new file mode 100644 index 0000000..78803a6 --- /dev/null +++ b/packages/design-core/assets/nonsupportregion.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/packages/design-core/assets/notify-alarm.svg b/packages/design-core/assets/notify-alarm.svg new file mode 100644 index 0000000..6525033 --- /dev/null +++ b/packages/design-core/assets/notify-alarm.svg @@ -0,0 +1,11 @@ + + + alarm + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/notify-failure.svg b/packages/design-core/assets/notify-failure.svg new file mode 100644 index 0000000..f43ef8a --- /dev/null +++ b/packages/design-core/assets/notify-failure.svg @@ -0,0 +1,11 @@ + + + failure + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/notify-prompt.svg b/packages/design-core/assets/notify-prompt.svg new file mode 100644 index 0000000..4c88ecc --- /dev/null +++ b/packages/design-core/assets/notify-prompt.svg @@ -0,0 +1,11 @@ + + + prompt + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/notify-success.svg b/packages/design-core/assets/notify-success.svg new file mode 100644 index 0000000..e6308a7 --- /dev/null +++ b/packages/design-core/assets/notify-success.svg @@ -0,0 +1,11 @@ + + + success + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/numeric.svg b/packages/design-core/assets/numeric.svg new file mode 100644 index 0000000..4fc04e7 --- /dev/null +++ b/packages/design-core/assets/numeric.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/overflow-scroll.svg b/packages/design-core/assets/overflow-scroll.svg new file mode 100644 index 0000000..028a7b7 --- /dev/null +++ b/packages/design-core/assets/overflow-scroll.svg @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/padding.svg b/packages/design-core/assets/padding.svg new file mode 100644 index 0000000..fe4f6e5 --- /dev/null +++ b/packages/design-core/assets/padding.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/page-schema.svg b/packages/design-core/assets/page-schema.svg new file mode 100644 index 0000000..ab4b1b6 --- /dev/null +++ b/packages/design-core/assets/page-schema.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/packages/design-core/assets/page.svg b/packages/design-core/assets/page.svg new file mode 100644 index 0000000..7241678 --- /dev/null +++ b/packages/design-core/assets/page.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/packages/design-core/assets/pager.svg b/packages/design-core/assets/pager.svg new file mode 100644 index 0000000..5961938 --- /dev/null +++ b/packages/design-core/assets/pager.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/paragraph.svg b/packages/design-core/assets/paragraph.svg new file mode 100644 index 0000000..da5e4d7 --- /dev/null +++ b/packages/design-core/assets/paragraph.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/packages/design-core/assets/pencil-thick.svg b/packages/design-core/assets/pencil-thick.svg new file mode 100644 index 0000000..f9c06a7 --- /dev/null +++ b/packages/design-core/assets/pencil-thick.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/pie.svg b/packages/design-core/assets/pie.svg new file mode 100644 index 0000000..c9d07ad --- /dev/null +++ b/packages/design-core/assets/pie.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/packages/design-core/assets/plugin-help.svg b/packages/design-core/assets/plugin-help.svg new file mode 100644 index 0000000..1431b3c --- /dev/null +++ b/packages/design-core/assets/plugin-help.svg @@ -0,0 +1 @@ +帮助中心 \ No newline at end of file diff --git a/packages/design-core/assets/plugin-icon-data.svg b/packages/design-core/assets/plugin-icon-data.svg new file mode 100644 index 0000000..f0f7a87 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-data.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/packages/design-core/assets/plugin-icon-js.svg b/packages/design-core/assets/plugin-icon-js.svg new file mode 100644 index 0000000..f912d10 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-js.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/packages/design-core/assets/plugin-icon-language.svg b/packages/design-core/assets/plugin-icon-language.svg new file mode 100644 index 0000000..780b81b --- /dev/null +++ b/packages/design-core/assets/plugin-icon-language.svg @@ -0,0 +1,20 @@ + + + + + + diff --git a/packages/design-core/assets/plugin-icon-materials.svg b/packages/design-core/assets/plugin-icon-materials.svg new file mode 100644 index 0000000..3124072 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-materials.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/packages/design-core/assets/plugin-icon-page-schema.svg b/packages/design-core/assets/plugin-icon-page-schema.svg new file mode 100644 index 0000000..f64793b --- /dev/null +++ b/packages/design-core/assets/plugin-icon-page-schema.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/packages/design-core/assets/plugin-icon-page.svg b/packages/design-core/assets/plugin-icon-page.svg new file mode 100644 index 0000000..41aaecc --- /dev/null +++ b/packages/design-core/assets/plugin-icon-page.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/packages/design-core/assets/plugin-icon-plugin-help.svg b/packages/design-core/assets/plugin-icon-plugin-help.svg new file mode 100644 index 0000000..d5a5e9c --- /dev/null +++ b/packages/design-core/assets/plugin-icon-plugin-help.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/plugin-icon-robot.svg b/packages/design-core/assets/plugin-icon-robot.svg new file mode 100644 index 0000000..82212f3 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-robot.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/packages/design-core/assets/plugin-icon-sresources.svg b/packages/design-core/assets/plugin-icon-sresources.svg new file mode 100644 index 0000000..94786d6 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-sresources.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/design-core/assets/plugin-icon-symbol.svg b/packages/design-core/assets/plugin-icon-symbol.svg new file mode 100644 index 0000000..495d60d --- /dev/null +++ b/packages/design-core/assets/plugin-icon-symbol.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/packages/design-core/assets/plugin-icon-tree.svg b/packages/design-core/assets/plugin-icon-tree.svg new file mode 100644 index 0000000..b37d62c --- /dev/null +++ b/packages/design-core/assets/plugin-icon-tree.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/packages/design-core/assets/plugin-icon-tutorial.svg b/packages/design-core/assets/plugin-icon-tutorial.svg new file mode 100644 index 0000000..aaf5a08 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-tutorial.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/packages/design-core/assets/plugin-icon-var.svg b/packages/design-core/assets/plugin-icon-var.svg new file mode 100644 index 0000000..18c15a6 --- /dev/null +++ b/packages/design-core/assets/plugin-icon-var.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/plus-circle.svg b/packages/design-core/assets/plus-circle.svg new file mode 100644 index 0000000..a0bbe29 --- /dev/null +++ b/packages/design-core/assets/plus-circle.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/plus.svg b/packages/design-core/assets/plus.svg new file mode 100644 index 0000000..73ffde4 --- /dev/null +++ b/packages/design-core/assets/plus.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/popeditor.svg b/packages/design-core/assets/popeditor.svg new file mode 100644 index 0000000..5a846e1 --- /dev/null +++ b/packages/design-core/assets/popeditor.svg @@ -0,0 +1,15 @@ + + + + + + + diff --git a/packages/design-core/assets/popover.svg b/packages/design-core/assets/popover.svg new file mode 100644 index 0000000..bb5c624 --- /dev/null +++ b/packages/design-core/assets/popover.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/position-all.svg b/packages/design-core/assets/position-all.svg new file mode 100644 index 0000000..d911e6c --- /dev/null +++ b/packages/design-core/assets/position-all.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-bottom-left.svg b/packages/design-core/assets/position-bottom-left.svg new file mode 100644 index 0000000..6734d57 --- /dev/null +++ b/packages/design-core/assets/position-bottom-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-bottom-right.svg b/packages/design-core/assets/position-bottom-right.svg new file mode 100644 index 0000000..87b46dc --- /dev/null +++ b/packages/design-core/assets/position-bottom-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-bottom.svg b/packages/design-core/assets/position-bottom.svg new file mode 100644 index 0000000..de8468b --- /dev/null +++ b/packages/design-core/assets/position-bottom.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-left.svg b/packages/design-core/assets/position-left.svg new file mode 100644 index 0000000..0a14b8f --- /dev/null +++ b/packages/design-core/assets/position-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-right.svg b/packages/design-core/assets/position-right.svg new file mode 100644 index 0000000..45df771 --- /dev/null +++ b/packages/design-core/assets/position-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-top-left.svg b/packages/design-core/assets/position-top-left.svg new file mode 100644 index 0000000..965c7bc --- /dev/null +++ b/packages/design-core/assets/position-top-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-top-right.svg b/packages/design-core/assets/position-top-right.svg new file mode 100644 index 0000000..0068080 --- /dev/null +++ b/packages/design-core/assets/position-top-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/position-top.svg b/packages/design-core/assets/position-top.svg new file mode 100644 index 0000000..2fc39c9 --- /dev/null +++ b/packages/design-core/assets/position-top.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/preview.svg b/packages/design-core/assets/preview.svg new file mode 100644 index 0000000..da9964e --- /dev/null +++ b/packages/design-core/assets/preview.svg @@ -0,0 +1,12 @@ + + + 操作/播放1 + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/prompt.svg b/packages/design-core/assets/prompt.svg new file mode 100644 index 0000000..9652fa1 --- /dev/null +++ b/packages/design-core/assets/prompt.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/radar.svg b/packages/design-core/assets/radar.svg new file mode 100644 index 0000000..e758f79 --- /dev/null +++ b/packages/design-core/assets/radar.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/packages/design-core/assets/radial-gradient.svg b/packages/design-core/assets/radial-gradient.svg new file mode 100644 index 0000000..a01f766 --- /dev/null +++ b/packages/design-core/assets/radial-gradient.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/radio.svg b/packages/design-core/assets/radio.svg new file mode 100644 index 0000000..41ee7ab --- /dev/null +++ b/packages/design-core/assets/radio.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/realtime-flow.svg b/packages/design-core/assets/realtime-flow.svg new file mode 100644 index 0000000..3465dc4 --- /dev/null +++ b/packages/design-core/assets/realtime-flow.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/redo.svg b/packages/design-core/assets/redo.svg new file mode 100644 index 0000000..9c84d4c --- /dev/null +++ b/packages/design-core/assets/redo.svg @@ -0,0 +1,12 @@ + + + 操作/还原 2 + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/refresh.svg b/packages/design-core/assets/refresh.svg new file mode 100644 index 0000000..762d72d --- /dev/null +++ b/packages/design-core/assets/refresh.svg @@ -0,0 +1,13 @@ + + + 操作/刷新 2 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/report.svg b/packages/design-core/assets/report.svg new file mode 100644 index 0000000..257119f --- /dev/null +++ b/packages/design-core/assets/report.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/resources.svg b/packages/design-core/assets/resources.svg new file mode 100644 index 0000000..469e788 --- /dev/null +++ b/packages/design-core/assets/resources.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/return.svg b/packages/design-core/assets/return.svg new file mode 100644 index 0000000..0897b35 --- /dev/null +++ b/packages/design-core/assets/return.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/rf-alarm.svg b/packages/design-core/assets/rf-alarm.svg new file mode 100644 index 0000000..d31ce33 --- /dev/null +++ b/packages/design-core/assets/rf-alarm.svg @@ -0,0 +1,11 @@ + + + alarm + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/rf-resources/flowchart-ecs.svg b/packages/design-core/assets/rf-resources/flowchart-ecs.svg new file mode 100644 index 0000000..933fb2a --- /dev/null +++ b/packages/design-core/assets/rf-resources/flowchart-ecs.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/rf-resources/flowchart-evs.svg b/packages/design-core/assets/rf-resources/flowchart-evs.svg new file mode 100644 index 0000000..f864d6a --- /dev/null +++ b/packages/design-core/assets/rf-resources/flowchart-evs.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/rf-resources/flowchart-rds.svg b/packages/design-core/assets/rf-resources/flowchart-rds.svg new file mode 100644 index 0000000..efb34b3 --- /dev/null +++ b/packages/design-core/assets/rf-resources/flowchart-rds.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/rf-resources/flowchart-vpc.svg b/packages/design-core/assets/rf-resources/flowchart-vpc.svg new file mode 100644 index 0000000..a85acdc --- /dev/null +++ b/packages/design-core/assets/rf-resources/flowchart-vpc.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/ring.svg b/packages/design-core/assets/ring.svg new file mode 100644 index 0000000..09aeb9b --- /dev/null +++ b/packages/design-core/assets/ring.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/packages/design-core/assets/row.svg b/packages/design-core/assets/row.svg new file mode 100644 index 0000000..7c31b07 --- /dev/null +++ b/packages/design-core/assets/row.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/design-core/assets/save.svg b/packages/design-core/assets/save.svg new file mode 100644 index 0000000..157897b --- /dev/null +++ b/packages/design-core/assets/save.svg @@ -0,0 +1,12 @@ + + + 操作/保存 + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/search.svg b/packages/design-core/assets/search.svg new file mode 100644 index 0000000..6fe9f41 --- /dev/null +++ b/packages/design-core/assets/search.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/packages/design-core/assets/select.svg b/packages/design-core/assets/select.svg new file mode 100644 index 0000000..c5d8b4c --- /dev/null +++ b/packages/design-core/assets/select.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/packages/design-core/assets/setting-outline.svg b/packages/design-core/assets/setting-outline.svg new file mode 100644 index 0000000..6a391f9 --- /dev/null +++ b/packages/design-core/assets/setting-outline.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/setting.svg b/packages/design-core/assets/setting.svg new file mode 100644 index 0000000..852a945 --- /dev/null +++ b/packages/design-core/assets/setting.svg @@ -0,0 +1,13 @@ + + + 操作/设置 2 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/slot.svg b/packages/design-core/assets/slot.svg new file mode 100644 index 0000000..79ed51c --- /dev/null +++ b/packages/design-core/assets/slot.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/small-list.svg b/packages/design-core/assets/small-list.svg new file mode 100644 index 0000000..db30d39 --- /dev/null +++ b/packages/design-core/assets/small-list.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/packages/design-core/assets/stars.svg b/packages/design-core/assets/stars.svg new file mode 100644 index 0000000..cedfce5 --- /dev/null +++ b/packages/design-core/assets/stars.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/start.svg b/packages/design-core/assets/start.svg new file mode 100644 index 0000000..5d56834 --- /dev/null +++ b/packages/design-core/assets/start.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/style-setting-background-image.svg b/packages/design-core/assets/style-setting-background-image.svg new file mode 100644 index 0000000..c31fef5 --- /dev/null +++ b/packages/design-core/assets/style-setting-background-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/swiper.svg b/packages/design-core/assets/swiper.svg new file mode 100644 index 0000000..43ae606 --- /dev/null +++ b/packages/design-core/assets/swiper.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/switch.svg b/packages/design-core/assets/switch.svg new file mode 100644 index 0000000..d976f58 --- /dev/null +++ b/packages/design-core/assets/switch.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/packages/design-core/assets/symbol.svg b/packages/design-core/assets/symbol.svg new file mode 100644 index 0000000..2b96eab --- /dev/null +++ b/packages/design-core/assets/symbol.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/packages/design-core/assets/table.svg b/packages/design-core/assets/table.svg new file mode 100644 index 0000000..c8edd03 --- /dev/null +++ b/packages/design-core/assets/table.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/packages/design-core/assets/tablefilter.svg b/packages/design-core/assets/tablefilter.svg new file mode 100644 index 0000000..da00316 --- /dev/null +++ b/packages/design-core/assets/tablefilter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/tablet-portrait.svg b/packages/design-core/assets/tablet-portrait.svg new file mode 100644 index 0000000..52fafc3 --- /dev/null +++ b/packages/design-core/assets/tablet-portrait.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/packages/design-core/assets/tabs.svg b/packages/design-core/assets/tabs.svg new file mode 100644 index 0000000..0f9156b --- /dev/null +++ b/packages/design-core/assets/tabs.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/packages/design-core/assets/tag.svg b/packages/design-core/assets/tag.svg new file mode 100644 index 0000000..3fcf36c --- /dev/null +++ b/packages/design-core/assets/tag.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/target.svg b/packages/design-core/assets/target.svg new file mode 100644 index 0000000..9522431 --- /dev/null +++ b/packages/design-core/assets/target.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-align-center.svg b/packages/design-core/assets/text-align-center.svg new file mode 100644 index 0000000..b837c74 --- /dev/null +++ b/packages/design-core/assets/text-align-center.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-align-justify.svg b/packages/design-core/assets/text-align-justify.svg new file mode 100644 index 0000000..4a1cc1c --- /dev/null +++ b/packages/design-core/assets/text-align-justify.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-align-left.svg b/packages/design-core/assets/text-align-left.svg new file mode 100644 index 0000000..33b6a60 --- /dev/null +++ b/packages/design-core/assets/text-align-left.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-align-right.svg b/packages/design-core/assets/text-align-right.svg new file mode 100644 index 0000000..8797696 --- /dev/null +++ b/packages/design-core/assets/text-align-right.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-copy-page.svg b/packages/design-core/assets/text-copy-page.svg new file mode 100644 index 0000000..6cf9d0e --- /dev/null +++ b/packages/design-core/assets/text-copy-page.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/design-core/assets/text-decoration-overline.svg b/packages/design-core/assets/text-decoration-overline.svg new file mode 100644 index 0000000..396ddf4 --- /dev/null +++ b/packages/design-core/assets/text-decoration-overline.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-decoration-strike.svg b/packages/design-core/assets/text-decoration-strike.svg new file mode 100644 index 0000000..5095a65 --- /dev/null +++ b/packages/design-core/assets/text-decoration-strike.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-decoration-underline.svg b/packages/design-core/assets/text-decoration-underline.svg new file mode 100644 index 0000000..05b5983 --- /dev/null +++ b/packages/design-core/assets/text-decoration-underline.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-direction-ltr.svg b/packages/design-core/assets/text-direction-ltr.svg new file mode 100644 index 0000000..cc41134 --- /dev/null +++ b/packages/design-core/assets/text-direction-ltr.svg @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-direction-rtl.svg b/packages/design-core/assets/text-direction-rtl.svg new file mode 100644 index 0000000..5866af9 --- /dev/null +++ b/packages/design-core/assets/text-direction-rtl.svg @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-common.svg b/packages/design-core/assets/text-page-common.svg new file mode 100644 index 0000000..13dd986 --- /dev/null +++ b/packages/design-core/assets/text-page-common.svg @@ -0,0 +1,9 @@ + + + 操作/反馈备份 + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-folder-closed.svg b/packages/design-core/assets/text-page-folder-closed.svg new file mode 100644 index 0000000..c80e854 --- /dev/null +++ b/packages/design-core/assets/text-page-folder-closed.svg @@ -0,0 +1,10 @@ + + + 类型/文件夹 + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-folder.svg b/packages/design-core/assets/text-page-folder.svg new file mode 100644 index 0000000..39415bb --- /dev/null +++ b/packages/design-core/assets/text-page-folder.svg @@ -0,0 +1,12 @@ + + + 类型/文件夹展开 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-home.svg b/packages/design-core/assets/text-page-home.svg new file mode 100644 index 0000000..be62073 --- /dev/null +++ b/packages/design-core/assets/text-page-home.svg @@ -0,0 +1,7 @@ + + + 全局/首页 + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-link.svg b/packages/design-core/assets/text-page-link.svg new file mode 100644 index 0000000..1dbc5e6 --- /dev/null +++ b/packages/design-core/assets/text-page-link.svg @@ -0,0 +1,10 @@ + + + 类型/图表/链接到 + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-revert.svg b/packages/design-core/assets/text-page-revert.svg new file mode 100644 index 0000000..d59a32c --- /dev/null +++ b/packages/design-core/assets/text-page-revert.svg @@ -0,0 +1,9 @@ + + + 返回 back + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-page-review.svg b/packages/design-core/assets/text-page-review.svg new file mode 100644 index 0000000..3c2c64b --- /dev/null +++ b/packages/design-core/assets/text-page-review.svg @@ -0,0 +1,20 @@ + + + 全局/隐藏 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-source-delete.svg b/packages/design-core/assets/text-source-delete.svg new file mode 100644 index 0000000..090a081 --- /dev/null +++ b/packages/design-core/assets/text-source-delete.svg @@ -0,0 +1,13 @@ + + + 删除 delete + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-source-list-add.svg b/packages/design-core/assets/text-source-list-add.svg new file mode 100644 index 0000000..2daacb4 --- /dev/null +++ b/packages/design-core/assets/text-source-list-add.svg @@ -0,0 +1,13 @@ + + + 创建/添加 create/add + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-source-list-close.svg b/packages/design-core/assets/text-source-list-close.svg new file mode 100644 index 0000000..76351fd --- /dev/null +++ b/packages/design-core/assets/text-source-list-close.svg @@ -0,0 +1,12 @@ + + + 全局/关闭 + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-source-list-ref.svg b/packages/design-core/assets/text-source-list-ref.svg new file mode 100644 index 0000000..6b4d129 --- /dev/null +++ b/packages/design-core/assets/text-source-list-ref.svg @@ -0,0 +1,13 @@ + + + 操作/刷新 + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-source-setting.svg b/packages/design-core/assets/text-source-setting.svg new file mode 100644 index 0000000..e22e972 --- /dev/null +++ b/packages/design-core/assets/text-source-setting.svg @@ -0,0 +1,10 @@ + + + 设置 setting + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-source-string.svg b/packages/design-core/assets/text-source-string.svg new file mode 100644 index 0000000..0517683 --- /dev/null +++ b/packages/design-core/assets/text-source-string.svg @@ -0,0 +1,11 @@ + + + 类型/文本 + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/text-transform-capitalize.svg b/packages/design-core/assets/text-transform-capitalize.svg new file mode 100644 index 0000000..0a2a570 --- /dev/null +++ b/packages/design-core/assets/text-transform-capitalize.svg @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-transform-lowercase.svg b/packages/design-core/assets/text-transform-lowercase.svg new file mode 100644 index 0000000..4486a66 --- /dev/null +++ b/packages/design-core/assets/text-transform-lowercase.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text-transform-sentence.svg b/packages/design-core/assets/text-transform-sentence.svg new file mode 100644 index 0000000..1607a37 --- /dev/null +++ b/packages/design-core/assets/text-transform-sentence.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/text.svg b/packages/design-core/assets/text.svg new file mode 100644 index 0000000..2ded44c --- /dev/null +++ b/packages/design-core/assets/text.svg @@ -0,0 +1,9 @@ + + + + diff --git a/packages/design-core/assets/tile-x.svg b/packages/design-core/assets/tile-x.svg new file mode 100644 index 0000000..3c6f808 --- /dev/null +++ b/packages/design-core/assets/tile-x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/tile-xy.svg b/packages/design-core/assets/tile-xy.svg new file mode 100644 index 0000000..0cd82ec --- /dev/null +++ b/packages/design-core/assets/tile-xy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/tile-y.svg b/packages/design-core/assets/tile-y.svg new file mode 100644 index 0000000..12e962c --- /dev/null +++ b/packages/design-core/assets/tile-y.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/timeline.svg b/packages/design-core/assets/timeline.svg new file mode 100644 index 0000000..10a659b --- /dev/null +++ b/packages/design-core/assets/timeline.svg @@ -0,0 +1,12 @@ + + + + diff --git a/packages/design-core/assets/tiny-logo.svg b/packages/design-core/assets/tiny-logo.svg new file mode 100644 index 0000000..f62b777 --- /dev/null +++ b/packages/design-core/assets/tiny-logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/tooltip.svg b/packages/design-core/assets/tooltip.svg new file mode 100644 index 0000000..af473eb --- /dev/null +++ b/packages/design-core/assets/tooltip.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/packages/design-core/assets/transform-origin-bottom-left.svg b/packages/design-core/assets/transform-origin-bottom-left.svg new file mode 100644 index 0000000..04e0c94 --- /dev/null +++ b/packages/design-core/assets/transform-origin-bottom-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-bottom-right.svg b/packages/design-core/assets/transform-origin-bottom-right.svg new file mode 100644 index 0000000..a83c196 --- /dev/null +++ b/packages/design-core/assets/transform-origin-bottom-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-bottom.svg b/packages/design-core/assets/transform-origin-bottom.svg new file mode 100644 index 0000000..2384b99 --- /dev/null +++ b/packages/design-core/assets/transform-origin-bottom.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-center.svg b/packages/design-core/assets/transform-origin-center.svg new file mode 100644 index 0000000..de1ee09 --- /dev/null +++ b/packages/design-core/assets/transform-origin-center.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-left.svg b/packages/design-core/assets/transform-origin-left.svg new file mode 100644 index 0000000..b91debe --- /dev/null +++ b/packages/design-core/assets/transform-origin-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-point.svg b/packages/design-core/assets/transform-origin-point.svg new file mode 100644 index 0000000..be219a8 --- /dev/null +++ b/packages/design-core/assets/transform-origin-point.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-right.svg b/packages/design-core/assets/transform-origin-right.svg new file mode 100644 index 0000000..a77a9af --- /dev/null +++ b/packages/design-core/assets/transform-origin-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-top-left.svg b/packages/design-core/assets/transform-origin-top-left.svg new file mode 100644 index 0000000..e48650f --- /dev/null +++ b/packages/design-core/assets/transform-origin-top-left.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-top-right.svg b/packages/design-core/assets/transform-origin-top-right.svg new file mode 100644 index 0000000..6c71fd6 --- /dev/null +++ b/packages/design-core/assets/transform-origin-top-right.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/transform-origin-top.svg b/packages/design-core/assets/transform-origin-top.svg new file mode 100644 index 0000000..6e41633 --- /dev/null +++ b/packages/design-core/assets/transform-origin-top.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/trash.svg b/packages/design-core/assets/trash.svg new file mode 100644 index 0000000..47c3fad --- /dev/null +++ b/packages/design-core/assets/trash.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/design-core/assets/tree-shape.svg b/packages/design-core/assets/tree-shape.svg new file mode 100644 index 0000000..1c69bec --- /dev/null +++ b/packages/design-core/assets/tree-shape.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/tree.svg b/packages/design-core/assets/tree.svg new file mode 100644 index 0000000..b2275e7 --- /dev/null +++ b/packages/design-core/assets/tree.svg @@ -0,0 +1,11 @@ + + + + diff --git a/packages/design-core/assets/tutorial.svg b/packages/design-core/assets/tutorial.svg new file mode 100644 index 0000000..5abdf3f --- /dev/null +++ b/packages/design-core/assets/tutorial.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/packages/design-core/assets/undo.svg b/packages/design-core/assets/undo.svg new file mode 100644 index 0000000..97f628e --- /dev/null +++ b/packages/design-core/assets/undo.svg @@ -0,0 +1,11 @@ + + + 操作/撤销 + + + + \ No newline at end of file diff --git a/packages/design-core/assets/unfold-outline.svg b/packages/design-core/assets/unfold-outline.svg new file mode 100644 index 0000000..9d4d0c1 --- /dev/null +++ b/packages/design-core/assets/unfold-outline.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/packages/design-core/assets/unlocked.svg b/packages/design-core/assets/unlocked.svg new file mode 100644 index 0000000..79e990f --- /dev/null +++ b/packages/design-core/assets/unlocked.svg @@ -0,0 +1,10 @@ + + + ic_lock_open_lined + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/user-locked.svg b/packages/design-core/assets/user-locked.svg new file mode 100644 index 0000000..c7b0b46 --- /dev/null +++ b/packages/design-core/assets/user-locked.svg @@ -0,0 +1,14 @@ + + + 编组 7备份 + + + + + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/var.svg b/packages/design-core/assets/var.svg new file mode 100644 index 0000000..fc96415 --- /dev/null +++ b/packages/design-core/assets/var.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/packages/design-core/assets/video.svg b/packages/design-core/assets/video.svg new file mode 100644 index 0000000..37384f1 --- /dev/null +++ b/packages/design-core/assets/video.svg @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/packages/design-core/assets/warning.svg b/packages/design-core/assets/warning.svg new file mode 100644 index 0000000..c55807e --- /dev/null +++ b/packages/design-core/assets/warning.svg @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/packages/design-core/assets/wizard.svg b/packages/design-core/assets/wizard.svg new file mode 100644 index 0000000..c6d8ce2 --- /dev/null +++ b/packages/design-core/assets/wizard.svg @@ -0,0 +1,11 @@ + + + + diff --git a/packages/design-core/canvas.html b/packages/design-core/canvas.html new file mode 100644 index 0000000..fedb111 --- /dev/null +++ b/packages/design-core/canvas.html @@ -0,0 +1,266 @@ + + + + + + + + + + +
+
+
+
+
+
+
+ + + diff --git a/packages/design-core/config/addons.js b/packages/design-core/config/addons.js new file mode 100644 index 0000000..f659b40 --- /dev/null +++ b/packages/design-core/config/addons.js @@ -0,0 +1,68 @@ +/** + * 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 Breadcrumb from '@opentiny/tiny-engine-toolbar-breadcrumb' +import Fullscreen from '@opentiny/tiny-engine-toolbar-fullscreen' +import Lang from '@opentiny/tiny-engine-toolbar-lang' +import Checkinout from '@opentiny/tiny-engine-toolbar-checkinout' +import Logo from '@opentiny/tiny-engine-toolbar-logo' +import Media from '@opentiny/tiny-engine-toolbar-media' +import Redoundo from '@opentiny/tiny-engine-toolbar-redoundo' +import Save from '@opentiny/tiny-engine-toolbar-save' +import Clean from '@opentiny/tiny-engine-toolbar-clean' +import Preview from '@opentiny/tiny-engine-toolbar-preview' +import GenerateVue from '@opentiny/tiny-engine-toolbar-generate-vue' +import Refresh from '@opentiny/tiny-engine-toolbar-refresh' +import Collaboration from '@opentiny/tiny-engine-toolbar-collaboration' +import Setting from '@opentiny/tiny-engine-toolbar-setting' + +import Materials from '@opentiny/tiny-engine-plugin-materials' +import Data from '@opentiny/tiny-engine-plugin-data' +import Script from '@opentiny/tiny-engine-plugin-script' +import Tree from '@opentiny/tiny-engine-plugin-tree' +import Help from '@opentiny/tiny-engine-plugin-help' +import Schema from '@opentiny/tiny-engine-plugin-schema' +import Page from '@opentiny/tiny-engine-plugin-page' +import I18n from '@opentiny/tiny-engine-plugin-i18n' +import Bridge from '@opentiny/tiny-engine-plugin-bridge' +import Block from '@opentiny/tiny-engine-plugin-block' +import Datasource from '@opentiny/tiny-engine-plugin-datasource' +import Robot from '@opentiny/tiny-engine-plugin-robot' + +import Props from '@opentiny/tiny-engine-setting-props' +import Events from '@opentiny/tiny-engine-setting-events' +import Styles from '@opentiny/tiny-engine-setting-styles' + +import '@opentiny/tiny-engine-theme' + +const addons = { + plugins: [Materials, Tree, Page, Block, Datasource, Bridge, I18n, Script, Data, Schema, Help, Robot], + toolbars: [ + Logo, + Breadcrumb, + Media, + Collaboration, + Clean, + Refresh, + Save, + GenerateVue, + Preview, + Redoundo, + Fullscreen, + Checkinout, + Setting, + Lang + ], + settings: [Props, Styles, Events] +} + +export default addons diff --git a/packages/design-core/config/lowcode.config.js b/packages/design-core/config/lowcode.config.js new file mode 100644 index 0000000..01c0697 --- /dev/null +++ b/packages/design-core/config/lowcode.config.js @@ -0,0 +1,97 @@ +/** + * 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 { + // 编辑器主题类型, 取值:dark暗色系,light浅色系, 对应的npm包名为:@opentiny/tiny-engine-theme-${theme}, 暗色主题名需要以dark开头 + theme: 'light', + + // 当前面板技术栈类型,DSL转义参数, 其取值有: Angular、React、HTML、Vue、Flowchart + dslMode: 'Vue', + + // DSL 代码转换的服务地址 + dslHost: '', + + // 工具栏配置: Array类型,当前取值: + toolbarOptions: [], + + // 插件栏配置:Array类型,当前取值: + pluginOptions: [], + + canvasOptions: { + Angular: {}, + Vue: { + material: ['/mock/bundle.json'], + scripts: [], + styles: ['/tiny-vue.css'] + }, + React: {}, + HTML: {}, + Flowchart: {} + }, + + // 生命周期函数 + lifeCyclesOptions: { + Angular: [ + '_constructor_', + 'ngOnInit', + 'ngOnChanges', + 'ngDoCheck', + 'ngAfterContentInit', + 'ngAfterContentChecked', + 'ngAfterViewInit', + 'ngAfterViewChecked', + 'ngOnDestroy' + ], + Vue: [ + 'setup', + 'onBeforeMount', + 'onMounted', + 'onBeforeUpdate', + 'onUpdated', + 'onBeforeUnmount', + 'onUnmounted', + 'onErrorCaptured', + 'onActivated', + 'onDeactivated' + ], + HTML: [], + React: [ + 'componentWillMount', + 'componentDidMount', + 'componentWillReceiveProps', + 'shouldComponentUpdate', + 'componentWillUpdate', + 'componentDidUpdate', + 'componentWillUnmount' + ] + }, + + // 生命周期使用提示 + lifeCycleTips: { + Vue: '通过Vue解构出来的方法都可以在setup这里使用,比如watch、computed、watchEffect等' + }, + + // 设计器服务的host + platformHost: '', + + // 发布应用host + appHost: '', + + // 物料服务的host + materialHost: '', + + // 当前 editor 实例绑定的设计器id + platformId: 897, + + // 是否默认导入布局组件 + defaultImportLayout: 1 +} diff --git a/packages/design-core/index.html b/packages/design-core/index.html new file mode 100644 index 0000000..f4e14a6 --- /dev/null +++ b/packages/design-core/index.html @@ -0,0 +1,131 @@ + + + + + + + + TinyEditor 前端可视化设计器 + + + +
+
+
+

Loading

+ + + + + + + +
+
+
+ + + diff --git a/packages/design-core/package.json b/packages/design-core/package.json new file mode 100644 index 0000000..c33e5d0 --- /dev/null +++ b/packages/design-core/package.json @@ -0,0 +1,132 @@ +{ + "name": "@opentiny/tiny-engine", + "version": "1.0.0-beta.4", + "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-block": "workspace:*", + "@opentiny/tiny-engine-plugin-bridge": "workspace:*", + "@opentiny/tiny-engine-plugin-data": "workspace:*", + "@opentiny/tiny-engine-plugin-datasource": "workspace:*", + "@opentiny/tiny-engine-plugin-help": "workspace:*", + "@opentiny/tiny-engine-plugin-i18n": "workspace:*", + "@opentiny/tiny-engine-plugin-materials": "workspace:*", + "@opentiny/tiny-engine-plugin-page": "workspace:*", + "@opentiny/tiny-engine-plugin-robot": "workspace:*", + "@opentiny/tiny-engine-plugin-schema": "workspace:*", + "@opentiny/tiny-engine-plugin-script": "workspace:*", + "@opentiny/tiny-engine-plugin-tree": "workspace:*", + "@opentiny/tiny-engine-plugin-tutorial": "workspace:*", + "@opentiny/tiny-engine-setting-design": "workspace:*", + "@opentiny/tiny-engine-setting-events": "workspace:*", + "@opentiny/tiny-engine-setting-props": "workspace:*", + "@opentiny/tiny-engine-setting-styles": "workspace:*", + "@opentiny/tiny-engine-svgs": "workspace:*", + "@opentiny/tiny-engine-theme-dark": "workspace:*", + "@opentiny/tiny-engine-theme-light": "workspace:*", + "@opentiny/tiny-engine-toolbar-breadcrumb": "workspace:*", + "@opentiny/tiny-engine-toolbar-checkinout": "workspace:*", + "@opentiny/tiny-engine-toolbar-clean": "workspace:*", + "@opentiny/tiny-engine-toolbar-collaboration": "workspace:*", + "@opentiny/tiny-engine-toolbar-fullscreen": "workspace:*", + "@opentiny/tiny-engine-toolbar-generate-vue": "workspace:*", + "@opentiny/tiny-engine-toolbar-lang": "workspace:*", + "@opentiny/tiny-engine-toolbar-layout": "workspace:*", + "@opentiny/tiny-engine-toolbar-logo": "workspace:*", + "@opentiny/tiny-engine-toolbar-logout": "workspace:*", + "@opentiny/tiny-engine-toolbar-media": "workspace:*", + "@opentiny/tiny-engine-toolbar-preview": "workspace:*", + "@opentiny/tiny-engine-toolbar-redoundo": "workspace:*", + "@opentiny/tiny-engine-toolbar-refresh": "workspace:*", + "@opentiny/tiny-engine-toolbar-save": "workspace:*", + "@opentiny/tiny-engine-toolbar-setting": "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-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", + "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.4.15", + "vue-i18n": "^9.9.0" + }, + "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": "^3.1.0", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "cross-env": "^7.0.3", + "esbuild-plugin-copy": "^2.1.1", + "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/packages/design-core/preview.html b/packages/design-core/preview.html new file mode 100644 index 0000000..fb55265 --- /dev/null +++ b/packages/design-core/preview.html @@ -0,0 +1,13 @@ + + + + + + + Design Core Preview + + +
+ + + diff --git a/packages/design-core/previewApp.html b/packages/design-core/previewApp.html new file mode 100644 index 0000000..6dd44c0 --- /dev/null +++ b/packages/design-core/previewApp.html @@ -0,0 +1,13 @@ + + + + + + + Design Core Preview + + +
+ + + diff --git a/packages/design-core/public/favicon.ico b/packages/design-core/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/packages/design-core/public/favicon.ico differ diff --git a/packages/design-core/public/i18n-mock/i18n-template-for-batch-import.zip b/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/packages/design-core/public/i18n-mock/i18n-template-for-batch-import.zip differ diff --git a/packages/design-core/public/img/bgcModal.png b/packages/design-core/public/img/bgcModal.png new file mode 100644 index 0000000..fedfb66 Binary files /dev/null and b/packages/design-core/public/img/bgcModal.png differ diff --git a/packages/design-core/public/img/defaultAvator.png b/packages/design-core/public/img/defaultAvator.png new file mode 100644 index 0000000..c45c040 Binary files /dev/null and b/packages/design-core/public/img/defaultAvator.png differ diff --git a/packages/design-core/public/img/divider.png b/packages/design-core/public/img/divider.png new file mode 100644 index 0000000..cf86e32 Binary files /dev/null and b/packages/design-core/public/img/divider.png differ diff --git a/packages/design-core/public/img/dividerActive.png b/packages/design-core/public/img/dividerActive.png new file mode 100644 index 0000000..e493800 Binary files /dev/null and b/packages/design-core/public/img/dividerActive.png differ diff --git a/packages/design-core/public/img/rocket.jpg b/packages/design-core/public/img/rocket.jpg new file mode 100644 index 0000000..f17e200 Binary files /dev/null and b/packages/design-core/public/img/rocket.jpg differ diff --git a/packages/design-core/public/img/webNova.jpg b/packages/design-core/public/img/webNova.jpg new file mode 100644 index 0000000..bc65f73 Binary files /dev/null and b/packages/design-core/public/img/webNova.jpg differ diff --git a/packages/design-core/public/mock/bundle.json b/packages/design-core/public/mock/bundle.json new file mode 100644 index 0000000..01d2c2b --- /dev/null +++ b/packages/design-core/public/mock/bundle.json @@ -0,0 +1,14290 @@ +{ + "data": { + "framework": "Vue", + "materials": { + "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://npm.onmicrosoft.cn/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://npm.onmicrosoft.cn/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://npm.onmicrosoft.cn/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://npm.onmicrosoft.cn/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://npm.onmicrosoft.cn/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://npm.onmicrosoft.cn/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://npm.onmicrosoft.cn/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://npm.onmicrosoft.cn/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://npm.onmicrosoft.cn/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://npm.onmicrosoft.cn/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": { + "dataType": "JSFunction" + } + } + }, + { + "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": "label", + "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://npm.onmicrosoft.cn/element-plus@2.4.2/dist/index.full.mjs", + "css": "https://npm.onmicrosoft.cn/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, + "npm": {}, + "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": "TabItem", + "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": "BreadcrumbItem", + "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": 10, + "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": "render-content", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "disabled": true, + "placeholder": "请使用变量绑定来绑定函数" + } + }, + "description": { + "zh_CN": "树节点的内容区的渲染函数" + } + }, + { + "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": "render-content", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": { + "disabled": true, + "placeholder": "请使用变量绑定来绑定函数" + } + }, + "description": { + "zh_CN": "自定义渲染函数,返回需要渲染的节点内容" + } + }, + { + "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"] + } + } + }, + { + "name": { + "zh_CN": "日期选择" + }, + "component": "TinyDatePicker", + "icon": "datepick", + "description": "用于输入或选择日期", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "DatePicker", + "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": "日期", + "value": "date" + }, + { + "label": "日期时间", + "value": "datetime" + }, + { + "label": "周", + "value": "week" + }, + { + "label": "月份", + "value": "month" + }, + { + "label": "年份", + "value": "year" + } + ] + } + }, + "description": { + "zh_CN": "设置日期框的type属性" + } + }, + { + "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": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "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": "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": "" + } + } + }, + "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"] + } + } + }, + { + "name": { + "zh_CN": "数字输入框" + }, + "component": "TinyNumeric", + "icon": "numeric", + "description": "通过鼠标或键盘输入字符", + "docUrl": "", + "screenshot": "", + "tags": "", + "keywords": "", + "devMode": "proCode", + "npm": { + "package": "@opentiny/vue", + "exportName": "Numeric", + "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, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "双向绑定值" + }, + "labelPosition": "left" + }, + { + "property": "placeholder", + "label": { + "text": { + "zh_CN": "占位文本" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "输入框占位文本" + }, + "labelPosition": "left" + }, + { + "property": "allow-empty", + "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": false, + "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": "controls", + "label": { + "text": { + "zh_CN": "是否使用加减按钮" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "controls-position", + "label": { + "text": { + "zh_CN": "加减按钮位置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "左右两侧", + "value": "" + }, + { + "label": "只在右侧", + "value": "right" + } + ] + } + }, + "description": { + "zh_CN": "加减按钮位置" + }, + "labelPosition": "left" + }, + { + "property": "precision", + "label": { + "text": { + "zh_CN": "数值精度" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "数值精度" + }, + "labelPosition": "left" + }, + { + "property": "step", + "label": { + "text": { + "zh_CN": "步长" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "步长" + }, + "labelPosition": "left" + }, + { + "property": "max", + "label": { + "text": { + "zh_CN": "可输入的最大数值" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "可输入的最大数值" + }, + "labelPosition": "left" + }, + { + "property": "min", + "label": { + "text": { + "zh_CN": "可输入的最小数值" + } + }, + "required": false, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumber", + "props": { + "allowEmpty": true + } + }, + "description": { + "zh_CN": "可输入的最大数值" + }, + "labelPosition": "left" + } + ] + } + ], + "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": "" + } + } + }, + "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"] + } + } + } + ], + "blocks": [], + "snippets": [ + { + "group": "element-plus", + "children": [ + { + "name": { + "zh_CN": "输入框" + }, + "icon": "input", + "screenshot": "", + "snippetName": "ElInput", + "schema": {} + }, + { + "name": { + "zh_CN": "按钮" + }, + "icon": "button", + "screenshot": "", + "snippetName": "ElButton", + "schema": { + "children": [ + { + "componentName": "Text", + "props": { + "text": "按钮文本" + } + } + ] + } + }, + { + "name": { + "zh_CN": "表单" + }, + "icon": "form", + "screenshot": "", + "snippetName": "ElForm", + "schema": { + "children": [ + { + "componentName": "ElFormItem", + "props": { + "label": "账号", + "prop": "account" + }, + "children": [ + { + "componentName": "ElInput", + "props": { + "modelValue": "", + "placeholder": "请输入账号" + } + } + ] + }, + { + "componentName": "ElFormItem", + "props": { + "label": "密码", + "prop": "password" + }, + "children": [ + { + "componentName": "ElInput", + "props": { + "modelValue": "", + "placeholder": "请输入密码", + "type": "password" + } + } + ] + }, + { + "componentName": "ElFormItem", + "props": {}, + "children": [ + { + "componentName": "ElButton", + "props": { + "type": "primary", + "style": "margin-right: 10px" + }, + "children": [ + { + "componentName": "Text", + "props": { + "text": "提交" + } + } + ] + }, + { + "componentName": "ElButton", + "props": { + "type": "primary" + }, + "children": [ + { + "componentName": "Text", + "props": { + "text": "重置" + } + } + ] + } + ] + } + ] + } + }, + { + "name": { + "zh_CN": "表格" + }, + "icon": "grid", + "screenshot": "", + "snippetName": "ElTable", + "schema": { + "props": { + "data": [ + { + "date": "2016-05-03", + "name": "Tom", + "address": "No. 189, Grove St, Los Angeles" + }, + { + "date": "2016-05-02", + "name": "Tom", + "address": "No. 189, Grove St, Los Angeles" + }, + { + "date": "2016-05-04", + "name": "Tom", + "address": "No. 189, Grove St, Los Angeles" + }, + { + "date": "2016-05-01", + "name": "Tom", + "address": "No. 189, Grove St, Los Angeles" + } + ], + "columns": [ + { + "type": "index" + }, + { + "label": "Date", + "prop": "date" + }, + { + "label": "Name", + "prop": "name" + }, + { + "label": "Address", + "prop": "address" + } + ] + } + } + } + ] + }, + { + "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": "软件" + } + ] + } + } + }, + { + "name": { + "zh_CN": "日期选择" + }, + "icon": "datepick", + "screenshot": "", + "snippetName": "TinyDatePicker", + "schema": { + "componentName": "TinyDatePicker", + "props": { + "placeholder": "请输入", + "modelValue": "" + } + } + }, + { + "name": { + "zh_CN": "数字输入框" + }, + "icon": "numeric", + "screenshot": "", + "snippetName": "TinyNumeric", + "schema": { + "componentName": "TinyNumeric", + "props": { + "allow-empty": true, + "placeholder": "请输入", + "controlsPosition": "right", + "step": 1 + } + } + } + ] + }, + { + "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/packages/design-core/public/monaco-linter/eslint.worker.js b/packages/design-core/public/monaco-linter/eslint.worker.js new file mode 100644 index 0000000..05cf20d --- /dev/null +++ b/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/packages/design-core/public/tiny-vue.css b/packages/design-core/public/tiny-vue.css new file mode 100644 index 0000000..785372b --- /dev/null +++ b/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/packages/design-core/scripts/externalDeps.js b/packages/design-core/scripts/externalDeps.js new file mode 100644 index 0000000..418fec7 --- /dev/null +++ b/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/packages/design-core/src/App.vue b/packages/design-core/src/App.vue new file mode 100644 index 0000000..e8c169a --- /dev/null +++ b/packages/design-core/src/App.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/packages/design-core/src/DesignCanvas.vue b/packages/design-core/src/DesignCanvas.vue new file mode 100644 index 0000000..dfad7ba --- /dev/null +++ b/packages/design-core/src/DesignCanvas.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/packages/design-core/src/DesignPlugins.vue b/packages/design-core/src/DesignPlugins.vue new file mode 100644 index 0000000..2c7f1e5 --- /dev/null +++ b/packages/design-core/src/DesignPlugins.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/packages/design-core/src/DesignSettings.vue b/packages/design-core/src/DesignSettings.vue new file mode 100644 index 0000000..b7f082f --- /dev/null +++ b/packages/design-core/src/DesignSettings.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/packages/design-core/src/DesignToolbars.vue b/packages/design-core/src/DesignToolbars.vue new file mode 100644 index 0000000..d6786d4 --- /dev/null +++ b/packages/design-core/src/DesignToolbars.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/packages/design-core/src/canvas.js b/packages/design-core/src/canvas.js new file mode 100644 index 0000000..118254a --- /dev/null +++ b/packages/design-core/src/canvas.js @@ -0,0 +1,3 @@ +import { createRender } from '@opentiny/tiny-engine-canvas' + +createRender(window.parent.TinyGlobalConfig) diff --git a/packages/design-core/src/main.js b/packages/design-core/src/main.js new file mode 100644 index 0000000..4da1396 --- /dev/null +++ b/packages/design-core/src/main.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 { createApp } from 'vue' +import initSvgs from '@opentiny/tiny-engine-svgs' +import { setGlobalConfig } from '@opentiny/tiny-engine-controller' +import i18n from '@opentiny/tiny-engine-controller/js/i18n' +import App from './App.vue' +import globalConfig from '../config/lowcode.config' +import { initMonitor } from '@opentiny/tiny-engine-controller/js/monitor' +import { injectGlobalComponents } from '@opentiny/tiny-engine-common' +import { initHttp } from '@opentiny/tiny-engine-http' +import 'virtual:svg-icons-register' + +import TinyThemeTool from '@opentiny/vue-theme/theme-tool' +import { tinySmbTheme } from '@opentiny/vue-theme/theme' // SMB 主题 + +initHttp({ env: import.meta.env }) + +// eslint-disable-next-line no-new +new TinyThemeTool(tinySmbTheme, 'smbtheme') // 初始化主题 + +if (import.meta.env.VITE_ERROR_MONITOR === 'true' && import.meta.env.VITE_ERROR_MONITOR_URL) { + initMonitor(import.meta.env.VITE_ERROR_MONITOR_URL) +} + +window.TinyGlobalConfig = globalConfig +setGlobalConfig(globalConfig) + +const app = createApp(App) + +initSvgs(app) +window.lowcodeI18n = i18n +app.use(i18n).use(injectGlobalComponents).mount('#app') diff --git a/packages/design-core/src/preview/src/App.vue b/packages/design-core/src/preview/src/App.vue new file mode 100644 index 0000000..bc57e71 --- /dev/null +++ b/packages/design-core/src/preview/src/App.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/packages/design-core/src/preview/src/Toolbar.vue b/packages/design-core/src/preview/src/Toolbar.vue new file mode 100644 index 0000000..18071ec --- /dev/null +++ b/packages/design-core/src/preview/src/Toolbar.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/packages/design-core/src/preview/src/constant/index.js b/packages/design-core/src/preview/src/constant/index.js new file mode 100644 index 0000000..6debf42 --- /dev/null +++ b/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/packages/design-core/src/preview/src/main.js b/packages/design-core/src/preview/src/main.js new file mode 100644 index 0000000..df3de70 --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/Preview.vue b/packages/design-core/src/preview/src/preview/Preview.vue new file mode 100644 index 0000000..a087236 --- /dev/null +++ b/packages/design-core/src/preview/src/preview/Preview.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/packages/design-core/src/preview/src/preview/debugSwitch.js b/packages/design-core/src/preview/src/preview/debugSwitch.js new file mode 100644 index 0000000..654b5eb --- /dev/null +++ b/packages/design-core/src/preview/src/preview/debugSwitch.js @@ -0,0 +1,10 @@ +import { ref, provide, inject } from 'vue' +export const debuggerSwitchTokenKey = Symbol('tiny-engine-preview-debug-switch') +export function useDebugSwitch() { + const debugSwitch = ref(false) + provide(debuggerSwitchTokenKey, debugSwitch) + return debugSwitch +} +export function injectDebugSwitch() { + return inject(debuggerSwitchTokenKey) +} diff --git a/packages/design-core/src/preview/src/preview/generate.js b/packages/design-core/src/preview/src/preview/generate.js new file mode 100644 index 0000000..3a7b3ab --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/http.js b/packages/design-core/src/preview/src/preview/http.js new file mode 100644 index 0000000..2726e5b --- /dev/null +++ b/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-controller/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/packages/design-core/src/preview/src/preview/importMap.js b/packages/design-core/src/preview/src/preview/importMap.js new file mode 100644 index 0000000..445010f --- /dev/null +++ b/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-controller/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/packages/design-core/src/preview/src/preview/srcFiles.js b/packages/design-core/src/preview/src/preview/srcFiles.js new file mode 100644 index 0000000..2b10999 --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/App.vue b/packages/design-core/src/preview/src/preview/srcFiles/App.vue new file mode 100644 index 0000000..66a4feb --- /dev/null +++ b/packages/design-core/src/preview/src/preview/srcFiles/App.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/packages/design-core/src/preview/src/preview/srcFiles/Login.vue b/packages/design-core/src/preview/src/preview/srcFiles/Login.vue new file mode 100644 index 0000000..cd64e9b --- /dev/null +++ b/packages/design-core/src/preview/src/preview/srcFiles/Login.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/packages/design-core/src/preview/src/preview/srcFiles/Main.vue b/packages/design-core/src/preview/src/preview/srcFiles/Main.vue new file mode 100644 index 0000000..2d4963b --- /dev/null +++ b/packages/design-core/src/preview/src/preview/srcFiles/Main.vue @@ -0,0 +1,3 @@ + diff --git a/packages/design-core/src/preview/src/preview/srcFiles/app.js b/packages/design-core/src/preview/src/preview/srcFiles/app.js new file mode 100644 index 0000000..d01bd1d --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/bridge.js b/packages/design-core/src/preview/src/preview/srcFiles/bridge.js new file mode 100644 index 0000000..3ee6a55 --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/constant/index.js b/packages/design-core/src/preview/src/preview/srcFiles/constant/index.js new file mode 100644 index 0000000..b166abb --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/dataSource.js b/packages/design-core/src/preview/src/preview/srcFiles/dataSource.js new file mode 100644 index 0000000..547a519 --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js b/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js new file mode 100644 index 0000000..ae37f2e --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/injectGlobal.js b/packages/design-core/src/preview/src/preview/srcFiles/injectGlobal.js new file mode 100644 index 0000000..62bc52f --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/locales.js b/packages/design-core/src/preview/src/preview/srcFiles/locales.js new file mode 100644 index 0000000..cec31cf --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/lowcode.js b/packages/design-core/src/preview/src/preview/srcFiles/lowcode.js new file mode 100644 index 0000000..22d96c1 --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/stores.js b/packages/design-core/src/preview/src/preview/srcFiles/stores.js new file mode 100644 index 0000000..ff4ee0a --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/storesHelper.js b/packages/design-core/src/preview/src/preview/srcFiles/storesHelper.js new file mode 100644 index 0000000..f766b54 --- /dev/null +++ b/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/packages/design-core/src/preview/src/preview/srcFiles/utils.js b/packages/design-core/src/preview/src/preview/srcFiles/utils.js new file mode 100644 index 0000000..b511783 --- /dev/null +++ b/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/packages/design-core/src/preview/src/previewApp.js b/packages/design-core/src/preview/src/previewApp.js new file mode 100644 index 0000000..0d7dab5 --- /dev/null +++ b/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/packages/design-core/src/preview/src/previewApp.vue b/packages/design-core/src/preview/src/previewApp.vue new file mode 100644 index 0000000..9dba945 --- /dev/null +++ b/packages/design-core/src/preview/src/previewApp.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js new file mode 100644 index 0000000..4aea414 --- /dev/null +++ b/packages/design-core/vite.config.js @@ -0,0 +1,292 @@ +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 esbuildCopy from 'esbuild-plugin-copy' +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(), + esbuildCopy({ + //@vue/repl monaco编辑器需要 + resolveFrom: 'cwd', + assets: { + from: ['./node_modules/@vue/repl/dist/assets/*'], // worker.js文件以url形式引用不会被esbuild拉起,需要手动复制 + to: ['./node_modules/.vite/assets'] // 开发态,js文件被缓存在.vite/deps,请求相对路径为.vite/assets + }, + watch: true + }) + ] + } + }, + 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') + }, + 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-controller/js': path.resolve(__dirname, '../controller/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') +} + +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 } = 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${ + command === 'build' ? '.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)) + + return config +}) diff --git a/packages/http/package.json b/packages/http/package.json new file mode 100644 index 0000000..85566e8 --- /dev/null +++ b/packages/http/package.json @@ -0,0 +1,41 @@ +{ + "name": "@opentiny/tiny-engine-http", + "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/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-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@vueuse/core": "^9.6.0", + "axios": "^0.27.2", + "axios-mock-adapter": "^1.21.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/http/src/Login.vue b/packages/http/src/Login.vue new file mode 100644 index 0000000..6c5c8b0 --- /dev/null +++ b/packages/http/src/Login.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/packages/http/src/axios.js b/packages/http/src/axios.js new file mode 100644 index 0000000..25edcb6 --- /dev/null +++ b/packages/http/src/axios.js @@ -0,0 +1,151 @@ +/** + * 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 function globalDefaults(key, value) { + if (key && typeof key === 'string') { + if (typeof value === 'undefined') { + return axios.defaults[key] + } + axios.defaults[key] = value + return undefined + } + + return axios.defaults +} + +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/packages/http/src/config.js b/packages/http/src/config.js new file mode 100644 index 0000000..54b57a8 --- /dev/null +++ b/packages/http/src/config.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 function getConfig(env = import.meta.env) { + const baseURL = env.VITE_ORIGIN + + // 仅在本地开发时,启用 withCredentials + const dev = env.MODE?.includes('dev') + + // 获取租户 id + const getTenant = () => new URLSearchParams(location.search).get('tenant') + return { + baseURL, + withCredentials: false, + headers: { + 'x-lowcode-mode': dev ? 'develop' : null, + 'x-lowcode-org': getTenant() + } + } +} diff --git a/packages/http/src/index.js b/packages/http/src/index.js new file mode 100644 index 0000000..64b182c --- /dev/null +++ b/packages/http/src/index.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. + * + */ + +/* eslint-disable no-undef */ +import axios, { globalDefaults } from './axios' +import { createApp } from 'vue' +import { useBroadcastChannel } from '@vueuse/core' +import Login from './Login.vue' +import { getConfig } 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 loginDom = document.createElement('div') +document.body.appendChild(loginDom) +const loginVM = createApp(Login).mount(loginDom) + +const showError = (url, message) => { + globalNotify({ + type: 'error', + title: '接口报错', + message: `报错接口: ${url} \n报错信息: ${message ?? ''}` + }) +} + +window.lowcode = { + platformCenter: { + Session: { + rebuiltCallback: function () { + loginVM.closeLogin() + + procession.mePromise.resolve('login ok') + procession.promiseLogin = null + procession.mePromise = {} + } + } + } +} + +let http // 封装axios的http实例 +let environment = import.meta.env // 当前设计器运行环境变量 + +const isVsCodeEnv = window.vscodeBridge +const isMock = () => environment.VITE_API_MOCK === 'mock' + +export const createHttp = (options) => { + // 缓存http实例,避免每个请求重新创建实例 + if (http && !options.force) { + return http + } + const isDevelopEnv = environment.MODE?.includes('dev') + const axiosConfig = getConfig(environment) + http = axios(axiosConfig) + + // 如果未指定是否启用 mock,则本地开发时默认启用,模拟数据在 public/mock 目录下 + const { enableMock = isDevelopEnv } = options + enableMock && http.mock(mockData) + + const preRequest = (config) => { + if (isDevelopEnv && config.url.match(/\/generate\//)) { + config.baseURL = '' + } + + if (isVsCodeEnv) { + config.baseURL = '' + } + + 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) + } + + return res.data?.data + } + + const openLogin = () => { + return new Promise((resolve, reject) => { + if (!procession.promiseLogin) { + procession.promiseLogin = loginVM.openLogin(procession, '/api/rebuildSession') + procession.promiseLogin.then(() => { + http.request(response.config).then(resolve, reject) + }) + } + }) + } + + const errorResponse = (error) => { + // 用户信息失效时,弹窗提示登录 + const { response } = error + if (response?.status === LOGIN_EXPIRED_CODE) { + // vscode 插件环境弹出输入框提示登录 + if (window.vscodeBridge) { + return Promise.resolve(true) + } + + // 浏览器环境弹出小窗登录 + if (response?.headers['x-login-url']) { + return openLogin() + } + } + + showError(error.config?.url, error?.message) + + return response?.data.error ? Promise.reject(response.data.error) : Promise.reject(error.message) + } + + // 响应拦截器 + http.interceptors.response.use(preResponse, errorResponse) + + return http +} + +/** + * 根据环境不同初始化设置http参数 + * @param {*} env: 当前环境变量 + */ +export const initHttp = ({ env }) => { + if (Object.keys(env).length) { + environment = env + } + const baseURL = environment.VITE_ORIGIN + // 调用初始化方法前可能已经存在已经实例化的http,需要设置baseURL + http?.defaults('baseURL', baseURL) + globalDefaults('baseURL', baseURL) + http = createHttp({ force: true, enableMock: isMock() }) +} + +export const useHttp = () => createHttp({ enableMock: isMock() }) diff --git a/packages/http/src/mock.js b/packages/http/src/mock.js new file mode 100644 index 0000000..9b33d94 --- /dev/null +++ b/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/packages/http/vite.config.js b/packages/http/vite.config.js new file mode 100644 index 0000000..6b29354 --- /dev/null +++ b/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/packages/i18n/README.md b/packages/i18n/README.md new file mode 100644 index 0000000..4f6b9df --- /dev/null +++ b/packages/i18n/README.md @@ -0,0 +1,2 @@ +# lowcode-webcomponent + diff --git a/packages/i18n/index.html b/packages/i18n/index.html new file mode 100644 index 0000000..7ea1dea --- /dev/null +++ b/packages/i18n/index.html @@ -0,0 +1,13 @@ + + + + + + Tiny Vue WebComponent + + + +
+ + + diff --git a/packages/i18n/package.json b/packages/i18n/package.json new file mode 100644 index 0000000..445cf8f --- /dev/null +++ b/packages/i18n/package.json @@ -0,0 +1,50 @@ +{ + "name": "@opentiny/tiny-engine-i18n-host", + "version": "1.0.3", + "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:*" + }, + "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" + }, + "peerDependencies": { + "vue": "^3.4.15", + "vue-i18n": "^9.9.0" + } +} diff --git a/packages/i18n/src/App.vue b/packages/i18n/src/App.vue new file mode 100644 index 0000000..c794863 --- /dev/null +++ b/packages/i18n/src/App.vue @@ -0,0 +1,44 @@ + + + diff --git a/packages/i18n/src/I18nHost.vue b/packages/i18n/src/I18nHost.vue new file mode 100644 index 0000000..7d1544e --- /dev/null +++ b/packages/i18n/src/I18nHost.vue @@ -0,0 +1,45 @@ + + + diff --git a/packages/i18n/src/i18n.js b/packages/i18n/src/i18n.js new file mode 100644 index 0000000..8c72e7e --- /dev/null +++ b/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/packages/i18n/src/lib.js b/packages/i18n/src/lib.js new file mode 100644 index 0000000..3474225 --- /dev/null +++ b/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/packages/i18n/src/main.js b/packages/i18n/src/main.js new file mode 100644 index 0000000..afcf8cd --- /dev/null +++ b/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/packages/i18n/src/test/TestVueInject.vue b/packages/i18n/src/test/TestVueInject.vue new file mode 100644 index 0000000..c07f8f7 --- /dev/null +++ b/packages/i18n/src/test/TestVueInject.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/i18n/src/test/TestVueUse.vue b/packages/i18n/src/test/TestVueUse.vue new file mode 100644 index 0000000..335467c --- /dev/null +++ b/packages/i18n/src/test/TestVueUse.vue @@ -0,0 +1,17 @@ + + + diff --git a/packages/i18n/src/test/TestWebcomponent.vue b/packages/i18n/src/test/TestWebcomponent.vue new file mode 100644 index 0000000..e5575c9 --- /dev/null +++ b/packages/i18n/src/test/TestWebcomponent.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/i18n/vite.config.js b/packages/i18n/vite.config.js new file mode 100644 index 0000000..ad86963 --- /dev/null +++ b/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/packages/media-material/.eslintrc.js b/packages/media-material/.eslintrc.js new file mode 100644 index 0000000..e5a68f1 --- /dev/null +++ b/packages/media-material/.eslintrc.js @@ -0,0 +1,46 @@ +module.exports = { + root: true, + env: { + es6: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'prettier', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + }, + rules: { + // 不必要的转义字符,设置为警告。 + // 在正则表达式中,特殊字符加个转义字符可以增强可读性。比如 /[\*]/ 一眼看过去知道是只是匹配"*"这个字符的. 而/[*]/可能会让人误解为一个通配符。 + 'no-useless-escape': 1, + 'no-case-declarations': 'off', + 'no-fallthrough': 'off', + 'no-underscore-dangle': 'off', + '@typescript-eslint/await-thenable': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-implied-eval': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/prefer-regexp-exec': 'off', + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/restrict-plus-operands': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/no-floating-promises': 'warn', + 'prefer-spread': 'warn', + 'no-empty': ['error', { allowEmptyCatch: true }], + }, +}; \ No newline at end of file diff --git a/packages/media-material/.gitignore b/packages/media-material/.gitignore new file mode 100644 index 0000000..21db1cc --- /dev/null +++ b/packages/media-material/.gitignore @@ -0,0 +1,30 @@ +.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 +git.token +cache \ No newline at end of file diff --git a/packages/media-material/.npmrc b/packages/media-material/.npmrc new file mode 100644 index 0000000..5a74d6e --- /dev/null +++ b/packages/media-material/.npmrc @@ -0,0 +1,2 @@ +registry=https://registry.npmmirror.com +shamefully-hoist=true \ No newline at end of file diff --git a/packages/media-material/.prettierrc.js b/packages/media-material/.prettierrc.js new file mode 100644 index 0000000..ad582b3 --- /dev/null +++ b/packages/media-material/.prettierrc.js @@ -0,0 +1,8 @@ +module.exports = { + semi: true, // 末尾保留分号 + singleQuote: true, // 使用单引号 + printWidth: 120, // 每行代码最大长度 + tabWidth: 2, // tab代表空格数 + useTabs: false, // 是否使用tab进行缩进,false表示用空格进行缩减 + trailingComma: 'es5', // 尾随逗号 + }; \ No newline at end of file diff --git a/packages/media-material/README.md b/packages/media-material/README.md new file mode 100644 index 0000000..68f2d3f --- /dev/null +++ b/packages/media-material/README.md @@ -0,0 +1,68 @@ +# 基于Plyr的多媒体物料库 + +此物料库包含物料库描述文件和物料组件代码 + +## 使用案例 +视频物料案例 +![alt 视频案例](./docs/public/video.png) + +音频物料案例 +![alt 音频物料](./docs/public/audio.png) + +生成的Scheme案例 +![alt 生成的Scheme](./docs/public/schema.png) + +## 使用指南 +### dev +```bash +npm run docs:dev # 开发环境 +``` +执行上面命令可进入到组件的开发环境,包括组件的文档。 + +### 组件库文档 +```bash +npm run docs:build +``` +执行上面命令,可构建出组件库文档。 + +### dev +```bash +npm run dev # 开发环境调试物料 +``` + +### build +```bash +npm run build # 生产环境 +``` +执行上面命令后,会在dist文件夹中生成组件的es库(index.es-browser.js)和物料描述(bundle.json) + +### 应用到TinyEngine上 + +可以将dist部署到静态服务器中,然后修改lowcode.config.js中物料请求地址 + +ps: 注意修改bundle.json中组件的npm中script和css的地址。 + +## 作品概述 + +### 项目背景 +在TinyEngine上开发项目时,可能有些组件库并不能满足所需场景,还需要搭建自己的组件库或者高阶组件,然后在发布到TinyEngine中使用,在此以音视频为例,搭建了一套自定义组件物料的模板,可以快速的帮助我们搭建符合需求的物料库。 + +### 应用领域 +Web多媒体 + +### 设计思路 +1. 使用VitePress搭建组件开发模板,可以在开发中预览组件和生成组件文档。 +2. 使用TinyEngine物料协议生成物料描述文件bundle.json +3. 将组件库打包成es模块文件,让TinyEngine可以加载组件库。 + +### 功能特点 +- 开发时可预览组件 +- 有组件文档 +- bundle.json文件更好维护 + +### 体系架构 +- vue +- vitepress +- plyr + +### 关键性技术 \ No newline at end of file diff --git a/packages/media-material/docs/.vitepress/config.ts b/packages/media-material/docs/.vitepress/config.ts new file mode 100644 index 0000000..e0e6e7a --- /dev/null +++ b/packages/media-material/docs/.vitepress/config.ts @@ -0,0 +1,48 @@ +import { defineConfig } from 'vitepress'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; +import { navbar, sidebar } from './configs'; +import path from 'path'; + +export default defineConfig({ + title: 'Material', + description: '物料库文档', + appearance: false, + vite: { + plugins: [vueJsx(), vanillaExtractPlugin()], + optimizeDeps: { + exclude: ['@vue/repl'], + }, + ssr: { + // lodash-es 模块是 esm,ssr 渲染的时候编译成 cjs 的引入方式,会引发 nodejs 的模块加载异常错误 + noExternal: ['lodash-es'], + external: ['@vue/repl'], + }, + resolve: { + alias: { + 'media-material': path.resolve('src/components.ts') + } + } + }, + + head: [['link', { rel: 'icon', href: './logo.svg' }]], + + themeConfig: { + logo: '/logo.svg', + nav: navbar.zh, + sidebar: sidebar.zh, + + outline: { + label: '本页目录', + }, + + search: { + provider: 'local', + }, + + footer: { + message: 'Released under the MIT License.', + copyright: 'Copyright © 2024-present Webank', + }, + }, +}); diff --git a/packages/media-material/docs/.vitepress/configs/index.ts b/packages/media-material/docs/.vitepress/configs/index.ts new file mode 100644 index 0000000..1a9315d --- /dev/null +++ b/packages/media-material/docs/.vitepress/configs/index.ts @@ -0,0 +1,2 @@ +export * as navbar from './navbar'; +export * as sidebar from './sidebar'; diff --git a/packages/media-material/docs/.vitepress/configs/navbar/index.ts b/packages/media-material/docs/.vitepress/configs/navbar/index.ts new file mode 100644 index 0000000..0980646 --- /dev/null +++ b/packages/media-material/docs/.vitepress/configs/navbar/index.ts @@ -0,0 +1 @@ +export * from './zh'; diff --git a/packages/media-material/docs/.vitepress/configs/navbar/zh.ts b/packages/media-material/docs/.vitepress/configs/navbar/zh.ts new file mode 100644 index 0000000..5c83d1f --- /dev/null +++ b/packages/media-material/docs/.vitepress/configs/navbar/zh.ts @@ -0,0 +1,11 @@ +export const zh = [ + { + text: '物料', + link: '/', + activeMatch: '/material/', + }, + { + text: '更新日志', + link: '/CHANGELOG.md', + }, +]; diff --git a/packages/media-material/docs/.vitepress/configs/sidebar/index.ts b/packages/media-material/docs/.vitepress/configs/sidebar/index.ts new file mode 100644 index 0000000..0980646 --- /dev/null +++ b/packages/media-material/docs/.vitepress/configs/sidebar/index.ts @@ -0,0 +1 @@ +export * from './zh'; diff --git a/packages/media-material/docs/.vitepress/configs/sidebar/zh.ts b/packages/media-material/docs/.vitepress/configs/sidebar/zh.ts new file mode 100644 index 0000000..e540d8b --- /dev/null +++ b/packages/media-material/docs/.vitepress/configs/sidebar/zh.ts @@ -0,0 +1,22 @@ + +export const zh = { + '/': [ + { + text: '组件', + items: [ + { + "text": "WVideo 视频", + "link": "/material/video.md" + }, + { + "text": "WAudio 音频", + "link": "/material/audio.md" + }, + { + "text": "WIFrame 嵌入网页", + "link": "/material/iframe.md" + } + ], + }, + ], +}; diff --git a/packages/media-material/docs/.vitepress/theme/components/ExampleDoc.vue b/packages/media-material/docs/.vitepress/theme/components/ExampleDoc.vue new file mode 100644 index 0000000..88533bd --- /dev/null +++ b/packages/media-material/docs/.vitepress/theme/components/ExampleDoc.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/packages/media-material/docs/.vitepress/theme/components/space.vue b/packages/media-material/docs/.vitepress/theme/components/space.vue new file mode 100644 index 0000000..2ffae0c --- /dev/null +++ b/packages/media-material/docs/.vitepress/theme/components/space.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/packages/media-material/docs/.vitepress/theme/custom.css b/packages/media-material/docs/.vitepress/theme/custom.css new file mode 100644 index 0000000..67ce7bc --- /dev/null +++ b/packages/media-material/docs/.vitepress/theme/custom.css @@ -0,0 +1,8 @@ +:root { + --vp-c-brand: #5384ff; + --vp-button-brand-border: #5384ff; + --vp-button-brand-hover-border: #5384ff; + --vp-button-brand-hover-bg: #759dff; + --vp-local-search-highlight-bg: #7da6ff; + --vp-c-brand-light: #747bff; +} diff --git a/packages/media-material/docs/.vitepress/theme/index.ts b/packages/media-material/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..258d381 --- /dev/null +++ b/packages/media-material/docs/.vitepress/theme/index.ts @@ -0,0 +1,21 @@ + +import DefaultTheme from 'vitepress/theme'; +import type { App } from 'vue'; +import { install } from '../../../src/preview'; +import Space from './components/space.vue'; + +import './custom.css'; +import ExampleDoc from './components/ExampleDoc.vue'; +import * as Examples from '../../examples/index'; + +export default { + extends: DefaultTheme, + enhanceApp({ app }: { app: App }) { + install(app); + app.component('ExampleDoc', ExampleDoc) + app.component('Space', Space); + Object.keys(Examples).forEach(key => { + app.component(key, Examples[key]); + }); + }, +}; diff --git a/packages/media-material/docs/examples/audioDemo.vue b/packages/media-material/docs/examples/audioDemo.vue new file mode 100644 index 0000000..7bbea85 --- /dev/null +++ b/packages/media-material/docs/examples/audioDemo.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/packages/media-material/docs/examples/iframeDemo.vue b/packages/media-material/docs/examples/iframeDemo.vue new file mode 100644 index 0000000..3390ca9 --- /dev/null +++ b/packages/media-material/docs/examples/iframeDemo.vue @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/packages/media-material/docs/examples/index.ts b/packages/media-material/docs/examples/index.ts new file mode 100644 index 0000000..048829c --- /dev/null +++ b/packages/media-material/docs/examples/index.ts @@ -0,0 +1,11 @@ +import VideoDemo from "./videoDemo.vue"; +import AudioDemo from './audioDemo.vue' +import VideoQuality from './videoQuality.vue' +import IframeDemo from './iframeDemo.vue' + +export { + VideoDemo, + VideoQuality, + AudioDemo, + IframeDemo +} \ No newline at end of file diff --git a/packages/media-material/docs/examples/videoDemo.vue b/packages/media-material/docs/examples/videoDemo.vue new file mode 100644 index 0000000..1441646 --- /dev/null +++ b/packages/media-material/docs/examples/videoDemo.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/packages/media-material/docs/examples/videoQuality.vue b/packages/media-material/docs/examples/videoQuality.vue new file mode 100644 index 0000000..b50feaf --- /dev/null +++ b/packages/media-material/docs/examples/videoQuality.vue @@ -0,0 +1,24 @@ + + \ No newline at end of file diff --git a/packages/media-material/docs/index.md b/packages/media-material/docs/index.md new file mode 100644 index 0000000..53f79cc --- /dev/null +++ b/packages/media-material/docs/index.md @@ -0,0 +1,3 @@ +# Media Material + +多媒体组件库 \ No newline at end of file diff --git a/packages/media-material/docs/material/audio.md b/packages/media-material/docs/material/audio.md new file mode 100644 index 0000000..39770f9 --- /dev/null +++ b/packages/media-material/docs/material/audio.md @@ -0,0 +1,59 @@ +## MAudio 音频 + +## 基本使用 +通过src设置视频地址 + + + + + + +## Props + +| 属性 | 说明 | 类型 | 默认值 | +| ---------------- | ------------------------------------------------------------------------------ | ----------------- | --------------------- | +| src | 多媒体资源地址 | `String` `Array` | - | +| autoplay | 是否自动播放 | `Boolean` | `false` | +| loop | 是否循环播放 | `Boolean` | `false` | +| muted | 是否静音 | `Boolean` | `false` | +| currentTime | 当前播放时间 | `Number` | - | +| volume | 音量 | `Number` | - | +| speed | 播放速度 | `Number` | `1` | +| crossorigin | 跨域设置 | `String` | - | +## Events + +| 事件名称 | 说明 | 回调参数 | +| -------- | ---------------- | --------------- | +| `progress` | Sent periodically to inform interested parties of progress downloading the media. Information about the current amount of the media that has been downloaded is available in the media element's `buffered` attribute. | +| `playing` | Sent when the media begins to play (either for the first time, after having been paused, or after ending and then restarting). | +| `play` | Sent when playback of the media starts after having been paused; that is, when playback is resumed after a prior `pause` event. | +| `pause` | Sent when playback is paused. | +| `timeupdate` | The time indicated by the element's `currentTime` attribute has changed. | +| `volumechange` | Sent when the audio volume changes (both when the volume is set and when the `muted` state is changed). | +| `seeking` | Sent when a seek operation begins. | +| `seeked` | Sent when a seek operation completes. | +| `ratechange` | Sent when the playback speed changes. | +| `ended` | Sent when playback completes. _Note:_ This does not fire if `autoplay` is true. | +| `enterfullscreen` | Sent when the player enters fullscreen mode (either the proper fullscreen or full-window fallback for older browsers). | +| `exitfullscreen` | Sent when the player exits fullscreen mode. | +| `captionsenabled` | Sent when captions are enabled. | +| `captionsdisabled` | Sent when captions are disabled. | +| `languagechange` | Sent when the caption language is changed. | +| `controlshidden` | Sent when the controls are hidden. | +| `controlsshown` | Sent when the controls are shown. | +| `ready` | Triggered when the instance is ready for API calls. +| `loadstart` | Sent when loading of the media begins. | +| `loadeddata` | The first frame of the media has finished loading. | +| `loadedmetadata` | The media's metadata has finished loading; all attributes now contain as much useful information as they're going to. | +| `qualitychange` | The quality of playback has changed. | +| `canplay` | Sent when enough data is available that the media can be played, at least for a couple of frames. This corresponds to the `HAVE_ENOUGH_DATA` `readyState`. | +| `canplaythrough` | Sent when the ready state changes to `CAN_PLAY_THROUGH`, indicating that the entire media can be played without interruption, assuming the download rate remains at least at the current level. _Note:_ Manually setting the `currentTime` will eventually fire a `canplaythrough` event in firefox. Other browsers might not fire this event. | +| `stalled` | Sent when the user agent is trying to fetch media data, but data is unexpectedly not forthcoming. | +| `waiting` | Sent when the requested operation (such as playback) is delayed pending the completion of another operation (such as a seek). | +| `emptied` | he media has become empty; for example, this event is sent if the media has already been loaded (or partially loaded), and the `load()` method is called to reload it. | +| `cuechange` | Sent when a `TextTrack` has changed the currently displaying cues. | +| `error` | Sent when an error occurs. The element's `error` attribute contains more information. diff --git a/packages/media-material/docs/material/iframe.md b/packages/media-material/docs/material/iframe.md new file mode 100644 index 0000000..2224bae --- /dev/null +++ b/packages/media-material/docs/material/iframe.md @@ -0,0 +1,36 @@ +## MIframe 嵌入网页 + +## 基本使用 +通过src设置网页地址 + + + + + + +## Props + +| 属性 | 说明 | 类型 | 默认值 | +| ---------------- | ------------------------------------------------------------------------------ | ----------------- | --------------------- | +| src | 网页地址 | `String` | - | +| width | 宽度 | `String` | `-` | +| height | 高度 | `String` | `-` | +| name | 网页名,用于定位嵌入的浏览上下文的名称称 | `String` | `-` | +| referrerpolicy | 表示在获取 iframe 资源时如何发送 referrer 首部 | `String` | | + +### referrerpolicy 可选值 +- no-referrer: 不发送 +- no-referrer-when-downgrade: 仅在从 HTTPS 到 HTTP 时发送 +- origin: 只发送域名 +- origin-when-cross-origin: 跨域时只发送域名 +- same-origin: 同源时发送完整的 referrer +- strict-origin: 同源并且同协议时发送完整的 referrer +- strict-origin-when-cross-origin: 跨域并且是HTTPS时发送完整的 referrer +- unsafe-url: 总是发送 + +## Events +MIframe 组件继承了所有原生的 iframe 标签的事件 \ No newline at end of file diff --git a/packages/media-material/docs/material/video.md b/packages/media-material/docs/material/video.md new file mode 100644 index 0000000..123315d --- /dev/null +++ b/packages/media-material/docs/material/video.md @@ -0,0 +1,76 @@ +## MVideo 视频 + +## 基本使用 +通过src设置视频地址 + + + + + + + +## 多种画质 +src可接收数组,设置多种画质,并可以通过quality属性指定画质 + + + + + + + +## Props + +| 属性 | 说明 | 类型 | 默认值 | +| ---------------- | ------------------------------------------------------------------------------ | ----------------- | --------------------- | +| src | 多媒体资源地址 | `String` `Array` | - | +| poster | 封面图片地址,仅MVideo有效 | `String` | - | +| autoplay | 是否自动播放 | `Boolean` | `false` | +| loop | 是否循环播放 | `Boolean` | `false` | +| muted | 是否静音 | `Boolean` | `false` | +| currentTime | 当前播放时间 | `Number` | - | +| volume | 音量 | `Number` | - | +| speed | 播放速度 | `Number` | `1` | +| quality | 画质,仅MVideo有效 | `Number` | - | +| crossorigin | 跨域设置 | `anonymous` `use-credentials` | - | +| blankVideo | 空白视频地址,仅MVideo有效 | `String` | - | +## Events + +| 事件名称 | 说明 | 回调参数 | +| -------- | ---------------- | --------------- | +| `progress` | Sent periodically to inform interested parties of progress downloading the media. Information about the current amount of the media that has been downloaded is available in the media element's `buffered` attribute. | +| `playing` | Sent when the media begins to play (either for the first time, after having been paused, or after ending and then restarting). | +| `play` | Sent when playback of the media starts after having been paused; that is, when playback is resumed after a prior `pause` event. | +| `pause` | Sent when playback is paused. | +| `timeupdate` | The time indicated by the element's `currentTime` attribute has changed. | +| `volumechange` | Sent when the audio volume changes (both when the volume is set and when the `muted` state is changed). | +| `seeking` | Sent when a seek operation begins. | +| `seeked` | Sent when a seek operation completes. | +| `ratechange` | Sent when the playback speed changes. | +| `ended` | Sent when playback completes. _Note:_ This does not fire if `autoplay` is true. | +| `enterfullscreen` | Sent when the player enters fullscreen mode (either the proper fullscreen or full-window fallback for older browsers). | +| `exitfullscreen` | Sent when the player exits fullscreen mode. | +| `captionsenabled` | Sent when captions are enabled. | +| `captionsdisabled` | Sent when captions are disabled. | +| `languagechange` | Sent when the caption language is changed. | +| `controlshidden` | Sent when the controls are hidden. | +| `controlsshown` | Sent when the controls are shown. | +| `ready` | Triggered when the instance is ready for API calls. +| `loadstart` | Sent when loading of the media begins. | +| `loadeddata` | The first frame of the media has finished loading. | +| `loadedmetadata` | The media's metadata has finished loading; all attributes now contain as much useful information as they're going to. | +| `qualitychange` | The quality of playback has changed. | +| `canplay` | Sent when enough data is available that the media can be played, at least for a couple of frames. This corresponds to the `HAVE_ENOUGH_DATA` `readyState`. | +| `canplaythrough` | Sent when the ready state changes to `CAN_PLAY_THROUGH`, indicating that the entire media can be played without interruption, assuming the download rate remains at least at the current level. _Note:_ Manually setting the `currentTime` will eventually fire a `canplaythrough` event in firefox. Other browsers might not fire this event. | +| `stalled` | Sent when the user agent is trying to fetch media data, but data is unexpectedly not forthcoming. | +| `waiting` | Sent when the requested operation (such as playback) is delayed pending the completion of another operation (such as a seek). | +| `emptied` | he media has become empty; for example, this event is sent if the media has already been loaded (or partially loaded), and the `load()` method is called to reload it. | +| `cuechange` | Sent when a `TextTrack` has changed the currently displaying cues. | +| `error` | Sent when an error occurs. The element's `error` attribute contains more information. diff --git a/packages/media-material/docs/public/audio.png b/packages/media-material/docs/public/audio.png new file mode 100644 index 0000000..e5da466 Binary files /dev/null and b/packages/media-material/docs/public/audio.png differ diff --git a/packages/media-material/docs/public/schema.png b/packages/media-material/docs/public/schema.png new file mode 100644 index 0000000..54468c4 Binary files /dev/null and b/packages/media-material/docs/public/schema.png differ diff --git a/packages/media-material/docs/public/video.png b/packages/media-material/docs/public/video.png new file mode 100644 index 0000000..77a5d1d Binary files /dev/null and b/packages/media-material/docs/public/video.png differ diff --git a/packages/media-material/package.json b/packages/media-material/package.json new file mode 100644 index 0000000..194f13f --- /dev/null +++ b/packages/media-material/package.json @@ -0,0 +1,48 @@ +{ + "name": "media-material", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "build": "node scripts/build.mjs", + "dev": "node scripts/dev.mjs", + "lint": "eslint -c ./.eslintrc.js --fix --ext .js,.vue,.ts ./src" + }, + "dependencies": { + "vue": "^3.4.19", + "plyr": "^3.7.8" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.21.3", + "@babel/core": "^7.16.0", + "@babel/plugin-syntax-jsx": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-typescript": "^7.16.7", + "@vitejs/plugin-vue": "^5.0.4", + "eslint-plugin-vue": "^8.0.0", + "vite": "^5.1.4", + "vue-tsc": "^1.8.27", + "fs-extra": "^11.2.0", + "vitepress": "^1.0.0-rc.45", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vanilla-extract/vite-plugin": "^4.0.5", + "vite-plugin-static-copy": "^1.0.1", + "@typescript-eslint/eslint-plugin": "5.33.1", + "@typescript-eslint/parser": "5.33.1", + "babel-eslint": "^10.1.0", + "chalk": "^5.2.0", + "commitizen": "^4.2.5", + "cz-conventional-changelog": "^3.3.0", + "eslint": "^8.28.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "husky": "^7.0.4", + "lerna": "^5.4.2", + "lint-staged": "^13.0.3", + "prettier": "^2.8.0", + "typescript": "4.7.4" + } +} diff --git a/packages/media-material/public/vite.svg b/packages/media-material/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/packages/media-material/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/media-material/scripts/build.mjs b/packages/media-material/scripts/build.mjs new file mode 100644 index 0000000..e18beb8 --- /dev/null +++ b/packages/media-material/scripts/build.mjs @@ -0,0 +1,15 @@ +import { build } from "vite" +import { getBuildLibConfig, getBuildMetaConfig, } from "./shared.mjs" + +const main = async () => { + await build(getBuildLibConfig()) + await build(getBuildMetaConfig({ + define: { + 'process.env': { + HOST: '/' + }, + }, + })) +} + +main() diff --git a/packages/media-material/scripts/dev.mjs b/packages/media-material/scripts/dev.mjs new file mode 100644 index 0000000..a95c5c7 --- /dev/null +++ b/packages/media-material/scripts/dev.mjs @@ -0,0 +1,29 @@ +import { build } from "vite" +import { preview } from "vite" +import { getBuildLibConfig, getBuildMetaConfig, } from "./shared.mjs" + +const main = async () => { + const server = await preview({ + preview: { + port: 9527, + host: '0.0.0.0' + }, + }) + + const host = server.resolvedUrls.local[0]; + await build(getBuildLibConfig({ build: { watch: true } })) + await build(getBuildMetaConfig({ + build: { watch: true }, + define: { + 'process.env': { + HOST: host + }, + }, + })) + + server.printUrls() + server.bindCLIShortcuts({ print: true }) + console.log(`Material URL:${host}assets/bundle.json`) +} + +main() diff --git a/packages/media-material/scripts/shared.mjs b/packages/media-material/scripts/shared.mjs new file mode 100644 index 0000000..597982f --- /dev/null +++ b/packages/media-material/scripts/shared.mjs @@ -0,0 +1,94 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; +import path from 'path'; +import { ensureFileSync } from 'fs-extra'; +import { writeFileSync } from 'fs'; +import { mergeConfig } from 'vite'; + +const rootDir = process.cwd(); +const SOURCE_PATH = path.join(rootDir, './src/components.ts'); +const META_PATH = path.join(rootDir, './src/meta.ts'); +const META_BUNDLE = path.join(rootDir, 'dist/assets/bundle.json'); + +export const getBuildLibConfig = (config) => { + const defaultConfig = defineConfig({ + outDir: 'dist', + plugins: [ + vue(), + vueJsx(), + vanillaExtractPlugin(), + ], + build: { + emptyOutDir: true, + minify: false, + lib: { + entry: SOURCE_PATH, + name: 'MediaPlayer', + fileName: () => { + return `index.es-browser.js`; + }, + formats: ['es'], + }, + rollupOptions: { + external: ['vue'], + output: { + assetFileNames: (assetInfo) => { + if (assetInfo.name === 'style.css') return `index.css`; + return assetInfo.name; + }, + exports: 'named', + globals: { + vue: 'Vue', + }, + }, + }, + }, + }) + return mergeConfig(defaultConfig, config) +} + + +export default function TransformMetaToJSON() { + return { + name: 'transform-meta-to-json', + async writeBundle(options, bundle) { + eval((bundle['meta.js'].code)) + const meta = globalThis.MediaMeta.meta; + const metaJson = JSON.stringify(meta, null, 2); + ensureFileSync(META_BUNDLE) + writeFileSync(META_BUNDLE, metaJson) + console.log('built dist/assets/bundle.json') + }, + } + } + +export const getBuildMetaConfig = (config) => { + const defaultConfig = defineConfig({ + outDir: 'dist', + plugins: [ + vue(), + vueJsx(), + vanillaExtractPlugin(), + TransformMetaToJSON() + ], + define: { + 'process.env': { + HOST: 'http://localhost' + }, + }, + build: { + emptyOutDir: false, + lib: { + entry: META_PATH, + name: 'MediaMeta', + fileName: () => { + return `meta.js`; + }, + formats: ['umd'], + }, + } + }) + return mergeConfig(defaultConfig, config) +} \ No newline at end of file diff --git a/packages/media-material/src/components.ts b/packages/media-material/src/components.ts new file mode 100644 index 0000000..f944333 --- /dev/null +++ b/packages/media-material/src/components.ts @@ -0,0 +1,2 @@ +export * from "./media"; +export * from "./iframe" \ No newline at end of file diff --git a/packages/media-material/src/const.meta.ts b/packages/media-material/src/const.meta.ts new file mode 100644 index 0000000..ca24af5 --- /dev/null +++ b/packages/media-material/src/const.meta.ts @@ -0,0 +1,12 @@ +import { NPMInfo } from "./type" + +export const VERSION = '0.0.1' + +export const HOST = process.env.HOST + +export const NPM: NPMInfo = { + package: "media-material", + version: VERSION, + script: `${HOST}index.es-browser.js`, + css: `${HOST}index.css`, +} \ No newline at end of file diff --git a/packages/media-material/src/iframe/const.ts b/packages/media-material/src/iframe/const.ts new file mode 100644 index 0000000..1e628c5 --- /dev/null +++ b/packages/media-material/src/iframe/const.ts @@ -0,0 +1,37 @@ +export const ComponentName = 'MIframe'; + +export const EVENT_NAMES = [ + 'click', + 'resize', + 'scroll', + 'dblclick', + 'mousedown', + 'mouseenter', + 'mouseleave', + 'mousemove', + 'mouseout', + 'mouseover', + 'mouseup', + 'mousewheel', + 'drag', + 'dragend', + 'dragenter', + 'dragleave', + 'dragover', + 'dragstart', + 'drop', + 'abort', + 'autocomplete', + 'autocompleteerror', + 'blur', + 'change', + 'close', + 'contextmenu', + 'error', + 'focus', + 'keydown', + 'keypress', + 'keyup', + 'load', + 'reset', +] \ No newline at end of file diff --git a/packages/media-material/src/iframe/index.meta.ts b/packages/media-material/src/iframe/index.meta.ts new file mode 100644 index 0000000..1bd5ab5 --- /dev/null +++ b/packages/media-material/src/iframe/index.meta.ts @@ -0,0 +1,164 @@ +import { NPM } from "../const.meta"; +import { Component, ComponentEvent, Snippet } from "../type"; +import { ComponentName, EVENT_NAMES } from "./const"; + + +const CommEvent: Record = {} +EVENT_NAMES.forEach(name => { + const evtName = `on${name.replace(name[0], name[0].toLocaleUpperCase())}` + CommEvent[evtName] = { + label: { + zh_CN: evtName, + }, + description: { + zh_CN: evtName, + }, + type: 'event', + functionInfo: { + params: [{ + name: "event", + type: "Object", + defaultValue: "", + description: { + zh_CN: "event" + } + }], + }, + defaultValue: "" + } +}) + +const CommProp = { + required: true, + readOnly: false, + disabled: false, + cols: 12, + labelPosition: "top", +} +export const IframeDesc: Component = { + name: { + zh_CN: '嵌入网页' + }, + npm: { + ...NPM, + exportName: ComponentName + }, + component: ComponentName, + icon: 'iframe', + group: "多媒体组件", + category: "多媒体", + description: '嵌入网页', + schema: { + properties: [ + { + name: '0', + label: { + zh_CN: '基础属性', + }, + description: { + zh_CN: '基础属性', + }, + content: [ + { + ...CommProp, + property: 'src', + type: 'string', + description: { + zh_CN: '网页地址' + }, + widget: { + component: 'MetaInput', + props: {} + } + }, + { + ...CommProp, + property: 'width', + type: 'string', + description: { + zh_CN: '宽度' + }, + widget: { + component: 'MetaInput', + props: {} + } + }, + { + ...CommProp, + property: 'height', + type: 'string', + description: { + zh_CN: '高度' + }, + widget: { + component: 'MetaInput', + props: {} + } + }, + { + ...CommProp, + property: 'name', + type: 'string', + description: { + zh_CN: '网页名称,用于定位嵌入的浏览上下文的名称' + }, + widget: { + component: 'MetaInput', + props: {} + } + }, + { + ...CommProp, + property: 'referrerpolicy', + type: 'string', + description: { + zh_CN: '表示在获取 iframe 资源时如何发送 referrer 首部' + }, + widget: { + component: 'MetaSelect', + props: { + options: [ + { value: 'no-referrer', label: '不发送' }, + { value: 'no-referrer-when-downgrade', label: '仅在从 HTTPS 到 HTTP 时发送' }, + { value: 'origin', label: '只发送域名' }, + { value: 'origin-when-cross-origin', label: '跨域时只发送域名' }, + { value: 'same-origin', label: '同源时发送完整的 referrer' }, + { value: 'strict-origin', label: '同源并且同协议时发送完整的 referrer' }, + { value: 'strict-origin-when-cross-origin', label: '跨域并且是HTTPS时发送完整的 referrer' }, + { value: 'unsafe-url', label: '总是发送' }, + ] + } + } + }, + + ] + } + ], + events: { ...CommEvent }, + }, + configure: { + loop: true, + condition: true, + styles: true, + shortcuts: { + properties: ['src', 'width', 'height'] + }, + } +} + +export const IframeSnippet: Snippet = { + icon: 'iframe', + snippetName: ComponentName, + name: { + zh_CN: '嵌入网页' + }, + screenshot: '', + schema: { + componentName: ComponentName, + props: { + src: 'https://opentiny.design/', + width: '100%', + height: '350px', + }, + } +} \ No newline at end of file diff --git a/packages/media-material/src/iframe/index.ts b/packages/media-material/src/iframe/index.ts new file mode 100644 index 0000000..c1537b0 --- /dev/null +++ b/packages/media-material/src/iframe/index.ts @@ -0,0 +1,9 @@ +import { defineComponent, h } from "vue"; + +function generateHtmlComp(name: string) { + return defineComponent((_, { attrs, slots }) => { + return () => h(name, attrs, slots); + }); +} + +export const MIframe = generateHtmlComp("iframe"); \ No newline at end of file diff --git a/packages/media-material/src/media/assets/blank.mp4 b/packages/media-material/src/media/assets/blank.mp4 new file mode 100644 index 0000000..d8982b6 Binary files /dev/null and b/packages/media-material/src/media/assets/blank.mp4 differ diff --git a/packages/media-material/src/media/assets/plyr.svg b/packages/media-material/src/media/assets/plyr.svg new file mode 100644 index 0000000..62ab257 --- /dev/null +++ b/packages/media-material/src/media/assets/plyr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/media-material/src/media/audio.jsx b/packages/media-material/src/media/audio.jsx new file mode 100644 index 0000000..943a410 --- /dev/null +++ b/packages/media-material/src/media/audio.jsx @@ -0,0 +1,21 @@ +import { defineComponent } from 'vue'; +import { mediaProps, usePlayer } from './helper'; +import 'plyr/dist/plyr.css'; +import { EVENT_NAMES, audioName } from './const'; + +export default defineComponent({ + name: audioName, + props: mediaProps, + emits: [...EVENT_NAMES], + setup(props, { emit, expose }) { + const { playerRef, getPlayer, play, pause, restart, stop } = usePlayer(props, emit, 'audio'); + expose({ playerRef, getPlayer, play, pause, restart, stop }) + + return () => ( +
+
+ ) + }, +}); + diff --git a/packages/media-material/src/media/const.ts b/packages/media-material/src/media/const.ts new file mode 100644 index 0000000..862d47c --- /dev/null +++ b/packages/media-material/src/media/const.ts @@ -0,0 +1,33 @@ +export const videoName = 'MVideo'; +export const audioName = 'MAudio'; + +export const EVENT_NAMES = [ + 'progress', + 'playing', + 'play', + 'pause', + 'timeupdate', + 'volumechange', + 'seeking', + 'seeked', + 'ratechange', + 'ended', + 'enterfullscreen', + 'exitfullscreen', + 'captionsenabled', + 'captionsdisabled', + 'languagechange', + 'controlshidden', + 'controlsshown', + 'loadstart', + 'loadeddata', + 'loadedmetadata', + 'qualitychange', + 'canplay', + 'canplaythrough', + 'stalled', + 'waiting', + 'emptied', + 'cuechange', + 'error', +]; \ No newline at end of file diff --git a/packages/media-material/src/media/helper.ts b/packages/media-material/src/media/helper.ts new file mode 100644 index 0000000..b0b46d1 --- /dev/null +++ b/packages/media-material/src/media/helper.ts @@ -0,0 +1,145 @@ +import Plyr from 'plyr'; +import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'; +import iconSvg from './assets/plyr.svg'; +import type { MediaType } from 'plyr'; +import type { ExtractPublicPropTypes, Ref } from 'vue'; + +export const mediaProps = { + src: { + type: [String, Array], + default: '', + }, + poster: { + type: String, + default: '', + }, + autoplay: { + type: Boolean, + default: false, + }, + muted: { + type: Boolean, + default: false, + }, + loop: { + type: Boolean, + }, + currentTime: { + type: Number, + }, + volume: { + type: Number, + }, + speed: { + type: Number, + }, + quality: { + type: Number, + }, + crossorigin: { + type: String, + }, + blankVideo: { + type: String, + }, +}; + +type MediaProps = ExtractPublicPropTypes; + +export const usePlayer = (props: MediaProps, emit: (event: string, ...args: any[]) => void, type: 'video' | 'audio') => { + const playerRef: Ref = ref(null); + let player: Plyr; + + const computedSource = computed(() => { + if (!props.src) + return; + const source = { + type: type as MediaType, + sources: [] as any[], + }; + if (Array.isArray(props.src)) { + source.sources = props.src; + } else { + source.sources = [ + { + src: props.src, + type: type === 'video' ? `${type}/mp4` : `${type}/mp3`, + }, + ]; + } + return source; + }); + + watch(() => props.autoplay, () => player && (player.autoplay = props.autoplay)); + watch(() => props.currentTime, () => player && (player.currentTime = props.currentTime)); + watch(() => props.muted, () => player && (player.muted = props.muted)); + watch(() => props.volume, () => player && (player.volume = props.volume)); + watch(() => props.speed, () => player && (player.speed = props.speed)); + watch(() => props.loop, () => player && (player.loop = props.loop)); + watch(() => props.poster, () => player && (player.poster = props.poster)); + watch(() => props.quality, () => player && (player.quality = props.quality)); + watch(computedSource, () => { + if (!player) + return; + player.source = computedSource.value; + }); + + onMounted(() => { + if (!playerRef.value) return; + player = new Plyr(playerRef.value, { + loadSprite: true, + iconUrl: iconSvg, + blankVideo: props.blankVideo, + }); + player.source = computedSource.value; + player.poster = props.poster; + player.autoplay = props.autoplay; + player.currentTime = props.currentTime; + player.muted = props.muted; + player.volume = props.volume; + player.speed = props.speed; + player.loop = props.loop; + player.quality = props.quality; + player.on('progress', (evt) => emit('progress', evt)); + player.on('playing', (evt) => emit('playing', evt)); + player.on('play', (evt) => emit('play', evt)); + player.on('pause', (evt) => emit('pause', evt)); + player.on('timeupdate', (evt) => emit('timeupdate', evt)); + player.on('volumechange', (evt) => emit('volumechange', evt)); + player.on('seeking', (evt) => emit('seeking', evt)); + player.on('seeked', (evt) => emit('seeked', evt)); + player.on('ratechange', (evt) => emit('ratechange', evt)); + player.on('ended', (evt) => emit('ended', evt)); + player.on('enterfullscreen', (evt) => emit('enterfullscreen', evt)); + player.on('exitfullscreen', (evt) => emit('exitfullscreen', evt)); + player.on('captionsenabled', (evt) => emit('captionsenabled', evt)); + player.on('captionsdisabled', (evt) => emit('captionsdisabled', evt)); + player.on('languagechange', (evt) => emit('languagechange', evt)); + player.on('controlshidden', (evt) => emit('controlshidden', evt)); + player.on('controlsshown', (evt) => emit('controlsshown', evt)); + player.on('loadstart', (evt) => emit('loadstart', evt)); + player.on('loadeddata', (evt) => emit('loadeddata', evt)); + player.on('loadedmetadata', (evt) => emit('loadedmetadata', evt)); + player.on('qualitychange', (evt) => emit('qualitychange', evt)); + player.on('canplay', (evt) => emit('canplay', evt)); + player.on('canplaythrough', (evt) => emit('canplaythrough', evt)); + player.on('stalled', (evt) => emit('stalled', evt)); + player.on('waiting', (evt) => emit('waiting', evt)); + player.on('emptied', (evt) => emit('emptied', evt)); + player.on('cuechange', (evt) => emit('cuechange', evt)); + player.on('error', (evt) => emit('error', evt)); + }); + + onBeforeUnmount(() => { + player?.destroy(); + }); + + return { + playerRef, + getPlayer: () => player, + play: () => player?.play(), + pause: () => player?.pause(), + restart: () => player?.restart(), + stop: () => player?.stop(), + }; +}; diff --git a/packages/media-material/src/media/index.meta.ts b/packages/media-material/src/media/index.meta.ts new file mode 100644 index 0000000..f639a49 --- /dev/null +++ b/packages/media-material/src/media/index.meta.ts @@ -0,0 +1,320 @@ +import { NPM } from "../const.meta"; +import { Component, ComponentEvent, ComponentProp, Snippet } from "../type"; +import { EVENT_NAMES, audioName, videoName } from "./const"; + + +const CommEvent: Record = {} +EVENT_NAMES.forEach(name => { + const evtName = `on${name.replace(name[0], name[0].toLocaleUpperCase())}` + CommEvent[evtName] = { + label: { + zh_CN: evtName, + }, + description: { + zh_CN: evtName, + }, + type: 'event', + functionInfo: { + params: [{ + name: "event", + type: "Object", + defaultValue: "", + description: { + zh_CN: "event" + } + }], + }, + defaultValue: "" + } +}) + +const CommProp = { + required: true, + readOnly: false, + disabled: false, + cols: 12, + labelPosition: "top", +} + +const mediaProps: ComponentProp[] = [ + { + ...CommProp, + property: 'src', + type: 'string', + label: { + text: { + zh_CN: '地址' + } + }, + description: { + zh_CN: '输入资源地址' + }, + widget: { + component: 'MetaInput', + props: {} + } + }, + { + ...CommProp, + property: 'autoplay', + type: 'boolean', + label: { + text: { + zh_CN: '自动播放' + } + }, + description: { + zh_CN: '资源加载完成后是否自动播放' + }, + defaultValue: false, + widget: { + component: 'MetaSwitch', + props: {} + } + }, + { + ...CommProp, + property: 'muted', + type: 'boolean', + label: { + text: { + zh_CN: '静音播放' + } + }, + description: { + zh_CN: '是否静音播放' + }, + defaultValue: false, + widget: { + component: 'MetaSwitch', + props: {} + } + }, + { + ...CommProp, + property: 'loop', + type: 'boolean', + label: { + text: { + zh_CN: '循环播放' + } + }, + description: { + zh_CN: '是否循环播放' + }, + defaultValue: false, + widget: { + component: 'MetaSwitch', + props: {} + } + }, + { + ...CommProp, + property: 'currentTime', + type: 'number', + label: { + text: { + zh_CN: '快进到当前' + } + }, + description: { + zh_CN: '快进到当前播放位置,范围0到资源时长' + }, + defaultValue: 0, + widget: { + component: 'MetaNumber', + props: {} + } + }, + { + ...CommProp, + property: 'volume', + type: 'number', + label: { + text: { + zh_CN: '音量' + } + }, + description: { + zh_CN: '当前音量,范围0-1' + }, + defaultValue: 0.5, + widget: { + component: 'MetaNumber', + props: {} + } + }, + { + ...CommProp, + property: 'speed', + type: 'number', + label: { + text: { + zh_CN: '倍速播放' + } + }, + description: { + zh_CN: '倍速播放' + }, + defaultValue: 1, + widget: { + component: 'MetaSelect', + props: { + options: [ + { label: '0.5倍', value: 0.5 }, + { label: '正常', value: 1 }, + { label: '1.5倍', value: 1.5 }, + { label: '2倍', value: 2 }, + { label: '4倍', value: 4 } + ] + } + } + }, + { + ...CommProp, + property: 'crossorigin', + type: 'number', + description: { + zh_CN: '跨域策略' + }, + defaultValue: '', + widget: { + component: 'MetaSelect', + props: { + options: [ + { + "label": "匿名", + "value": "anonymous" + }, + { + "label": "携带凭证", + "value": "use-credentials" + } + ] + } + } + }, +] + +export const VideoDesc: Component = { + name: { + zh_CN: '视频' + }, + npm: { + ...NPM, + exportName: videoName + }, + component: videoName, + icon: 'video', + group: "多媒体组件", + category: "多媒体", + description: '视频组件', + schema: { + properties: [ + { + name: '0', + label: { + zh_CN: '基础属性', + }, + description: { + zh_CN: '基础属性', + }, + content: [ + { + ...CommProp, + description: { + zh_CN: '海报地址,视频播放前展示' + }, + property: 'poster', + type: 'string', + widget: { + component: 'MetaInput', + props: {} + } + }, + ...mediaProps, + ] + } + ], + events: { ...CommEvent }, + }, + configure: { + loop: true, + condition: true, + styles: true, + shortcuts: { + properties: ['src', 'poster', 'autoplay'] + }, + } +} + +export const VideoSnippet: Snippet = { + icon: 'video', + snippetName: videoName, + name: { + zh_CN: '视频' + }, + screenshot: '', + schema: { + componentName: videoName, + props: { + src: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4", + poster: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg" + }, + } +} + +export const AudioDesc: Component = { + name: { + zh_CN: '音频' + }, + npm: { + ...NPM, + exportName: audioName + }, + component: audioName, + icon: 'audio', + group: "多媒体组件", + category: "多媒体", + description: '音频组件', + schema: { + properties: [ + { + name: '0', + label: { + zh_CN: '基础属性', + }, + description: { + zh_CN: '基础属性', + }, + content: [ + ...mediaProps + ] + } + ], + events: { ...CommEvent }, + }, + configure: { + loop: true, + condition: true, + styles: true, + shortcuts: { + properties: ['src', 'autoplay'] + }, + } +} + +export const AudioSnippet: Snippet = { + icon: 'audio', + snippetName: audioName, + name: { + zh_CN: '音频' + }, + screenshot: '', + schema: { + componentName: audioName, + props: { + src: "https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3", + }, + } +} \ No newline at end of file diff --git a/packages/media-material/src/media/index.ts b/packages/media-material/src/media/index.ts new file mode 100644 index 0000000..01847f8 --- /dev/null +++ b/packages/media-material/src/media/index.ts @@ -0,0 +1,7 @@ +import MVideo from './video'; +import MAudio from './audio'; + +export { + MVideo, + MAudio, +}; diff --git a/packages/media-material/src/media/video.jsx b/packages/media-material/src/media/video.jsx new file mode 100644 index 0000000..e3e479e --- /dev/null +++ b/packages/media-material/src/media/video.jsx @@ -0,0 +1,21 @@ +import { defineComponent } from 'vue'; +import { mediaProps, usePlayer } from './helper'; +import 'plyr/dist/plyr.css'; +import { EVENT_NAMES, videoName } from './const'; + +export default defineComponent({ + name: videoName, + props: mediaProps, + emits: [...EVENT_NAMES], + setup(props, { emit, expose }) { + const { playerRef, getPlayer, play, pause, restart, stop } = usePlayer(props, emit, 'video'); + + expose({ playerRef, getPlayer, play, pause, restart, stop }) + + return () => ( +
+
+ ); + }, +}); diff --git a/packages/media-material/src/meta.ts b/packages/media-material/src/meta.ts new file mode 100644 index 0000000..550a8db --- /dev/null +++ b/packages/media-material/src/meta.ts @@ -0,0 +1,16 @@ +import { Meta } from "./type"; +import { AudioDesc, VideoDesc, AudioSnippet, VideoSnippet } from './media/index.meta' +import { IframeDesc, IframeSnippet } from './iframe/index.meta' +export const meta: Meta = { + data: { + framework: 'vue', + materials: { + components: [VideoDesc, AudioDesc, IframeDesc], + snippets: [{ + group: '多媒体', + children: [ VideoSnippet, AudioSnippet, IframeSnippet] + }], + blocks: [] + } + } +} \ No newline at end of file diff --git a/packages/media-material/src/preview.ts b/packages/media-material/src/preview.ts new file mode 100644 index 0000000..c6e63f3 --- /dev/null +++ b/packages/media-material/src/preview.ts @@ -0,0 +1,11 @@ +import * as components from './components'; +import type { App, Component } from 'vue'; + +export const install = function (app: App) { + Object.keys(components).forEach((key) => { + const comp = components[key as keyof typeof components] as Component; + if (/^([A-Z])/.test(key)) + app.component(comp.name || key, comp); + }); + return app; +}; diff --git a/packages/media-material/src/type.d.ts b/packages/media-material/src/type.d.ts new file mode 100644 index 0000000..401cc8f --- /dev/null +++ b/packages/media-material/src/type.d.ts @@ -0,0 +1,133 @@ +export interface I18N { + zh_CN: string +} + +export interface NPMInfo { + package?: string + exportName?: string + version?: string + destructuring?: boolean + script?: string + css?: string +} + +export interface ComponentEvent { + label: I18N, + description: I18N, + type: string, + functionInfo: { + params: Array<{ + name: string, + type: string, + defaultValue: any, + description: I18N, + }>, + returns?: { + type: string, + defaultValue: any, + description: I18N + } + }, + defaultValue: string +} + +export interface ComponentProp { + property?: string + type?: string + defaultValue?: string| boolean | number + label?: { + text: I18N + }, + description?: I18N, + cols?: number, + rules?: Array, + hidden?: boolean + required?: boolean + readOnly?: boolean + disabled?: boolean, + widget?: { + component?: string, + props?: any + }, + device?: string, +} + +export interface ComponentProps { + label: I18N, + name?: string, + description: I18N, + collapse?: { + number: number, + text: { + zh_CN: string + } + }, + content: ComponentProp[] +} + +export interface Component { + name: I18N + component: string + icon: string + screenshot?: string + description?: string + npm: NPMInfo + group: string + category: string + schema: { + properties: ComponentProps[] + events?: Record, + } + configure?: { + loop?: boolean + condition?: boolean + styles?: boolean + isContainer?: boolean + isModal?: boolean + nestingRule?: { + childWhitelist?: string + parentWhitelist?: string + descendantBlacklist?: string + ancestorWhitelist?: string + } + isNullNode?: boolean + isLayout?: boolean + rootSelector?: string + shortcuts: { + properties: string[] + }, + contextMenu?: { + actions: string[], + disable: string[] + } + } + version?: string +} + +export interface SnippetSchema { + componentName: string, + props?: any, + children?: SnippetSchema[] +} + +export interface Snippet { + name: I18N + icon: string + snippetName: string + screenshot: string + schema: SnippetSchema +} + +export interface Meta { + data: { + framework: string + materials: { + components: Component[], + blocks?: Array, + snippets: Array<{ + group: string, + children: Snippet[] + }> + } + } + } \ No newline at end of file diff --git a/packages/media-material/tsconfig.json b/packages/media-material/tsconfig.json new file mode 100644 index 0000000..c2daa68 --- /dev/null +++ b/packages/media-material/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2015", + "useDefineForClassFields": true, + "module": "ES2015", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "resolveJsonModule": true, + // "allowImportingTsExtensions": true, + "isolatedModules": true, + // "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/media/audio.jsx"], + // "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/media-material/tsconfig.node.json b/packages/media-material/tsconfig.node.json new file mode 100644 index 0000000..f847fb7 --- /dev/null +++ b/packages/media-material/tsconfig.node.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "NodeNext", + "moduleResolution": "nodenext", + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/media-material/vite.config.ts b/packages/media-material/vite.config.ts new file mode 100644 index 0000000..05c1740 --- /dev/null +++ b/packages/media-material/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], +}) diff --git a/packages/plugins/block/index.js b/packages/plugins/block/index.js new file mode 100644 index 0000000..3c343f5 --- /dev/null +++ b/packages/plugins/block/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, { api } from './src/Main.vue' + +export default { + id: 'BlockManage', + title: '区块管理', + icon: 'plugin-icon-symbol', + align: 'top', + api, + component +} diff --git a/packages/plugins/block/mock/test.js b/packages/plugins/block/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/block/package.json b/packages/plugins/block/package.json new file mode 100644 index 0000000..58365b0 --- /dev/null +++ b/packages/plugins/block/package.json @@ -0,0 +1,46 @@ +{ + "name": "@opentiny/tiny-engine-plugin-block", + "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/plugins/block" + }, + "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-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0", + "html2canvas": "^1.4.1", + "pinyin-pro": "^3.13.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/block/src/BlockConfig.vue b/packages/plugins/block/src/BlockConfig.vue new file mode 100644 index 0000000..71fc59c --- /dev/null +++ b/packages/plugins/block/src/BlockConfig.vue @@ -0,0 +1,337 @@ + + + + + diff --git a/packages/plugins/block/src/BlockEvent.vue b/packages/plugins/block/src/BlockEvent.vue new file mode 100644 index 0000000..8dc980e --- /dev/null +++ b/packages/plugins/block/src/BlockEvent.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/packages/plugins/block/src/BlockEventForm.vue b/packages/plugins/block/src/BlockEventForm.vue new file mode 100644 index 0000000..d8c7d3d --- /dev/null +++ b/packages/plugins/block/src/BlockEventForm.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/packages/plugins/block/src/BlockEventList.vue b/packages/plugins/block/src/BlockEventList.vue new file mode 100644 index 0000000..9122c36 --- /dev/null +++ b/packages/plugins/block/src/BlockEventList.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/packages/plugins/block/src/BlockGroupArrange.vue b/packages/plugins/block/src/BlockGroupArrange.vue new file mode 100644 index 0000000..dc698a4 --- /dev/null +++ b/packages/plugins/block/src/BlockGroupArrange.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/packages/plugins/block/src/BlockGuide.vue b/packages/plugins/block/src/BlockGuide.vue new file mode 100644 index 0000000..f149f27 --- /dev/null +++ b/packages/plugins/block/src/BlockGuide.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/packages/plugins/block/src/BlockProperty.vue b/packages/plugins/block/src/BlockProperty.vue new file mode 100644 index 0000000..83bd0e4 --- /dev/null +++ b/packages/plugins/block/src/BlockProperty.vue @@ -0,0 +1,38 @@ + + + diff --git a/packages/plugins/block/src/BlockPropertyForm.vue b/packages/plugins/block/src/BlockPropertyForm.vue new file mode 100644 index 0000000..c688ac6 --- /dev/null +++ b/packages/plugins/block/src/BlockPropertyForm.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/packages/plugins/block/src/BlockPropertyList.vue b/packages/plugins/block/src/BlockPropertyList.vue new file mode 100644 index 0000000..964866d --- /dev/null +++ b/packages/plugins/block/src/BlockPropertyList.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/packages/plugins/block/src/BlockSetting.vue b/packages/plugins/block/src/BlockSetting.vue new file mode 100644 index 0000000..3dc43e9 --- /dev/null +++ b/packages/plugins/block/src/BlockSetting.vue @@ -0,0 +1,365 @@ + + + + + diff --git a/packages/plugins/block/src/CategoryEdit.vue b/packages/plugins/block/src/CategoryEdit.vue new file mode 100644 index 0000000..d583699 --- /dev/null +++ b/packages/plugins/block/src/CategoryEdit.vue @@ -0,0 +1,141 @@ + + + diff --git a/packages/plugins/block/src/Main.vue b/packages/plugins/block/src/Main.vue new file mode 100644 index 0000000..1c9772a --- /dev/null +++ b/packages/plugins/block/src/Main.vue @@ -0,0 +1,538 @@ + + + + + + + diff --git a/packages/plugins/block/src/js/blockPropertyForm.js b/packages/plugins/block/src/js/blockPropertyForm.js new file mode 100644 index 0000000..09e3b26 --- /dev/null +++ b/packages/plugins/block/src/js/blockPropertyForm.js @@ -0,0 +1,314 @@ +/** + * 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, computed, watch } from 'vue' +import { utils, constants } from '@opentiny/tiny-engine-utils' +import { useNotify } from '@opentiny/tiny-engine-controller' + +import { + META_TYPES, + getEditProperty, + META_COMPONENTS, + getItemConfig, + getArrayConfig, + setArrayConfig, + META_DEFAULT_VALUE, + META_COMPONENTS_ENUM, + saveArrayConfig, + setEditProperty, + setConfigItemVisible, + META_COMPONENT_LIST, + getConfigItemVisible +} from './blockSetting' + +const { fun_ctor } = utils +const { SCHEMA_DATA_TYPE } = constants + +export const typeList = Object.keys(META_TYPES).map((key) => ({ value: key, label: key })) + +export const currentEditData = ref(null) + +export const itemConfig = ref([]) + +export const arrayConfig = computed({ + get() { + return getArrayConfig() || [] + }, + set(value) { + setArrayConfig(value) + } +}) + +export const showArrayItemConfig = ref(false) + +export const initSubProperties = () => { + const property = getEditProperty() + + if (property?.properties || !showArrayItemConfig.value) { + return + } + + property.properties = [ + { + label: { + zh_CN: '默认分组' + }, + content: [] + } + ] + + arrayConfig.value = property.properties[0].content +} + +export const type = computed({ + get() { + const property = getEditProperty() + return property?.type || META_TYPES.string + }, + set(value) { + const property = getEditProperty() + property.type = value + property.defaultValue = META_DEFAULT_VALUE[value] + property.widget = { + component: META_COMPONENTS[value] || META_COMPONENTS[META_TYPES.string], + props: {} + } + } +}) + +export const widgetComponent = computed({ + get() { + const property = getEditProperty() + return property?.widget?.component || 'MetaInput' + }, + set(value) { + const property = getEditProperty() + property.widget = property.widget || {} + property.widget.component = value + showArrayItemConfig.value = type.value === META_TYPES.array && value === META_COMPONENTS_ENUM.MetaArrayItem + + initSubProperties() + } +}) + +export const showPropertyConfigItem = computed(() => getConfigItemVisible()) + +export const label = computed({ + get() { + const property = getEditProperty() + return property?.label?.text?.zh_CN || '' + }, + set(value) { + const property = getEditProperty() + property.label.text.zh_CN = value + } +}) + +export const propertyName = computed({ + get() { + const property = getEditProperty() + return property?.property || '' + }, + set(value) { + const property = getEditProperty() + property.property = value + } +}) + +export const getDefaultValue = (data) => { + const type = currentEditData.value.type + if (type === META_TYPES.string || type === META_TYPES.function) { + return data + } + + if (type === META_TYPES.boolean) { + return Boolean(data) + } + + if (type === META_TYPES.number) { + return Number(data) + } + + let newValue = data + + try { + newValue = fun_ctor(`return ${newValue}`)() + } catch (error) { + useNotify({ + type: 'error', + title: '默认值解析错误', + message: error?.message || '默认值解析错误,请检查' + }) + } + + if (type === META_TYPES.object && typeof newValue === 'object' && newValue !== null) { + return newValue + } + + if (type === META_TYPES.array && Array.isArray(newValue)) { + return newValue + } + + return '' +} + +// 设置区块属性访问器 +export const saveAccessor = (type, data) => { + const property = getEditProperty() + property.accessor = property.accessor || {} + property.accessor[type] = { + type: 'JSFunction', + value: data.content + } +} + +export const handleConfigItemChange = (property, data) => { + if (property === 'defaultValue') { + currentEditData.value.defaultValue = getDefaultValue(data) + } else if (property === 'props') { + if (typeof data === 'object' && data !== null) { + currentEditData.value.props = data + } + } else if (Object.prototype.hasOwnProperty.call(currentEditData.value, property)) { + currentEditData.value[property] = data + } + + if (property === 'type') { + currentEditData.value.component = META_COMPONENTS[data] + itemConfig.value = getItemConfig(currentEditData.value) + } +} + +export const handleAddItem = () => { + arrayConfig.value.push({ + property: 'customProperty', + type: 'string', + component: 'MetaInput', + props: {}, + defaultValue: '', + description: '' + }) +} + +export const del = (data) => { + arrayConfig.value = arrayConfig.value.filter((item) => item !== data) +} + +export const handleSaveWidgetProps = (data) => { + const property = getEditProperty() + if (!property.widget) { + property.widget = {} + } + + try { + let propsValue = data.content + if (typeof propsValue === 'string') { + propsValue = JSON.parse(propsValue) + } + property.widget.props = propsValue + } catch (error) { + useNotify({ + type: 'error', + message: `属性面板组件属性值设置有误: ${JSON.stringify(error)},请检查是否为JSON类型` + }) + } +} + +export const updateDefaultValue = (value) => { + const property = getEditProperty() + let propertyValue = value + + // 如果不是字符串类型并且没有被转译过,支持在Monaco编辑器中写js语法,不再限制必须是json格式 + if (type.value !== META_TYPES.string && typeof value === 'string') { + try { + propertyValue = fun_ctor(`return ${value}`)() + } catch (error) { + propertyValue = value + useNotify({ + type: 'warning', + title: '默认值语法解析错误', + message: error?.message || '默认值语法解析错误,请检查语法' + }) + } + + // 此处如果是时间对象或者函数需要特殊处理 + if (propertyValue instanceof Date) { + propertyValue = { + type: SCHEMA_DATA_TYPE.JSExpression, + value: value + } + } else if (propertyValue instanceof Function) { + propertyValue = { + type: SCHEMA_DATA_TYPE.JSFunction, + value: value + } + } + } + + property.defaultValue = propertyValue +} + +export const handleChangeWidgetComponent = (value) => { + widgetComponent.value = value +} + +export const handleCancelEdit = () => { + saveArrayConfig() + setEditProperty(null) +} + +export const handleEdit = (data) => { + setConfigItemVisible(true) + currentEditData.value = data + itemConfig.value = getItemConfig(data) +} + +export const changeType = (value) => { + type.value = value +} + +export const widgetComponentList = ref([]) + +watch( + () => type.value, + () => { + const property = getEditProperty() + + widgetComponentList.value = (META_COMPONENT_LIST[(type.value || '').toLowerCase()] || []).map((item) => ({ + label: item, + value: item + })) + + showArrayItemConfig.value = + type.value === META_TYPES.array && widgetComponent.value === META_COMPONENTS_ENUM.MetaArrayItem + + if (property) { + widgetComponent.value = property.widget.component + } + + initSubProperties() + }, + { + immediate: true + } +) + +watch( + () => getConfigItemVisible(), + (visible) => { + if (visible) { + return + } + + saveArrayConfig() + } +) diff --git a/packages/plugins/block/src/js/blockSetting.jsx b/packages/plugins/block/src/js/blockSetting.jsx new file mode 100644 index 0000000..98680f8 --- /dev/null +++ b/packages/plugins/block/src/js/blockSetting.jsx @@ -0,0 +1,871 @@ +/** + * 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, readonly, onMounted } from 'vue' +import { extend } from '@opentiny/vue-renderless/common/object' +import { remove } from '@opentiny/vue-renderless/common/array' +import { + useBlock, + useModal, + useCanvas, + useTranslate, + useApp, + useLayout, + useNotify +} from '@opentiny/tiny-engine-controller' +import { isVsCodeEnv } from '@opentiny/tiny-engine-controller/js/environments' +import { getCanvasStatus } from '@opentiny/tiny-engine-controller/js/canvas' +import { useHistory, useResource } from '@opentiny/tiny-engine-controller' +import html2canvas from 'html2canvas' + +import { + fetchBlockList, + requestDeleteBlock, + requestDeployBlock, + fetchDeployProgress, + requestUpdateBlock, + requestCreateBlock, + fetchBlockContent, + fetchComponentsMap, + fetchBlockContentByLabel, + fetchCategories, + createCategory, + updateCategory, + deleteCategory +} from './http' +import { constants, utils } from '@opentiny/tiny-engine-utils' +import { generateBlock } from '@opentiny/tiny-engine-controller/js/vscodeGenerateFile' + +const { HOST_TYPE } = constants +const { getBlockList, setBlockList, setCategoryList, getCurrentBlock, addBlockEvent, addBlockProperty } = useBlock() +const { batchCreateI18n } = useTranslate() +const { message, confirm } = useModal() +const { setSaved } = useCanvas() +const { getMaterial } = useResource() + +const STRING_SLOT = ['Slot', 'slot'] + +// 轮询查询发布进度,目前设置为3s,后续可根据实际业务时间调整 +const INTERVAL_PROGRESS = 3000 + +// 区块发布的状态 +const DEPLOY_STATUS = readonly({ + Init: 0, + Running: 1, // 发布中 + Stopped: 2, // 发布失败 + Finished: 3 // 发布成功 +}) + +export const DEPLOY_TIPS = { + 1: '正在发布中', + 2: '发布失败,请重新发布', + 3: '发布完成' +} + +const PROGRESS = readonly({ + Start: 0, + End: 100 +}) + +// 区块暴露属性和事件的类型 +export const META_TYPES = { + array: 'array', + string: 'string', + number: 'number', + object: 'object', + boolean: 'boolean', + function: 'function' +} + +// 类型转化成 select 组件 option 需要的结构 { label: string; value: string }[] +export const META_TYPES_OPTIONS = Object.entries(META_TYPES).map(([key, value]) => ({ + label: key, + value: value +})) + +// 组件的枚举 +export const META_COMPONENTS_ENUM = { + MetaCodeEditor: 'MetaCodeEditor', + MetaArrayItem: 'MetaArrayItem', + MetaInput: 'MetaInput', + MetaSelect: 'MetaSelect', + MetaBindI18n: 'MetaBindI18n', + MetaNumber: 'MetaNumber', + MetaJsSlot: 'MetaJsSlot', + MetaSwitch: 'MetaSwitch' +} + +// 每个值类型可选的编辑器类型 +export const META_COMPONENT_LIST = { + [META_TYPES.array]: ['MetaCodeEditor', 'MetaArrayItem', 'MetaRelatedColumns', 'MetaRelatedEditor'], + [META_TYPES.string]: ['MetaInput', 'MetaSelect', 'MetaBindI18n'], + [META_TYPES.number]: ['MetaNumber'], + [META_TYPES.object]: ['MetaCodeEditor', 'MetaJsSlot'], + [META_TYPES.boolean]: ['MetaSwitch'], + [META_TYPES.function]: ['MetaCodeEditor'] +} + +// 数组类型 item 的配置 +export const DEFAULT_ARRAY_CONFIG = [ + { + property: 'property', + type: META_TYPES.string, + defaultValue: '', + label: { + text: { + zh_CN: '显示值' + } + }, + labelPosition: 'top', + widget: { + component: 'MetaInput', + props: { + modelValue: '' + } + } + }, + { + property: 'type', + type: META_TYPES.string, + defaultValue: 'String', + label: { + text: { + zh_CN: '值类型' + } + }, + labelPosition: 'top', + widget: { + component: 'MetaSelect', + props: { + options: META_TYPES_OPTIONS, + modelValue: '' + } + } + }, + { + property: 'component', + type: META_TYPES.string, + defaultValue: 'MetaInput', + label: { + text: { + zh_CN: '设计器' + } + }, + labelPosition: 'top', + widget: { + component: 'MetaSelect', + props: { + options: META_COMPONENT_LIST[META_TYPES.string], + modelValue: 'MetaInput' + } + } + }, + { + property: 'props', + type: META_TYPES.object, + defaultValue: '{}', + label: { + text: { + zh_CN: '属性面板组件属性' + } + }, + labelPosition: 'top', + widget: { + component: 'MetaCodeEditor', + props: { + modelValue: '{}', + language: 'json' + } + } + }, + { + property: 'defaultValue', + type: META_TYPES.string, + defaultValue: '', + label: { + text: { + zh_CN: '缺省值' + } + }, + labelPosition: 'top', + widget: { + component: 'MetaCodeEditor', + props: { + modelValue: '' + } + } + }, + { + property: 'description', + type: META_TYPES.string, + defaultValue: '', + label: { + text: { + zh_CN: '描述' + } + }, + labelPosition: 'top', + widget: { + component: 'MetaInput', + props: { + modelValue: '' + } + } + } +] + +// 区块暴露属性和事件各类型的默认值 +export const META_DEFAULT_VALUE = { + [META_TYPES.array]: [], + [META_TYPES.string]: '', + [META_TYPES.number]: 0, + [META_TYPES.object]: {}, + [META_TYPES.boolean]: false, + [META_TYPES.function]: 'function value() {}' +} + +// 区块暴露属性和事件各类型对应的默认编辑器 +export const META_COMPONENTS = { + [META_TYPES.array]: 'MetaCodeEditor', + [META_TYPES.string]: 'MetaInput', + [META_TYPES.number]: 'MetaNumber', + [META_TYPES.object]: 'MetaCodeEditor', + [META_TYPES.boolean]: 'MetaSwitch', + [META_TYPES.function]: 'MetaCodeEditor' +} + +// 区块默认的属性schema +const DEFAULT_PROPERTY = readonly({ + property: 'customProperty', + type: META_TYPES.string, + defaultValue: META_DEFAULT_VALUE[META_TYPES.string], + label: { + text: { + zh_CN: '' + } + }, + cols: 12, + rules: [], + // 区块属性访问器 + accessor: {}, + hidden: false, + required: true, + readOnly: false, + disabled: false, + widget: { + component: META_COMPONENTS[META_TYPES.string], + props: {} + } +}) + +// 区块默认的事件名称 +const DEFAULT_EVENT_NAME = 'onCustomEvent' + +// 区块默认的事件schema +const DEFAULT_EVENT = readonly({ + label: { + zh_CN: '' + }, + description: { + zh_CN: '' + } +}) + +// 这里存放的是区块设置面板的响应式数据 +const state = reactive({ + block: null, + categoryList: [], + event: null, + eventName: null, + property: null, + materialHistory: null, + showPropertyConfigItem: false, + arrayConfig: [] +}) + +export const getMaterialHistory = () => state.materialHistory + +export const setMaterialHistory = (value) => { + state.materialHistory = value +} + +export const getEditBlock = () => state.block + +export const setEditBlock = (block) => { + state.block = block +} + +export const getEditEvent = () => state.event + +export const setEditEvent = (event) => { + state.event = event +} + +export const getEditEventName = () => state.eventName + +export const setEditEventName = (name) => { + state.eventName = name +} + +export const getEditProperty = () => state.property + +export const setEditProperty = (property) => { + state.property = property + + state.arrayConfig = (property?.properties?.[0]?.content || []).map( + ({ property, type, defaultValue, label, widget: { props = {}, component = 'MetaInput' } = {} }) => ({ + property, + type, + defaultValue, + description: label?.text?.zh_CN || '', + props, + component + }) + ) +} + +export const getEditBlockPropertyList = () => state.block?.content?.schema?.properties?.[0]?.content + +export const getEditBlockEvents = () => state.block?.content?.schema?.events + +export const addBlockCustomProperty = () => { + const defaultProperty = extend(true, {}, DEFAULT_PROPERTY) + + addBlockProperty(defaultProperty, getEditBlock()) + + return defaultProperty +} + +export const addBlockCustomEvent = () => { + const uid = utils.generateRandomLetters(4) + const defaultEvent = extend(true, {}, DEFAULT_EVENT) + + const event = { + name: `${DEFAULT_EVENT_NAME}${uid}`, + event: defaultEvent + } + + addBlockEvent(event, getEditBlock()) + + return event +} + +export const delBlockEvent = (name) => { + const events = getEditBlockEvents() + + if (name && events) { + delete events[name] + if (state.eventName === name) { + state.event = null + } + } +} + +export const renameBlockEventName = (name, oldName) => { + const events = getEditBlockEvents() + events[name] = events[oldName] + setEditEventName(name) + delete events[oldName] +} + +export const initEditBlock = (block = getCurrentBlock()) => { + // 如果当前点击的区块和画布中的区块是同一区块,则直接获取最新的区块数据 + if (block?.id && block?.id === getCurrentBlock()?.id) { + const currentBlock = getCurrentBlock() + + // 这里需要做一次合并,保证区块列表中的数据引用地址和getEditBlock获取的是一样的 + Object.assign(block, currentBlock) + } + + setEditBlock(block) + setEditProperty(null) + setEditEvent(null) +} + +export const getBlockBase64 = () => { + const iframe = document.querySelector('#canvas') + const subDocument = iframe.contentWindow.document + const container = subDocument.querySelector('.design-page') + + return html2canvas(container, { useCORS: true }) + .then((canvas) => canvas.toDataURL('image/webp')) + .catch((err) => { + useNotify({ + type: 'error', + title: '生成区块截图错误', + message: JSON.stringify(err) + }) + + return '' + }) +} + +export const delBlock = (closePanel) => () => { + const block = getEditBlock() + const blockId = block?.id + + if (blockId) { + requestDeleteBlock(blockId) + .then(() => { + // data:后台删除成功返回的是被删除的数据 + remove(getBlockList(), block) + message({ message: '删除区块成功!', status: 'success' }) + closePanel() + }) + .catch((error) => { + message({ message: error.message, status: 'error' }) + }) + } +} + +export const refreshBlockData = async (block = {}) => { + if (block?.id) { + const newBlock = await fetchBlockContent(block.id) + + if (newBlock) { + if (newBlock.public_scope_tenants.length) { + newBlock.public_scope_tenants = newBlock.public_scope_tenants.map((e) => e.id) + } + Object.assign(block, newBlock) + useLayout().layoutState.pageStatus = getCanvasStatus(newBlock?.occupier) + + useHistory().addHistory(block.content) + } + } +} + +const setDeployFailed = (block) => { + block.isAnimation = true + block.isShowProgress = false + block.publishProgress = PROGRESS.Start + block.deployStatus = DEPLOY_STATUS.Stopped +} + +const setDeployFinished = (block) => { + block.isAnimation = true + block.isShowProgress = false + block.publishProgress = PROGRESS.Finished + block.deployStatus = DEPLOY_STATUS.Finished + refreshBlockData(block) +} + +const setDeployStarted = (block) => { + block.isAnimation = false + block.isShowProgress = true + block.publishProgress = PROGRESS.Start + block.deployStatus = DEPLOY_STATUS.Running +} + +export const findTree = (schema = {}, find) => { + const children = schema.children + + find(schema) + if (Array.isArray(children)) { + children.forEach((child) => findTree(child, find)) + } +} + +const findSlots = (schema) => { + const configure = { slots: {}, slotsTips: '' } + const slotsNameMap = {} + + findTree(schema, ({ componentName, props }) => { + if (STRING_SLOT.includes(componentName)) { + // 这里如果用户没有配置插槽名称,则默认给一个'default' + props.name = props.name || 'default' + const slotName = props.name + const slotParams = + typeof props.params === 'string' ? props.params.split(',') : props.params?.map((item) => item.name) + + if (slotsNameMap[slotName]) { + slotsNameMap[slotName]++ + } else { + slotsNameMap[slotName] = 1 + } + // 注意:因为画布中webcomponents会把空格和换行也当作默认插槽,所以默认插槽统一取名default + configure.slots[slotName] = { label: { zh_CN: slotName } } + + // 如果用户配置了作用域插槽的参数则需要在协议中添加 + if (slotParams) { + configure.slots[slotName].params = slotParams + } + } + }) + + Object.entries(slotsNameMap).forEach(([key, value]) => { + // 某一种插槽只能出现一次,包括默认插槽 + if (value > 1) { + configure.slotsTips += `插槽【${key}】,出现了${value}次,` + } + }) + + return configure +} + +// 计算区块的 slot 信息,并配置到区块 schema 中 +const configureSlots = (blockSchema = {}) => { + // 区块不能设置成容器,可以拖入物料的容器是区块中的插槽 + const { slots, slotsTips } = findSlots(blockSchema) + blockSchema.schema.slots = slots + return slotsTips +} + +export const getDeployProgress = (taskId, block) => { + fetchDeployProgress(taskId).then((data) => { + block.deployStatus = data.taskStatus + block.publishProgress = data.progress_percent + block.taskResult = data.taskResult + + if (block.publishProgress === PROGRESS.End) { + block.deployStatus = DEPLOY_STATUS.Finished + } + + if (block.deployStatus === DEPLOY_STATUS.Running || block.deployStatus === DEPLOY_STATUS.Init) { + setTimeout(() => { + getDeployProgress(taskId, block) + }, INTERVAL_PROGRESS) + } else if (block.deployStatus === DEPLOY_STATUS.Stopped) { + message({ + title: '异常提示', + status: 'error', + message: { + render: () => {`区块发布失败: ${block.taskResult}`} + }, + width: '550' + }) + setDeployFailed(block) + } else { + setDeployFinished(block) + useNotify({ message: '区块发布成功!', type: 'success' }) + } + }) +} + +const validBlockSlotsName = (block) => { + const slotsTips = configureSlots(block.content) + if (slotsTips) { + confirm({ + title: '插槽名称不能重复!!!', + message: `${slotsTips.slice(0, -1)}。` + }) + } + return !slotsTips +} + +// 发布区块 +export const publishBlock = (params) => { + const block = params.block + + // 校验区块插槽名称 + if (block && validBlockSlotsName(block)) { + // 查询发布进度之前,先将动画状态初始化 + setDeployStarted(block) + + requestDeployBlock(params) + .then((data) => { + getDeployProgress(data.id, block) + }) + .catch((error) => { + message({ message: error.message, status: 'error' }) + setDeployFailed(block) + }) + } +} + +const getCategories = () => { + const appId = useApp().appInfoState.selectedId + fetchCategories({ appId }).then((res) => { + setCategoryList(res) + }) +} + +// 新建区块 +const createBlock = (block = {}) => { + const { appInfoState } = useApp() + const { selectedId: created_app } = appInfoState + const params = { ...block, created_app } + + if (isVsCodeEnv) { + const id = getMaterialHistory()?.id + + if (id) { + const materialHistories = 'material_histories' + params[materialHistories] = Array.isArray(id) ? id : [id] + } + } + + requestCreateBlock(params) + .then((data) => { + // 后台获取区块id后保存id信息 + block.id = data.id + batchCreateI18n({ host: block.id, hostType: HOST_TYPE.Block }) + setSaved(true) + // 新建区块成功后需要同步更新画布上的区块数据ctx上下文环境 + useBlock().initBlock(data, {}, true) + message({ message: '新建区块成功!', status: 'success' }) + // 本地生成区块服务 + if (isVsCodeEnv) { + generateBlock({ schema: data.content, blockPath: data.path }) + } + // 更新区块分类数据,分类下区块不为空的不能删除 + getCategories() + }) + .catch((error) => { + message({ message: error.message, status: 'error' }) + }) +} + +// 点击Toolbar上的保存图标保存区块Schema +const updateBlock = (block = {}) => { + const { + id, + content, + screenshot, + public_scope_tenants, + public: publicType, + tags, + categories, + description, + label + } = block + const nameCn = 'name_cn' + requestUpdateBlock( + id, + { + [nameCn]: block[nameCn], + content, + screenshot, + public_scope_tenants, + public: publicType, + tags, + categories: categories.map((category) => category.id), + description, + label + }, + { + params: { + appId: useApp().appInfoState.selectedId + } + } + ) + .then((data) => { + setSaved(true) + useBlock().initBlock(data, {}, true) + // 弹出保存区块成功 + message({ message: '保存区块成功!', status: 'success' }) + // 本地生成区块服务 + if (isVsCodeEnv) { + generateBlock({ schema: data.content, blockPath: data.path }) + } + // 更新区块分类数据,分类下区块不为空的不能删除 + getCategories() + }) + .catch((error) => { + message({ message: error.message, status: 'error' }) + }) +} + +/** + * 收集区块依赖的组件信息 + * @param {array} children 子区块 + * @param {object} deps 依赖的组件信息 + * @returns + */ +const generateBlockDeps = (children, deps = { scripts: [], styles: new Set() }) => { + children.forEach((child) => { + const component = getMaterial(child.componentName) + + if (!component) return + + const { npm, component: componentName } = component + + if (npm) { + const { package: pkg, exportName, css, version, script } = npm + const currentPkg = deps.scripts.find((item) => item.package === pkg) + + if (currentPkg) { + currentPkg.components[componentName] = exportName + } else { + deps.scripts.push({ + package: pkg, + version, + script, + css, + components: { + [componentName]: exportName + } + }) + } + + if (css) { + deps.styles.add(css) + } + } + + // 递归查找子区块或子组件 + if (child.children) { + generateBlockDeps(child.children, deps) + } + }) + + return deps +} + +export const saveBlock = async (block) => { + if (block && validBlockSlotsName(block)) { + const { scripts, styles } = generateBlockDeps(block.content.children) + + block.content.dependencies = { scripts, styles: [...styles] } + + const actionPromise = block.id ? updateBlock(block) : createBlock(block) + await actionPromise + } +} + +export const updateBlockList = (params) => { + const appId = useApp().appInfoState.selectedId + fetchBlockList({ appId, ...params }).then((data) => { + const blockListDescByUpdateAt = data.sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at)) + setBlockList(blockListDescByUpdateAt) + }) +} + +export const fetchMaterialId = () => { + const { appInfoState } = useApp() + + fetchComponentsMap(appInfoState.selectedId).then((data) => { + setMaterialHistory(data?.materialHistory) + }) +} + +export const mountedHook = () => { + onMounted(() => { + updateBlockList() + getCategories() + + if (isVsCodeEnv) { + fetchMaterialId() + } + }) +} + +export const getBlockContentByLabel = (label) => { + return fetchBlockContentByLabel(label) +} + +export const getBlockById = async (id) => { + if (id) { + const blockId = await fetchBlockContent(id) + return blockId + } + + return undefined +} + +export const createOrUpdateCategory = async ({ categoryId, ...params }, isEdit) => { + const appId = useApp().appInfoState.selectedId + params.app = Number(appId) + let requestFunc = updateCategory + + if (!isEdit) { + params.category_id = categoryId + requestFunc = createCategory + } + + const res = await requestFunc(params) + + if (res) { + getCategories() + } +} + +export const delCategory = async (id) => { + const res = await deleteCategory(id) + + if (res) { + getCategories() + useNotify({ + type: 'success', + message: '删除成功' + }) + } +} + +export const getConfigItemVisible = () => state.showPropertyConfigItem +export const setConfigItemVisible = (visible) => { + state.showPropertyConfigItem = visible +} + +// 获取真实 config item 配置 将数据与默认配置结合,得到渲染的配置 +export const getItemConfig = (data = {}) => { + const dataType = data?.type?.toLowerCase?.() + + return DEFAULT_ARRAY_CONFIG.map(({ property, widget, type, ...other }) => { + const props = { + ...widget.props, + modelValue: data[property] ?? '' + } + + if (property === 'component') { + props.options = + dataType === META_TYPES.array + ? [{ label: META_COMPONENTS[META_TYPES.array], value: META_COMPONENTS[META_TYPES.array] }] + : (META_COMPONENT_LIST[dataType] || []).map((item) => ({ label: item, value: item })) + } + + return { + property, + type, + ...other, + widget: { + ...widget, + component: property === 'defaultValue' ? META_COMPONENTS[dataType] : widget.component, + props + } + } + }) +} + +export const getArrayConfig = () => state.arrayConfig +export const setArrayConfig = (value) => { + state.arrayConfig = value +} + +export const saveArrayConfig = () => { + const property = getEditProperty() + + if (!property) { + return + } + + property.properties = [ + { + label: { + zh_CN: '默认分组' + }, + content: state.arrayConfig.map?.(({ property, type, component, defaultValue, description, props }) => ({ + property, + type, + defaultValue, + label: { + text: { + zh_CN: description + } + }, + widget: { + component, + props + } + })) + } + ] +} diff --git a/packages/plugins/block/src/js/http.js b/packages/plugins/block/src/js/http.js new file mode 100644 index 0000000..19f2cb0 --- /dev/null +++ b/packages/plugins/block/src/js/http.js @@ -0,0 +1,67 @@ +/** + * 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() + +// 区块管理 -- 获取区块列表 +export const fetchBlockList = (params) => http.get('/material-center/api/blocks', { params }) + +// 删除区块 +export const requestDeleteBlock = (blockId) => http.get(`/material-center/api/block/delete/${blockId}`) + +// 区块管理 -- 保存区块 +export const requestUpdateBlock = (blockId, params, config = {}) => + http.post(`/material-center/api/block/update/${blockId}`, params, config) + +// 区块管理 -- 发布区块 +export const requestDeployBlock = (params) => http.post('/material-center/api/block/deploy/', params) + +// 区块管理 -- 查询区块发布进度 +export const fetchDeployProgress = (taskId) => http.get(`/material-center/api/tasks/${taskId}`) + +// 区块管理 -- 根据关键字搜索区块 +export const requestSearchBlock = (searchKey) => http.get(`/material-center/api/block?label_contains=${searchKey}`) + +// 区块管理 -- 根据区块ID获取区块历史备份列表 +export const fetchBackupList = (blockId) => http.get(`/material-center/api/block-history?block=${blockId}`) + +// 区块管理 -- 新建区块 +export const requestCreateBlock = (params) => http.post('/material-center/api/block/create/', params) + +// 初始化区块 +export const requestInitBlocks = (params) => http.post('/generate/api/initBlocks', params) + +// 获取所有区块 +export const requestBlocks = () => http.get(`/material-center/api/block`) + +// 区块管理 -- 查询单个区块详情 +export const fetchBlockContent = (blockId) => http.get(`/material-center/api/block/detail/${blockId}`) + +// 区块管理 -- 根据label查询单个区块详情 +export const fetchBlockContentByLabel = (label) => http.get(`/material-center/api/block?label=${label}`) + +// 获取应用下的 ComponentsMap +export const fetchComponentsMap = (appId) => http.get(`/app-center/api/apps/schema/components/${appId}`) + +// 区块分类列表 +export const fetchCategories = (params) => http.get('/material-center/api/block-categories', { params }) + +// 更新区块分类 +export const updateCategory = ({ id, ...params }) => http.put(`/material-center/api/block-categories/${id}`, params) + +// 新建区块分类 +export const createCategory = (params) => http.post(`/material-center/api/block-categories`, params) + +// 删除区块分类 +export const deleteCategory = (id) => http.delete(`/material-center/api/block-categories/${id}`) diff --git a/packages/plugins/block/test/test.js b/packages/plugins/block/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/block/vite.config.js b/packages/plugins/block/vite.config.js new file mode 100644 index 0000000..4cddadf --- /dev/null +++ b/packages/plugins/block/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-block', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/bridge/assets/test.png b/packages/plugins/bridge/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/bridge/index.js b/packages/plugins/bridge/index.js new file mode 100644 index 0000000..96604ef --- /dev/null +++ b/packages/plugins/bridge/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: 'Bridge', + title: '资源管理', + icon: 'plugin-icon-sresources', + align: 'top', + component +} diff --git a/packages/plugins/bridge/mock/test.js b/packages/plugins/bridge/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/bridge/package.json b/packages/plugins/bridge/package.json new file mode 100644 index 0000000..3932987 --- /dev/null +++ b/packages/plugins/bridge/package.json @@ -0,0 +1,42 @@ +{ + "name": "@opentiny/tiny-engine-plugin-bridge", + "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/plugins/bridge" + }, + "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", + "@opentiny/vue-icon": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/bridge/src/BridgeManage.vue b/packages/plugins/bridge/src/BridgeManage.vue new file mode 100644 index 0000000..8fec034 --- /dev/null +++ b/packages/plugins/bridge/src/BridgeManage.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/packages/plugins/bridge/src/BridgeSetting.vue b/packages/plugins/bridge/src/BridgeSetting.vue new file mode 100644 index 0000000..4062249 --- /dev/null +++ b/packages/plugins/bridge/src/BridgeSetting.vue @@ -0,0 +1,393 @@ + + + + + diff --git a/packages/plugins/bridge/src/Main.vue b/packages/plugins/bridge/src/Main.vue new file mode 100644 index 0000000..2d80855 --- /dev/null +++ b/packages/plugins/bridge/src/Main.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/packages/plugins/bridge/src/http.js b/packages/plugins/bridge/src/http.js new file mode 100644 index 0000000..e726f4f --- /dev/null +++ b/packages/plugins/bridge/src/http.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 { useHttp } from '@opentiny/tiny-engine-http' +import { generateBridge, generateUtil } from '@opentiny/tiny-engine-controller/js/vscodeGenerateFile' +const http = useHttp() + +// 资源管理 -- 获取列表 +export const fetchResourceList = (appId, type) => + http.get(`/app-center/api/apps/extension/list?app=${appId}&category=${type}`) + +// 资源管理 -- 获取资源详情 +export const fetchResourceDetail = () => http.get(`/app-center/api/apps/extension`) + +// 资源管理 -- 新增 +export const requestAddReSource = (params) => http.post('/app-center/api/apps/extension/create', params) + +// 资源管理 -- 修改 +export const requestUpdateReSource = (params) => http.post(`/app-center/api/apps/extension/update`, params) + +// 资源管理 -- 删除 +export const requestDeleteReSource = (params) => http.get(`/app-center/api/apps/extension/delete?${params}`) + +// 本地生成桥接工具类 +export const requestGenerateBridgeUtil = (appId) => { + http.get(`/app-center/api/apps/schema/${appId}`).then((data) => { + generateBridge(data.bridge) + generateUtil(data.utils) + }) +} diff --git a/packages/plugins/bridge/src/js/resource.js b/packages/plugins/bridge/src/js/resource.js new file mode 100644 index 0000000..be89fd6 --- /dev/null +++ b/packages/plugins/bridge/src/js/resource.js @@ -0,0 +1,237 @@ +/** + * 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 { useApp, useResource, useNotify } from '@opentiny/tiny-engine-controller' +import { isVsCodeEnv } from '@opentiny/tiny-engine-controller/js/environments' +import { updateUtils, deleteUtils } from '@opentiny/tiny-engine-canvas' +import { + fetchResourceList, + requestDeleteReSource, + requestAddReSource, + requestUpdateReSource, + requestGenerateBridgeUtil +} from '../http' + +const state = reactive({ + actionType: '', + type: '', + category: '', + resource: {}, + resources: [], + resourceNames: {}, + refresh: false, + id: useApp().appInfoState.selectedId +}) + +const DEFAULT_RESOURCE = { + name: '', + type: 'npm', + content: { + package: '', + version: '', + exportName: '', + subName: '', + destructuring: true, + main: '' + } +} + +const DEFAULT_RESOURCE_FUNTION = { + name: '', + type: 'function', + content: { + type: 'JSFunction', + value: '' + } +} + +const TempBridge = [ + { + name: 'clone', + type: 'npm', + category: 'utils', + content: { + package: 'lodash', + version: '4.17.21', + exportName: 'clone', + subName: '', + destructuring: false, + main: '/lib/clone' + } + }, + { + name: 'moment', + type: 'npm', + category: 'utils', + content: { + package: '@alifd/next', + version: '0.0.1', + exportName: 'Moment', + subName: '', + destructuring: true, + main: '' + } + }, + { + name: 'lowcode', + type: 'npm', + category: 'utils', + content: { + package: '@/lowcode', + version: '0.0.1', + exportName: 'lowcode', + subName: '', + destructuring: true, + main: '' + } + } +] + +export const RESOURCE_TYPE = { + Util: 'utils', + Bridge: 'bridge' +} + +export const RESOURCE_CATEGORY = { + Npm: 'npm', + Function: 'function' +} + +export const RESOURCE_TIP = { + [RESOURCE_TYPE.Util]: '新建工具类', + [RESOURCE_TYPE.Bridge]: '新建桥接源' +} + +export const ACTION_TYPE = { + Read: 'read', + Edit: 'edit' +} + +export const getResources = () => { + const id = useApp().appInfoState.selectedId + state.resources.length || + fetchResourceList(id).then((data) => { + state.resources = data || TempBridge + }) +} + +export const getResourceNamesByType = (type) => state.resourceNames[type] + +export const setResourceNamesByType = (type, names) => { + state.resourceNames[type] = names +} + +export const getResourcesByType = (type) => { + const id = useApp().appInfoState.selectedId + return fetchResourceList(id, type) +} + +export const getActionType = () => state.actionType + +export const setActionType = (type) => { + state.actionType = type +} + +export const getResource = () => state.resource + +export const setResource = (resource = DEFAULT_RESOURCE) => { + if (!resource) { + resource = state.category === RESOURCE_CATEGORY.Function ? DEFAULT_RESOURCE_FUNTION : DEFAULT_RESOURCE + } + state.resource = resource +} + +export const getType = () => state.type + +export const setType = (type) => { + state.type = type +} + +export const setCategory = (category) => { + state.category = category +} + +export const setStatus = () => { + state.refresh = true +} + +export const getCategory = () => state.category + +// VS Code环境生成本地util +const generateBridgeUtil = (...args) => { + if (isVsCodeEnv) { + requestGenerateBridgeUtil(...args) + } +} + +export const saveResource = (data, callback, emit) => { + if (getActionType() === ACTION_TYPE.Edit) { + data.id = state.resource.id + requestUpdateReSource(data).then((result) => { + if (result) { + const index = useResource().resState[data.category].findIndex((item) => item.name === result.name) + useResource().resState[data.category][index] = result + + // 更新画布工具函数环境,保证渲染最新工具类返回值, 并触发画布的强制刷新 + updateUtils([result]) + generateBridgeUtil(useApp().appInfoState.selectedId) + + useNotify({ + type: 'success', + message: '修改成功' + }) + + emit('refresh', state.type) + state.refresh = true + callback() + } + }) + } else { + requestAddReSource(data).then((result) => { + if (result) { + useResource().resState[data.category].push(result) + + // 更新画布工具函数环境,保证渲染最新工具类返回值, 并触发画布的强制刷新 + updateUtils([result]) + generateBridgeUtil(useApp().appInfoState.selectedId) + useNotify({ + type: 'success', + message: '创建成功' + }) + emit('refresh', state.type) + state.refresh = true + callback() + } + }) + } +} + +export const deleteData = (name, callback, emit) => { + const params = `app=${useApp().appInfoState.selectedId}&id=${state.resource?.id}` + requestDeleteReSource(params).then((data) => { + if (data) { + const index = useResource().resState[state.type].findIndex((item) => item.name === data.name) + useResource().resState[state.type].splice(index, 1) + + deleteUtils([data]) + generateBridgeUtil(useApp().appInfoState.selectedId) + useNotify({ + type: 'success', + message: '删除成功' + }) + emit('refresh', state.type) + state.refresh = true + callback() + } + }) +} diff --git a/packages/plugins/bridge/test/test.js b/packages/plugins/bridge/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/bridge/vite.config.js b/packages/plugins/bridge/vite.config.js new file mode 100644 index 0000000..db8dc6e --- /dev/null +++ b/packages/plugins/bridge/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-bridge', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/data/assets/test.png b/packages/plugins/data/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/data/index.js b/packages/plugins/data/index.js new file mode 100644 index 0000000..3a14532 --- /dev/null +++ b/packages/plugins/data/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: 'DataSource', + title: '状态管理', + icon: 'plugin-icon-var', + align: 'top', + component +} diff --git a/packages/plugins/data/mock/test.js b/packages/plugins/data/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/data/package.json b/packages/plugins/data/package.json new file mode 100644 index 0000000..039097f --- /dev/null +++ b/packages/plugins/data/package.json @@ -0,0 +1,44 @@ +{ + "name": "@opentiny/tiny-engine-plugin-data", + "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/plugins/data" + }, + "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-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "monaco-editor": "0.33.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/data/src/CreateRemoteAPI.vue b/packages/plugins/data/src/CreateRemoteAPI.vue new file mode 100644 index 0000000..fd33dcb --- /dev/null +++ b/packages/plugins/data/src/CreateRemoteAPI.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/packages/plugins/data/src/CreateRemoteFunction.vue b/packages/plugins/data/src/CreateRemoteFunction.vue new file mode 100644 index 0000000..250b57a --- /dev/null +++ b/packages/plugins/data/src/CreateRemoteFunction.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/packages/plugins/data/src/CreateStore.vue b/packages/plugins/data/src/CreateStore.vue new file mode 100644 index 0000000..2f38ca1 --- /dev/null +++ b/packages/plugins/data/src/CreateStore.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/packages/plugins/data/src/CreateVariable.vue b/packages/plugins/data/src/CreateVariable.vue new file mode 100644 index 0000000..0c79093 --- /dev/null +++ b/packages/plugins/data/src/CreateVariable.vue @@ -0,0 +1,496 @@ + + + + + + + diff --git a/packages/plugins/data/src/DataSourceList.vue b/packages/plugins/data/src/DataSourceList.vue new file mode 100644 index 0000000..b886376 --- /dev/null +++ b/packages/plugins/data/src/DataSourceList.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/packages/plugins/data/src/DataSourceRightPanel.vue b/packages/plugins/data/src/DataSourceRightPanel.vue new file mode 100644 index 0000000..578e5d9 --- /dev/null +++ b/packages/plugins/data/src/DataSourceRightPanel.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/packages/plugins/data/src/EditorI18nTool.vue b/packages/plugins/data/src/EditorI18nTool.vue new file mode 100644 index 0000000..5c5b53a --- /dev/null +++ b/packages/plugins/data/src/EditorI18nTool.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/packages/plugins/data/src/Main.vue b/packages/plugins/data/src/Main.vue new file mode 100644 index 0000000..daf6bd4 --- /dev/null +++ b/packages/plugins/data/src/Main.vue @@ -0,0 +1,490 @@ + + + + + diff --git a/packages/plugins/data/src/js/common.js b/packages/plugins/data/src/js/common.js new file mode 100644 index 0000000..ee2b139 --- /dev/null +++ b/packages/plugins/data/src/js/common.js @@ -0,0 +1,48 @@ +/** +* 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. +* +*/ + +/** + * 校验monaco编辑器必填与是否有语法错误 + * @param {Object} editor 编辑器实例 + * @param {String} name 编辑器对应的表单字段名 + * @param {Object} options: { required: boolean } required是否必填 + * @return result.success:boolean true(通过)/false(不通过), result.message:string + */ +export const validateMonacoEditorData = (editor, name, { required, language = 'json' } = {}) => { + if (!editor || !editor.getEditor || !editor.getValue) { + return { success: false, message: `系统异常,请刷新后重试。` } + } + + const content = editor.getValue() + if (required && !content) { + return { success: false, message: `${name}未填写,请按照提示填写后重试。` } + } + + const model = editor.getEditor().getModel() + const uri = model.uri._formatted + const markers = editor.editor + .getMonaco() + .editor.getModelMarkers({ owner: language }) + .filter(({ resource: { _formatted } }) => _formatted === uri) + const messages = markers.map( + ({ startLineNumber, startColumn, message }) => `错误: line: ${startLineNumber} column: ${startColumn} ${message}` + ) + + if (messages.length) { + return { + success: false, + message: `${name}存在以下错误,请先点击右上角格式化按钮自动修复或手动修改后重试:${messages.join('\n')}` + } + } + + return { success: true } +} diff --git a/packages/plugins/data/src/js/constants.js b/packages/plugins/data/src/js/constants.js new file mode 100644 index 0000000..662abc5 --- /dev/null +++ b/packages/plugins/data/src/js/constants.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 STATE = { + CURRENT_STATE: 'current', + GLOBAL_STATE: 'global' +} + +export const OPTION_TYPE = { + ADD: 'add', + UPDATE: 'update', + COPY: 'copy' +} diff --git a/packages/plugins/data/src/js/http.js b/packages/plugins/data/src/js/http.js new file mode 100644 index 0000000..1c7d815 --- /dev/null +++ b/packages/plugins/data/src/js/http.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. + * + */ + +import { useHttp } from '@opentiny/tiny-engine-http' + +const http = useHttp() + +// 状态管理 —— 更新全局变量 +export const updateGlobalState = (appId, params) => http.post(`/app-center/api/apps/update/${appId}`, params) + +export const requestGlobalState = (appId) => http.get(`/app-center/api/apps/schema/${appId}`) diff --git a/packages/plugins/data/test/test.js b/packages/plugins/data/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/data/vite.config.js b/packages/plugins/data/vite.config.js new file mode 100644 index 0000000..bb51f82 --- /dev/null +++ b/packages/plugins/data/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-data', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['monaco-editor', 'vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/datasource/index.js b/packages/plugins/datasource/index.js new file mode 100644 index 0000000..2289806 --- /dev/null +++ b/packages/plugins/datasource/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 { fetchDataSourceList, fetchDataSourceDetail } from './src/js/http' +import component from './src/Main.vue' + +export default { + id: 'Collections', + title: '数据源', + icon: 'plugin-icon-data', + align: 'top', + component +} + +export { fetchDataSourceList, fetchDataSourceDetail } diff --git a/packages/plugins/datasource/package.json b/packages/plugins/datasource/package.json new file mode 100644 index 0000000..0135868 --- /dev/null +++ b/packages/plugins/datasource/package.json @@ -0,0 +1,48 @@ +{ + "name": "@opentiny/tiny-engine-plugin-datasource", + "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/plugins/datasource" + }, + "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-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0", + "@vue/shared": "^3.3.4", + "axios": "^0.27.2", + "vue-clipboard3": "^2.0.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/datasource/src/DataSourceField.vue b/packages/plugins/datasource/src/DataSourceField.vue new file mode 100644 index 0000000..9763b4a --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceField.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceFieldCheck.vue b/packages/plugins/datasource/src/DataSourceFieldCheck.vue new file mode 100644 index 0000000..52170ed --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceFieldCheck.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceFieldCheckMultipleLine.vue b/packages/plugins/datasource/src/DataSourceFieldCheckMultipleLine.vue new file mode 100644 index 0000000..ded1b60 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceFieldCheckMultipleLine.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceFieldCheckRanger.vue b/packages/plugins/datasource/src/DataSourceFieldCheckRanger.vue new file mode 100644 index 0000000..6cd972d --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceFieldCheckRanger.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/packages/plugins/datasource/src/DataSourceFieldForm.vue b/packages/plugins/datasource/src/DataSourceFieldForm.vue new file mode 100644 index 0000000..8bcef0a --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceFieldForm.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceFieldList.vue b/packages/plugins/datasource/src/DataSourceFieldList.vue new file mode 100644 index 0000000..2bc3d27 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceFieldList.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceFieldType.vue b/packages/plugins/datasource/src/DataSourceFieldType.vue new file mode 100644 index 0000000..6e62cd9 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceFieldType.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceForm.vue b/packages/plugins/datasource/src/DataSourceForm.vue new file mode 100644 index 0000000..3274fd2 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceForm.vue @@ -0,0 +1,277 @@ + + + + diff --git a/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue b/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue new file mode 100644 index 0000000..ebe9b27 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue @@ -0,0 +1,118 @@ + + + + diff --git a/packages/plugins/datasource/src/DataSourceList.vue b/packages/plugins/datasource/src/DataSourceList.vue new file mode 100644 index 0000000..466d722 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceList.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceName.vue b/packages/plugins/datasource/src/DataSourceName.vue new file mode 100644 index 0000000..401c539 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceName.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRecordForm.vue b/packages/plugins/datasource/src/DataSourceRecordForm.vue new file mode 100644 index 0000000..ab0d19d --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRecordForm.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRecordList.vue b/packages/plugins/datasource/src/DataSourceRecordList.vue new file mode 100644 index 0000000..93ee922 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRecordList.vue @@ -0,0 +1,760 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRecordUpload.vue b/packages/plugins/datasource/src/DataSourceRecordUpload.vue new file mode 100644 index 0000000..b73e8dd --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRecordUpload.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue b/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue new file mode 100644 index 0000000..58bc0da --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemoteDataAdapter.vue b/packages/plugins/datasource/src/DataSourceRemoteDataAdapter.vue new file mode 100644 index 0000000..6006234 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemoteDataAdapter.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue b/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue new file mode 100644 index 0000000..c42eebd --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemoteForm.vue b/packages/plugins/datasource/src/DataSourceRemoteForm.vue new file mode 100644 index 0000000..f011777 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemoteForm.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemoteMapping.vue b/packages/plugins/datasource/src/DataSourceRemoteMapping.vue new file mode 100644 index 0000000..6eed60e --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemoteMapping.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemotePanel.vue b/packages/plugins/datasource/src/DataSourceRemotePanel.vue new file mode 100644 index 0000000..11028c6 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemotePanel.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceRemoteParameter.vue b/packages/plugins/datasource/src/DataSourceRemoteParameter.vue new file mode 100644 index 0000000..b85dd8f --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceRemoteParameter.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceTemplate.vue b/packages/plugins/datasource/src/DataSourceTemplate.vue new file mode 100644 index 0000000..1b1f440 --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceTemplate.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/packages/plugins/datasource/src/DataSourceType.vue b/packages/plugins/datasource/src/DataSourceType.vue new file mode 100644 index 0000000..2c8c4be --- /dev/null +++ b/packages/plugins/datasource/src/DataSourceType.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/packages/plugins/datasource/src/Main.vue b/packages/plugins/datasource/src/Main.vue new file mode 100644 index 0000000..1ec29d6 --- /dev/null +++ b/packages/plugins/datasource/src/Main.vue @@ -0,0 +1,163 @@ + + + + diff --git a/packages/plugins/datasource/src/RemoteDataAdapterForm.vue b/packages/plugins/datasource/src/RemoteDataAdapterForm.vue new file mode 100644 index 0000000..bff8b40 --- /dev/null +++ b/packages/plugins/datasource/src/RemoteDataAdapterForm.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/packages/plugins/datasource/src/config.js b/packages/plugins/datasource/src/config.js new file mode 100644 index 0000000..65b9b18 --- /dev/null +++ b/packages/plugins/datasource/src/config.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. + * + */ + +export default [ + { + name: '字符串', + icon: 'text', + type: 'string', + value: '' + }, + { + name: '日期', + icon: 'datepick', + type: 'date', + value: '' + }, + { + name: '计数器', + icon: 'numeric', + type: 'number', + value: '' + }, + { + name: '文字链接', + icon: 'link', + type: 'link', + value: '' + }, + { + name: '开关', + icon: 'switch', + type: 'switch', + value: '' + }, + { + name: '滑块', + icon: 'dragger', + type: 'slider', + value: '' + } +] diff --git a/packages/plugins/datasource/src/js/datasource.js b/packages/plugins/datasource/src/js/datasource.js new file mode 100644 index 0000000..5b9512a --- /dev/null +++ b/packages/plugins/datasource/src/js/datasource.js @@ -0,0 +1,162 @@ +/** + * 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 { useResource } from '@opentiny/tiny-engine-controller' +import { generateFunction } from '@opentiny/tiny-engine-controller/utils' +import { isMock } from '@opentiny/tiny-engine-controller/js/environments' +import { utils as commonUtils, constants } from '@opentiny/tiny-engine-utils' +import { read, utils, writeFileXLSX } from 'xlsx' + +const { DEFAULT_INTERCEPTOR } = constants + +const load = (http, options, dataSource, shouldFetch) => (params, customUrl) => { + if (!shouldFetch()) { + return undefined + } + + dataSource.status = 'loading' + + const { method, uri: url, params: defaultParams, timeout, headers } = options + const config = { method, url, headers, timeout } + + const data = params || defaultParams + + config.url = customUrl || config.url + + if (method.toLowerCase() === 'get') { + config.params = data + } else { + config.data = data + } + + return http.request(config) +} + +const createFn = (fnContent) => { + return (...args) => { + const fn = generateFunction(fnContent, this) + return fn.apply(this, args) + } +} + +const defaultDataHandler = createFn(DEFAULT_INTERCEPTOR.dataHandler.value) +const defaultWillFetch = createFn(DEFAULT_INTERCEPTOR.willFetch.value) +const defaultErrorHandler = createFn(DEFAULT_INTERCEPTOR.errorHandler.value) + +export const getRequest = (config) => { + const globalDataHandle = useResource().resState.dataHandler + ? createFn(useResource().resState.dataHandler.value) + : defaultDataHandler + + const globalErrorHandler = useResource().resState.errorHandler + ? createFn(useResource().resState.errorHandler.value) + : defaultErrorHandler + + const globalWillFetch = useResource().resState.willFetch + ? createFn(useResource().resState.willFetch.value) + : defaultWillFetch + + const http = axios.create() + + http.interceptors.response.use(globalDataHandle, globalErrorHandler) + + const dataSource = { config } + const shouldFetch = createFn(config.shouldFetch.value) + const willFetch = createFn(config.willFetch.value) + + const dataHandler = (res) => { + const data = createFn(config.dataHandler.value)(res) + dataSource.status = 'loaded' + dataSource.data = data + return data + } + + const errorHandler = (error) => { + const reject = createFn(config.errorHandler.value)(error) + dataSource.status = 'error' + dataSource.error = error + return reject + } + + http.interceptors.request.use(willFetch, errorHandler) + http.interceptors.request.use(globalWillFetch, globalErrorHandler) // axios对于request拦截器是后注册先执行 + + http.interceptors.response.use(dataHandler, errorHandler) + + if (isMock) { + http.mock([ + { + url: config.options.uri, + response() { + return Promise.resolve([200, { data: config.data }]) + } + }, + { + url: '*', + proxy: '*' + } + ]) + } + + dataSource.status = 'init' + dataSource.load = load(http, config.options, dataSource, shouldFetch) + + return dataSource +} + +export const handleImportedData = (columns, importData) => { + const titleMap = columns.reduce((prev, cur) => { + prev[cur.title] = cur.name + return prev + }, {}) + return importData + .map((item) => Object.fromEntries(Object.entries(item).map(([key, value]) => [titleMap[key], value]))) + .map((item) => { + return { ...item, _id: item._id || commonUtils.guid() } + }) +} + +export const getDataFromFile = async (file) => { + const wb = read(await file.arrayBuffer()) + const array = utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) + + return array +} + +export const downloadFn = async (columns, fileName) => { + const set = new Set(['操作']) + const obj = columns + .filter((col) => col.title && !set.has(col.title)) + .reduce((prev, cur) => { + prev[cur.title] = '' + return prev + }, {}) + const ws = utils.json_to_sheet([obj]) + const wb = utils.book_new() + utils.book_append_sheet(wb, ws, 'Data') + writeFileXLSX(wb, fileName) +} + +export const overrideOrMergeData = (isOverride, data, imported) => { + if (isOverride) { + return imported + } else { + return imported.concat(data || []) + } +} + +export const getDataAfterPage = (data, attrs) => { + const { currentPage, pageSize } = attrs + const offset = (currentPage - 1) * pageSize + return data.slice(offset, offset + pageSize) +} diff --git a/packages/plugins/datasource/src/js/http.js b/packages/plugins/datasource/src/js/http.js new file mode 100644 index 0000000..b4bb3a6 --- /dev/null +++ b/packages/plugins/datasource/src/js/http.js @@ -0,0 +1,51 @@ +/** + * 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 { isVsCodeEnv } from '@opentiny/tiny-engine-controller/js/environments' +import { useHttp } from '@opentiny/tiny-engine-http' +import { generateDataSource } from '@opentiny/tiny-engine-controller/js/vscodeGenerateFile' + +const http = useHttp() + +// 数据源管理 -- 获取数据源列表 +export const fetchDataSourceList = (appId) => http.get(`/app-center/api/sources/list/${appId}`) + +// 数据源管理 -- 新增数据源 +export const requestAddDataSource = (params) => http.post('/app-center/api/sources/create', params) + +// 数据源管理 -- 删除数据源 +export const requestDeleteDataSource = (dataSourceId) => http.get(`/app-center/api/sources/delete/${dataSourceId}`) + +// 数据源管理 -- 更新数据源 +export const requestUpdateDataSource = (dataSourceId, params) => + http.post(`/app-center/api/sources/update/${dataSourceId}`, params) + +// 数据源管理 -- 查询数据源详情 +export const fetchDataSourceDetail = (dataSourceId) => http.get(`/app-center/api/sources/detail/${dataSourceId}`) + +// 数据源管理 -- 获取数据源模板 +export const fetchTemplates = (platformId) => http.get(`/app-center/api/source_tpl?platform=${platformId}`) + +// 数据源管理 -- 查询数据源模板详情 +export const fetchTemplateDetail = (templateId) => http.get(`/app-center/api/source_tpl?id=${templateId}`) + +// 数据源管理 -- 设置全局的请求成功后的处理函数 +export const requestGlobalDataHandler = (appId, params) => http.post(`/app-center/api/apps/update/${appId}`, params) + +// 生成数据源配置到本地文件 +export const requestGenerateDataSource = (appId) => { + if (isVsCodeEnv) { + http.get(`/app-center/api/apps/schema/${appId}`).then((data) => { + generateDataSource(data.dataSource) + }) + } +} diff --git a/packages/plugins/datasource/vite.config.js b/packages/plugins/datasource/vite.config.js new file mode 100644 index 0000000..c8ea647 --- /dev/null +++ b/packages/plugins/datasource/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-datasource', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/help/assets/test.png b/packages/plugins/help/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/help/index.js b/packages/plugins/help/index.js new file mode 100644 index 0000000..208f00b --- /dev/null +++ b/packages/plugins/help/index.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. + * + */ + +import HelpIcon from './src/HelpIcon.vue' + +export default { + id: 'EditorHelp', + title: '', + icon: HelpIcon, + align: 'bottom' +} diff --git a/packages/plugins/help/mock/test.js b/packages/plugins/help/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/help/package.json b/packages/plugins/help/package.json new file mode 100644 index 0000000..76e3d0b --- /dev/null +++ b/packages/plugins/help/package.json @@ -0,0 +1,40 @@ +{ + "name": "@opentiny/tiny-engine-plugin-help", + "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/plugins/help" + }, + "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-http": "workspace:*", + "@opentiny/vue": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/help/src/HelpIcon.vue b/packages/plugins/help/src/HelpIcon.vue new file mode 100644 index 0000000..f285fdf --- /dev/null +++ b/packages/plugins/help/src/HelpIcon.vue @@ -0,0 +1,382 @@ + + + + + + + + diff --git a/packages/plugins/help/test/test.js b/packages/plugins/help/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/help/vite.config.js b/packages/plugins/help/vite.config.js new file mode 100644 index 0000000..89b8139 --- /dev/null +++ b/packages/plugins/help/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-help', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/i18n/assets/test.png b/packages/plugins/i18n/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/i18n/index.js b/packages/plugins/i18n/index.js new file mode 100644 index 0000000..d8aaa4f --- /dev/null +++ b/packages/plugins/i18n/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: 'I18n', + title: '国际化', + icon: 'plugin-icon-language', + align: 'top', + component +} diff --git a/packages/plugins/i18n/mock/test.js b/packages/plugins/i18n/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json new file mode 100644 index 0000000..3577ab4 --- /dev/null +++ b/packages/plugins/i18n/package.json @@ -0,0 +1,43 @@ +{ + "name": "@opentiny/tiny-engine-plugin-i18n", + "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/plugins/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-common": "workspace:*", + "@opentiny/tiny-engine-controller": "workspace:*", + "@opentiny/tiny-engine-http": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-icon": "~3.10.0", + "vue-clipboard3": "^2.0.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/i18n/src/Main.vue b/packages/plugins/i18n/src/Main.vue new file mode 100644 index 0000000..83e6b1d --- /dev/null +++ b/packages/plugins/i18n/src/Main.vue @@ -0,0 +1,648 @@ + + + + + diff --git a/packages/plugins/i18n/test/test.js b/packages/plugins/i18n/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/i18n/vite.config.js b/packages/plugins/i18n/vite.config.js new file mode 100644 index 0000000..71de3ed --- /dev/null +++ b/packages/plugins/i18n/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-i18n', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/materials/assets/test.png b/packages/plugins/materials/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/materials/index.js b/packages/plugins/materials/index.js new file mode 100644 index 0000000..49bfed6 --- /dev/null +++ b/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/packages/plugins/materials/mock/test.js b/packages/plugins/materials/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/materials/package.json b/packages/plugins/materials/package.json new file mode 100644 index 0000000..5b2ee34 --- /dev/null +++ b/packages/plugins/materials/package.json @@ -0,0 +1,41 @@ +{ + "name": "@opentiny/tiny-engine-plugin-materials", + "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/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/vue": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/materials/src/Main.vue b/packages/plugins/materials/src/Main.vue new file mode 100644 index 0000000..3239ecb --- /dev/null +++ b/packages/plugins/materials/src/Main.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockDetail.vue b/packages/plugins/materials/src/block/BlockDetail.vue new file mode 100644 index 0000000..60ac948 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockDetail.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockGroup.vue b/packages/plugins/materials/src/block/BlockGroup.vue new file mode 100644 index 0000000..bc632ce --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroup.vue @@ -0,0 +1,528 @@ + + + + + + + diff --git a/packages/plugins/materials/src/block/BlockGroupArrange.vue b/packages/plugins/materials/src/block/BlockGroupArrange.vue new file mode 100644 index 0000000..f3b13ce --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroupArrange.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockGroupFilters.vue b/packages/plugins/materials/src/block/BlockGroupFilters.vue new file mode 100644 index 0000000..7f45782 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroupFilters.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockGroupPanel.vue b/packages/plugins/materials/src/block/BlockGroupPanel.vue new file mode 100644 index 0000000..d92b8db --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroupPanel.vue @@ -0,0 +1,246 @@ + + + diff --git a/packages/plugins/materials/src/block/BlockGroupSort.vue b/packages/plugins/materials/src/block/BlockGroupSort.vue new file mode 100644 index 0000000..f5c2dd2 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroupSort.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockGroupTransfer.vue b/packages/plugins/materials/src/block/BlockGroupTransfer.vue new file mode 100644 index 0000000..b3292f9 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroupTransfer.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockGroupTransferPanel.vue b/packages/plugins/materials/src/block/BlockGroupTransferPanel.vue new file mode 100644 index 0000000..cf9ff78 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockGroupTransferPanel.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockList.vue b/packages/plugins/materials/src/block/BlockList.vue new file mode 100644 index 0000000..107ed07 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockList.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/packages/plugins/materials/src/block/BlockVersionSelect.vue b/packages/plugins/materials/src/block/BlockVersionSelect.vue new file mode 100644 index 0000000..67f4249 --- /dev/null +++ b/packages/plugins/materials/src/block/BlockVersionSelect.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/packages/plugins/materials/src/block/Main.vue b/packages/plugins/materials/src/block/Main.vue new file mode 100644 index 0000000..62145e1 --- /dev/null +++ b/packages/plugins/materials/src/block/Main.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/packages/plugins/materials/src/block/http.js b/packages/plugins/materials/src/block/http.js new file mode 100644 index 0000000..513bf7b --- /dev/null +++ b/packages/plugins/materials/src/block/http.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 { getGlobalConfig, useApp } from '@opentiny/tiny-engine-controller' +import { useHttp } from '@opentiny/tiny-engine-http' +const http = useHttp() + +const getParams = (obj) => { + let result = '' + for (let item in obj) { + if (obj[item] instanceof Array) { + obj[item].forEach((i) => { + result += `&${item}=${i}` + }) + } else if (obj[item]) { + result += `&${item}=${obj[item]}` + } + } + + return result ? `?${result.slice(1)}` : result +} + +// 区块消费侧 -- 获取区块分组列表 +export const fetchGroups = (appId) => http.get(`/material-center/api/block-groups?app=${appId}`) + +// 根据区块分组ID获取该分组下的区块 +export const fetchGroupBlocks = ({ groupId, value }) => + http.get( + `/material-center/api/block${getParams({ + groups: groupId, + framework: getGlobalConfig()?.dslMode, + label_contains: value + })}` + ) + +export const fetchGroupBlocksByIds = async ({ groupIds }) => { + const blockGroups = await http.get( + `/material-center/api/block-groups${getParams({ + id: groupIds + })}` + ) + + // 所有分组下面可能会有区块重复,需要去重 + const blockIdSet = new Set() + const dslMode = getGlobalConfig()?.dslMode + + const blocks = blockGroups + .map((group) => group.blocks.map((block) => ({ ...block, groupId: group.id, groupName: group.name }))) + .flat() + .filter(({ framework, id }) => { + if (dslMode === framework && !blockIdSet.has(id)) { + blockIdSet.add(id) + return true + } + return false + }) + + return blocks || [] +} + +export const fetchGroupBlocksById = async ({ groupId }) => { + const blockGroup = await http.get( + `/material-center/api/block-groups${getParams({ + id: groupId + })}` + ) + + let data = blockGroup?.[0]?.blocks || [] + + data = data.filter((block) => block.framework === getGlobalConfig()?.dslMode).map((item) => ({ ...item, groupId })) + + return data +} + +// 创建区块分组信息 +export const requestCreateGroup = ({ name, app }) => + http.post('/material-center/api/block-groups/create', { name, app }) + +// 更新分组:修改分组名字/向分组里添加、删除区块 +export const requestUpdateGroup = ({ id, name, app, blocks }) => + http.post(`/material-center/api/block-groups/update/${id}`, { name, app, blocks }) + +// 更新区块版本 +export const requestGroupBlockVersion = async ({ groupId, blockId, blockVersion }) => { + const app = useApp().appInfoState.selectedId + let blocks = await fetchGroupBlocksById({ groupId }) + + blocks = blocks.map((block) => ({ + id: block.id, + version: block.id === blockId ? blockVersion : block.current_version + })) + + return requestUpdateGroup({ id: groupId, app, blocks }) +} + +// 根据区块分组ID删除区块分组信息 +export const requestDeleteGroup = (groupId) => http.get(`/material-center/api/block-groups/delete/${groupId}`) + +// 根据区块ID获取区块历史备份列表 +export const fetchBackupList = (blockId) => http.get(`/material-center/api/block-history?block=${blockId}`) + +// 获取区块详情 +export const fetchBlockById = (blockId) => http.get(`/material-center/api/block/detail/${blockId}`) + +// 根据分组ID获取当前分组可以添加的区块 +export const fetchAvailableBlocks = ({ groupId, label_contains, author, tag, publicType }) => + http.get( + `/material-center/api/block/notgroup/${groupId}${getParams({ + label_contains, + createdBy: author, + tags_contains: tag, + public: publicType + })}` + ) + +// 获取区块所有标签 +export const fetchTags = () => http.get(`/material-center/api/block/tags`) + +// 获取区块所有作者 +export const fetchUsers = () => http.get(`/material-center/api/block/users`) + +// 获取区块所有tag +export const fetchTenants = () => http.get(`/material-center/api/block/tenants`) + +// 恢复区块某一历史备份 +export const requestRestoreBackup = ({ blockId, backupId }) => + http.post(`/material-center/api/block/update/${blockId}`, { current_history: backupId }) diff --git a/packages/plugins/materials/src/block/js/usePanel.js b/packages/plugins/materials/src/block/js/usePanel.js new file mode 100644 index 0000000..a87791e --- /dev/null +++ b/packages/plugins/materials/src/block/js/usePanel.js @@ -0,0 +1,63 @@ +/** +* 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' + +const generateInitPanelState = () => ({ + created: false, + show: false +}) + +const panelState = reactive({ + groupPanel: generateInitPanelState(), + versionSelectPanel: generateInitPanelState() +}) + +const openPanel = (panel) => { + panel.created = true + panel.show = true +} + +const closePanel = (panel) => { + panel.show = false +} + +const closeAllPanel = () => { + Object.values(panelState).forEach(closePanel) +} + +const generateUsePanelMethod = (panel) => { + return () => ({ + panel, + openPanel: () => openPanel(panel), + closePanel: () => closePanel(panel) + }) +} + +export const useGroupPanel = generateUsePanelMethod(panelState.groupPanel) + +export const useVersionSelectPanel = generateUsePanelMethod(panelState.versionSelectPanel) + +const generateSetVisibleMethod = (usePanel) => { + return (visible) => { + const { openPanel } = usePanel() + + closeAllPanel() + if (visible) { + openPanel() + } + } +} + +export const setBlockPanelVisible = generateSetVisibleMethod(useGroupPanel) + +export const setBlockVersionPanelVisible = generateSetVisibleMethod(useVersionSelectPanel) diff --git a/packages/plugins/materials/src/component/Main.vue b/packages/plugins/materials/src/component/Main.vue new file mode 100644 index 0000000..a75ae79 --- /dev/null +++ b/packages/plugins/materials/src/component/Main.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/packages/plugins/materials/test/test.js b/packages/plugins/materials/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/materials/vite.config.js b/packages/plugins/materials/vite.config.js new file mode 100644 index 0000000..6df3a05 --- /dev/null +++ b/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/packages/plugins/page/assets/test.png b/packages/plugins/page/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/page/index.js b/packages/plugins/page/index.js new file mode 100644 index 0000000..ef83e9d --- /dev/null +++ b/packages/plugins/page/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, { api } from './src/Main.vue' + +export default { + id: 'AppManage', + title: '页面管理', + icon: 'plugin-icon-page', + align: 'top', + api, + component +} diff --git a/packages/plugins/page/mock/test.js b/packages/plugins/page/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/page/package.json b/packages/plugins/page/package.json new file mode 100644 index 0000000..fa1df63 --- /dev/null +++ b/packages/plugins/page/package.json @@ -0,0 +1,42 @@ +{ + "name": "@opentiny/tiny-engine-plugin-page", + "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/plugins/page" + }, + "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-http": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", + "@opentiny/vue": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/page/src/Main.vue b/packages/plugins/page/src/Main.vue new file mode 100644 index 0000000..b9cf21d --- /dev/null +++ b/packages/plugins/page/src/Main.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/packages/plugins/page/src/PageFolderSetting.vue b/packages/plugins/page/src/PageFolderSetting.vue new file mode 100644 index 0000000..7691d5f --- /dev/null +++ b/packages/plugins/page/src/PageFolderSetting.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/packages/plugins/page/src/PageGeneral.vue b/packages/plugins/page/src/PageGeneral.vue new file mode 100644 index 0000000..36a682f --- /dev/null +++ b/packages/plugins/page/src/PageGeneral.vue @@ -0,0 +1,305 @@ + + + + + + diff --git a/packages/plugins/page/src/PageHistory.vue b/packages/plugins/page/src/PageHistory.vue new file mode 100644 index 0000000..178a5bc --- /dev/null +++ b/packages/plugins/page/src/PageHistory.vue @@ -0,0 +1,78 @@ + + + diff --git a/packages/plugins/page/src/PageHome.vue b/packages/plugins/page/src/PageHome.vue new file mode 100644 index 0000000..c99c70d --- /dev/null +++ b/packages/plugins/page/src/PageHome.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/packages/plugins/page/src/PageInputOutput.vue b/packages/plugins/page/src/PageInputOutput.vue new file mode 100644 index 0000000..ae3855b --- /dev/null +++ b/packages/plugins/page/src/PageInputOutput.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/packages/plugins/page/src/PageSetting.vue b/packages/plugins/page/src/PageSetting.vue new file mode 100644 index 0000000..4302459 --- /dev/null +++ b/packages/plugins/page/src/PageSetting.vue @@ -0,0 +1,426 @@ + + + + + diff --git a/packages/plugins/page/src/PageTree.vue b/packages/plugins/page/src/PageTree.vue new file mode 100644 index 0000000..8183978 --- /dev/null +++ b/packages/plugins/page/src/PageTree.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/packages/plugins/page/src/http.js b/packages/plugins/page/src/http.js new file mode 100644 index 0000000..07dbca9 --- /dev/null +++ b/packages/plugins/page/src/http.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 { useHttp } from '@opentiny/tiny-engine-http' + +const http = useHttp() + +// 页面管理 -- 获取页面列表 +export const fetchPageList = (appId) => http.get(`/app-center/api/pages/list/${appId}`) + +// 页面管理 -- 获取页面详情 +export const fetchPageDetail = (pageId) => http.get(`/app-center/api/pages/detail/${pageId}`) + +// 页面管理 -- 删除页面 +export const requestDeletePage = (pageId) => http.get(`/app-center/api/pages/delete/${pageId}`) + +// 页面管理 -- 新增页面 +export const requestCreatePage = (params) => http.post('/app-center/api/pages/create', params) + +// 页面管理 -- 保存页面 +export const handleRouteHomeUpdate = (pageId, params) => http.post(`/app-center/api/pages/update/${pageId}`, params) + +// 页面管理 -- 复制页面 +export const requestCopyPage = (params) => http.post('/app-center/api/pages/copy', params) + +// 页面管理 -- 获取页面历史备份列表 +export const fetchPageHistory = (pageId) => http.get(`/app-center/api/pages/histories?page=${pageId}`) + +// 页面管理 -- 还原历史备份 +export const requestRestorePageHistory = (params) => http.post('/app-center/api/pageHistory/restore', params) + +// 页面管理 -- 查看历史备份详情 +export const fetchHistoryDetail = (pageId) => http.get(`/app-center/api/pages/histories/${pageId}`) + +export const requestUpdatePage = (pageId, params) => http.post(`/app-center/api/pages/update/${pageId}`, params) + +export default { + fetchPageList, + fetchPageDetail, + requestDeletePage, + requestCreatePage, + requestCopyPage, + fetchPageHistory, + fetchHistoryDetail, + handleRouteHomeUpdate, + requestRestorePageHistory, + requestUpdatePage +} diff --git a/packages/plugins/page/test/test.js b/packages/plugins/page/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/page/vite.config.js b/packages/plugins/page/vite.config.js new file mode 100644 index 0000000..69d756e --- /dev/null +++ b/packages/plugins/page/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-page', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/robot/assets/AI.png b/packages/plugins/robot/assets/AI.png new file mode 100644 index 0000000..05ea374 Binary files /dev/null and b/packages/plugins/robot/assets/AI.png differ diff --git a/packages/plugins/robot/assets/test.png b/packages/plugins/robot/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/robot/index.js b/packages/plugins/robot/index.js new file mode 100644 index 0000000..a0f107b --- /dev/null +++ b/packages/plugins/robot/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: 'Robot', + title: 'AI对话框', + icon: 'plugin-icon-robot', + align: 'independence', + component +} diff --git a/packages/plugins/robot/mock/test.js b/packages/plugins/robot/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/robot/package.json b/packages/plugins/robot/package.json new file mode 100644 index 0000000..bbc7e48 --- /dev/null +++ b/packages/plugins/robot/package.json @@ -0,0 +1,42 @@ +{ + "name": "@opentiny/tiny-engine-plugin-robot", + "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/plugins/robot" + }, + "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", + "@opentiny/vue-renderless": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/robot/src/Main.vue b/packages/plugins/robot/src/Main.vue new file mode 100644 index 0000000..f2dbc4b --- /dev/null +++ b/packages/plugins/robot/src/Main.vue @@ -0,0 +1,514 @@ + + + + + diff --git a/packages/plugins/robot/src/js/robotSetting.js b/packages/plugins/robot/src/js/robotSetting.js new file mode 100644 index 0000000..be713b4 --- /dev/null +++ b/packages/plugins/robot/src/js/robotSetting.js @@ -0,0 +1,74 @@ +/** + * 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 { useApp, useBlock } from '@opentiny/tiny-engine-controller' +import { useHttp } from '@opentiny/tiny-engine-http' + +const { getBlockList } = useBlock() + +export const AIModelOptions = [ + { label: 'ChatGPT:gpt-3.5-turbo', value: 'gpt-3.5-turbo', manufacturer: 'openai' }, + { label: '文心一言:ERNIE-Bot-turbo', value: 'ERNIE-Bot-turbo', manufacturer: 'baiduai' } +] + +// 这里存放的是aichat的响应式数据 +const state = reactive({ + blockList: getBlockList(), + blockContent: '' +}) + +const http = useHttp() + +export const getBlocks = () => state.blockList || [] + +export const setBlocks = (blocks) => { + state.blockList = blocks +} + +export const getBlockContent = () => state.blockContent || '' + +const transformBlockNameToElement = (label) => { + const elementName = label.replace(/[A-Z]/g, (letter, index) => { + return index === 0 ? letter.toLowerCase() : `_${letter.toLowerCase()}` + }) + return `<${elementName}>` +} + +// 拼接blockContent,在ai初始时引入区块。 +const setBlockContent = (list = getBlocks()) => { + const blockList = list.slice(0, 200) // 为了尽量避免每个请求的message内容过大,限制block的个数避免超出字节要求 + const blockMessages = blockList.map((item) => { + const blockElementName = transformBlockNameToElement(item.label) + return `${blockElementName}名称是${item.label}` + }) + const content = blockMessages?.join(';') + if (content) { + state.blockContent = `在提问之前,我希望你记住以下自定义的前端组件:${content}。接下来我开始问出第一个问题:` + } else { + state.blockContent = '' + } +} + +export const initBlockList = async () => { + if (state.blockList?.length) { + return + } + const appId = useApp().appInfoState.selectedId + try { + const list = await http.get('/material-center/api/blocks', { params: { appId } }) + setBlocks(list) + setBlockContent(list) + } catch (err) { + // 捕获错误 + } +} diff --git a/packages/plugins/robot/test/test.js b/packages/plugins/robot/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/robot/vite.config.js b/packages/plugins/robot/vite.config.js new file mode 100644 index 0000000..218d0a5 --- /dev/null +++ b/packages/plugins/robot/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-robot', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/schema/assets/test.png b/packages/plugins/schema/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/schema/index.js b/packages/plugins/schema/index.js new file mode 100644 index 0000000..63b1189 --- /dev/null +++ b/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/packages/plugins/schema/mock/test.js b/packages/plugins/schema/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/schema/package.json b/packages/plugins/schema/package.json new file mode 100644 index 0000000..30c8261 --- /dev/null +++ b/packages/plugins/schema/package.json @@ -0,0 +1,41 @@ +{ + "name": "@opentiny/tiny-engine-plugin-schema", + "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/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" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/schema/src/Main.vue b/packages/plugins/schema/src/Main.vue new file mode 100644 index 0000000..53c3b1a --- /dev/null +++ b/packages/plugins/schema/src/Main.vue @@ -0,0 +1,230 @@ + + + + + diff --git a/packages/plugins/schema/test/test.js b/packages/plugins/schema/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/schema/vite.config.js b/packages/plugins/schema/vite.config.js new file mode 100644 index 0000000..0205767 --- /dev/null +++ b/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/packages/plugins/script/assets/test.png b/packages/plugins/script/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/script/index.js b/packages/plugins/script/index.js new file mode 100644 index 0000000..f89c080 --- /dev/null +++ b/packages/plugins/script/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, { api } from './src/Main.vue' + +export default { + id: 'PageController', + title: '页面 JS', + icon: 'plugin-icon-js', + align: 'top', + api, + component, + confirm: 'close', // 当点击插件栏切换或关闭前是否需要确认, 会调用插件中confirm值指定的方法,e.g. 此处指向 close方法,会调用插件的close方法执行确认逻辑 +} diff --git a/packages/plugins/script/mock/test.js b/packages/plugins/script/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/script/package.json b/packages/plugins/script/package.json new file mode 100644 index 0000000..fdc60e3 --- /dev/null +++ b/packages/plugins/script/package.json @@ -0,0 +1,42 @@ +{ + "name": "@opentiny/tiny-engine-plugin-script", + "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/plugins/script" + }, + "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", + "@opentiny/vue-renderless": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/script/src/Main.vue b/packages/plugins/script/src/Main.vue new file mode 100644 index 0000000..9ef9e9e --- /dev/null +++ b/packages/plugins/script/src/Main.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/packages/plugins/script/src/js/method.js b/packages/plugins/script/src/js/method.js new file mode 100644 index 0000000..15d2acb --- /dev/null +++ b/packages/plugins/script/src/js/method.js @@ -0,0 +1,213 @@ +/** + * 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, watchEffect, onActivated, nextTick } from 'vue' +import { useCanvas, useModal, useNotify } from '@opentiny/tiny-engine-controller' +import { string2Ast, ast2String, insertName, formatString } from '@opentiny/tiny-engine-controller/js/ast' +import { constants } from '@opentiny/tiny-engine-utils' +import { getSchema } from '@opentiny/tiny-engine-canvas' +import { lint } from '@opentiny/tiny-engine-controller/js/linter' +import { isFunction } from '@opentiny/vue-renderless/grid/static' + +const { SCHEMA_DATA_TYPE } = constants +const { message, confirm } = useModal() + +const state = reactive({ + linterWorker: null, + script: '', + isChanged: false, + hasError: false, + editorSelection: null, + completionProvider: null +}) + +const monaco = ref(null) + +let scriptAst = null + +export const getMethods = () => { + const pageSchema = getSchema?.() || {} + + pageSchema.methods = pageSchema?.methods || {} + return pageSchema.methods +} + +export const getMethodNameList = () => (useCanvas().pageState.pageSchema && Object.keys(getMethods())) || [] + +export const getMethodContentList = () => Object.values(getMethods()).map((method) => method.value) + +const getScriptString = () => { + const list = Object.entries(getMethods()).map(([name, method]) => insertName(name, method.value)) + const script = list.join(`\n`) + scriptAst = string2Ast(script) + return script +} + +const change = (value) => { + state.isChanged = value !== state.script + + if (!monaco.value) { + return + } + + // 用户在线编辑代码内容变化时,发起 ESLint 静态检查 + const monacoModel = monaco.value.getEditor().getModel() + lint(monacoModel, state.linterWorker) +} + +export const saveMethod = ({ name, content }) => { + if (!name) { + return + } + + const methods = getMethods() + + if (!methods[name]) { + methods[name] = { + type: SCHEMA_DATA_TYPE.JSFunction, + value: '' + } + } + + methods[name].value = content +} + +const saveMethods = () => { + if (!state.isChanged) { + return false + } + + if (state.hasError) { + message({ + status: 'error', + message: '代码静态检查有错误,请先修改后再保存' + }) + + return false + } + + const editorContent = monaco.value.getEditor().getValue() + const ast = string2Ast(editorContent) + getSchema().methods = {} + + ast.program.body.forEach((declaration, index) => { + const name = declaration?.id?.name + + // 前一个方法的尾部注释和后一个方法的头部注释指向相同引用时,删除尾部注释, 解决注释重复生成问题 + if ( + ast.program.body[index + 1]?.leadingComments && + declaration.trailingComments === ast.program.body[index + 1].leadingComments + ) { + delete declaration.trailingComments + } + + const content = formatString(ast2String(declaration).trim(), 'javascript') + + saveMethod({ name, content }) + }) + useCanvas().setSaved(false) + state.isChanged = false + useNotify({ + type: 'success', + message: '保存成功!' + }) + + return true +} + +const close = (emit) => (callback) => { + const callbackFn = isFunction(callback) ? callback : () => emit('close') + if (!state.isChanged) { + callbackFn(true) + return + } + confirm({ + title: '提示', + message: '有改动未保存,您确定保存并关闭吗?', + exec() { + callbackFn(saveMethods()) + }, + cancel() { + callbackFn(true) + } + }) +} + +const setEditorSelection = () => { + if (!state.editorSelection || !monaco.value) { + return + } + + const editor = monaco.value.getEditor() + + editor.setSelection(state.editorSelection) + editor.focus() + + const top = editor.getTopForLineNumber(state.editorSelection.startLineNumber - 1) + + editor.setScrollPosition( + { + scrollLeft: 0, + scrollTop: top + }, + 0 + ) +} + +export const highlightMethod = (name) => { + if (!name) { + return + } + + const declarations = scriptAst?.program.body.filter((declaration) => name === declaration?.id?.name) + + if (declarations.length === 0) { + return + } + + const loc = declarations[0]?.loc + + if (loc) { + state.editorSelection = { + startColumn: loc.start.column, + startLineNumber: loc.start.line, + endColumn: loc.end.column + 1, + endLineNumber: loc.end.line + } + } + + if (state.editorSelection) { + setEditorSelection() + } +} + +export default ({ emit }) => { + watchEffect(() => { + state.script = getScriptString() + }) + + onActivated(() => { + nextTick(() => { + state.script = getScriptString() + monaco.value?.focus() + window.dispatchEvent(new Event('resize')) + }) + }) + + return { + state, + monaco, + change, + saveMethods, + close: close(emit) + } +} diff --git a/packages/plugins/script/test/test.js b/packages/plugins/script/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/script/vite.config.js b/packages/plugins/script/vite.config.js new file mode 100644 index 0000000..80bab01 --- /dev/null +++ b/packages/plugins/script/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-script', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/tree/assets/test.png b/packages/plugins/tree/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/tree/index.js b/packages/plugins/tree/index.js new file mode 100644 index 0000000..b5f2294 --- /dev/null +++ b/packages/plugins/tree/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: 'OutlineTree', + title: '大纲树', + icon: 'plugin-icon-tree', + align: 'top', + component +} diff --git a/packages/plugins/tree/mock/test.js b/packages/plugins/tree/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/tree/package.json b/packages/plugins/tree/package.json new file mode 100644 index 0000000..2508acc --- /dev/null +++ b/packages/plugins/tree/package.json @@ -0,0 +1,43 @@ +{ + "name": "@opentiny/tiny-engine-plugin-tree", + "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/plugins/tree" + }, + "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", + "@opentiny/vue-icon": "~3.10.0", + "@opentiny/vue-renderless": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/tree/src/Main.vue b/packages/plugins/tree/src/Main.vue new file mode 100644 index 0000000..4efe994 --- /dev/null +++ b/packages/plugins/tree/src/Main.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/packages/plugins/tree/test/test.js b/packages/plugins/tree/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/tree/vite.config.js b/packages/plugins/tree/vite.config.js new file mode 100644 index 0000000..d58d84f --- /dev/null +++ b/packages/plugins/tree/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-tree', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/plugins/tutorial/assets/test.png b/packages/plugins/tutorial/assets/test.png new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/tutorial/index.js b/packages/plugins/tutorial/index.js new file mode 100644 index 0000000..f81e2f3 --- /dev/null +++ b/packages/plugins/tutorial/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, { api } from './src/Main.vue' + +export default { + id: 'Tutorial', + title: 'TinyEngine 教程', + icon: 'plugin-icon-tutorial', + align: 'bottom', + component, + api +} diff --git a/packages/plugins/tutorial/mock/test.js b/packages/plugins/tutorial/mock/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/tutorial/package.json b/packages/plugins/tutorial/package.json new file mode 100644 index 0000000..0b1891e --- /dev/null +++ b/packages/plugins/tutorial/package.json @@ -0,0 +1,41 @@ +{ + "name": "@opentiny/tiny-engine-plugin-tutorial", + "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/plugins/tutorial" + }, + "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-http": "workspace:*", + "@opentiny/vue": "~3.10.0", + "marked": "^4.0.17" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/plugins/tutorial/src/Main.vue b/packages/plugins/tutorial/src/Main.vue new file mode 100644 index 0000000..784d3a9 --- /dev/null +++ b/packages/plugins/tutorial/src/Main.vue @@ -0,0 +1,185 @@ + + + + + + diff --git a/packages/plugins/tutorial/src/TutorialVideoPanel.vue b/packages/plugins/tutorial/src/TutorialVideoPanel.vue new file mode 100644 index 0000000..ac17ff1 --- /dev/null +++ b/packages/plugins/tutorial/src/TutorialVideoPanel.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/packages/plugins/tutorial/src/js/http.js b/packages/plugins/tutorial/src/js/http.js new file mode 100644 index 0000000..d72caba --- /dev/null +++ b/packages/plugins/tutorial/src/js/http.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. + * + */ + +import { useHttp } from '@opentiny/tiny-engine-http' + +const http = useHttp() + +// 获取课程列表 +export const fetchTutorialList = (params) => http.get('platform-center/api/courses', { params }) +// 获取课程详情 +export const fetchTutorialDetail = (courseId) => http.get(`platform-center/api/courses/${courseId}`) diff --git a/packages/plugins/tutorial/test/test.js b/packages/plugins/tutorial/test/test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/plugins/tutorial/vite.config.js b/packages/plugins/tutorial/vite.config.js new file mode 100644 index 0000000..31a9f1a --- /dev/null +++ b/packages/plugins/tutorial/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-tutorial', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/settings/design/package.json b/packages/settings/design/package.json new file mode 100644 index 0000000..5e83b4b --- /dev/null +++ b/packages/settings/design/package.json @@ -0,0 +1,40 @@ +{ + "name": "@opentiny/tiny-engine-setting-design", + "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/settings/design" + }, + "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/vue": "~3.10.0", + "sortablejs": "^1.14.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/settings/design/src/App.vue b/packages/settings/design/src/App.vue new file mode 100644 index 0000000..6f70c06 --- /dev/null +++ b/packages/settings/design/src/App.vue @@ -0,0 +1,240 @@ + + + + + + + diff --git a/packages/settings/design/src/assets/materials/ng-bundle.json b/packages/settings/design/src/assets/materials/ng-bundle.json new file mode 100644 index 0000000..0f8e2c0 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-bundle.json @@ -0,0 +1,3036 @@ +{ + "data": { + "framework": "Angular", + "materials": { + "components": [ + { + "icon": "", + "name": { + "zh_CN": "Container" + }, + "component": "tiny-container", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "style", + "type": "string", + "defaultValue": "margin: 10px;", + "label": { + "text": { + "zh_CN": "样式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "样式类" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "onClick" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Accordion" + }, + "component": "tiny-accordion", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "title", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "默认标题", + "key": "" + }, + "label": { + "text": { + "zh_CN": "标题名称" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "open", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否默认展开" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Alert" + }, + "component": "tiny-alert", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "type", + "type": "string", + "defaultValue": "prompt", + "label": { + "text": {} + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "提示文本", + "key": "" + }, + "label": { + "text": { + "zh_CN": "提示文本" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Swiper" + }, + "component": "tiny-swiper", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "items", + "type": "array", + "defaultValue": [ + { + "src": "img/rocket.jpg" + }, + { + "src": "" + } + ], + "label": { + "text": { + "zh_CN": "轮播项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "autoplay", + "type": "boolean", + "defaultValue": false, + "label": { + "text": { + "zh_CN": "是否自动播放" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "autoplaySpeed", + "type": "number", + "defaultValue": 3000, + "label": { + "text": { + "zh_CN": "自动播放速度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "heigth", + "type": "number", + "defaultValue": 200, + "label": { + "text": { + "zh_CN": "高度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "HalfModal" + }, + "component": "tiny-halfmodal", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "width", + "type": "string", + "defaultValue": "80%", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "style", + "type": "string", + "label": { + "text": { + "zh_CN": "样式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "样式类" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Button" + }, + "component": "tiny-button", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "text", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "按钮文案", + "en_US": "Tiny Button", + "key": "" + }, + "label": { + "text": { + "zh_CN": "按钮文字" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "color", + "type": "select", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "按钮颜色" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSelect", + "props": { + "options": ["", "danger", "primary"] + } + } + }, + { + "property": "size", + "type": "select", + "defaultValue": "large", + "label": { + "text": { + "zh_CN": "大小" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSelect", + "props": { + "options": ["large", "middle", "small", "xs"] + } + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "onClick" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Input" + }, + "component": "tiny-input", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "value", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "placeholder", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "占位文本", + "en_US": "placeholder", + "key": "" + }, + "label": { + "text": { + "zh_CN": "输入框占位文本" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Radio" + }, + "component": "tiny-radio", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "options", + "type": "array", + "defaultValue": [ + { + "label": { + "type": "i18n", + "zh_CN": "蛋糕", + "en_US": "cake", + "key": "" + }, + "text": "cake" + }, + { + "label": { + "type": "i18n", + "zh_CN": "鸡蛋", + "en_US": "egg", + "key": "" + }, + "text": "egg" + }, + { + "label": { + "type": "i18n", + "zh_CN": "牛奶", + "en_US": "milk", + "key": "" + }, + "text": "milk" + } + ], + "label": { + "text": { + "zh_CN": "选项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Select" + }, + "component": "tiny-select", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "items", + "type": "array", + "defaultValue": [ + { + "label": { + "type": "i18n", + "zh_CN": "黄金糕", + "key": "" + }, + "text": "cake" + }, + { + "label": { + "type": "i18n", + "zh_CN": "双皮奶", + "key": "" + }, + "text": "milk" + }, + { + "label": { + "type": "i18n", + "zh_CN": "鸡蛋", + "key": "" + }, + "text": "egg" + } + ], + "label": { + "text": { + "zh_CN": "选项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "selected", + "type": "object", + "defaultValue": { + "label": { + "type": "i18n", + "zh_CN": "黄金糕", + "key": "" + }, + "text": "cake" + }, + "label": { + "text": { + "zh_CN": "选中项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Checkbox" + }, + "component": "tiny-checkbox", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "标签", + "en_US": "Label", + "key": "" + }, + "label": { + "text": { + "zh_CN": "label" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "checked", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否选中" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Tag" + }, + "component": "tiny-tag", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "value", + "type": "string", + "label": { + "text": { + "zh_CN": "tag" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Switch" + }, + "component": "tiny-switch", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "switch-state", + "type": "boolean", + "label": { + "text": { + "zh_CN": "开关" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Tab" + }, + "component": "tiny-tab", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "样式类" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tabs", + "type": "array", + "defaultValue": [ + { + "title": "标签页一", + "active": true + }, + { + "title": "标签页二" + }, + { + "title": "标签页三" + } + ], + "label": { + "text": { + "zh_CN": "标签项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Date" + }, + "component": "tiny-date", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "format", + "type": "string", + "label": { + "text": { + "zh_CN": "日期格式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "value", + "type": "string", + "label": { + "text": { + "zh_CN": "选中日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "min", + "type": "string", + "label": { + "text": { + "zh_CN": "最小日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "max", + "type": "string", + "label": { + "text": { + "zh_CN": "最大日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "DateRange" + }, + "component": "tiny-daterange", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "format", + "type": "string", + "defaultValue": "yyyy-MM-dd", + "label": { + "text": { + "zh_CN": "日期格式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "value", + "type": "object", + "defaultValue": { + "begin": "", + "end": "" + }, + "label": { + "text": { + "zh_CN": "选中日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "min", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "最小日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "max", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "最大日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "panelAlign", + "type": "string", + "defaultValue": "right", + "label": { + "text": { + "zh_CN": "对齐方向" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "onChange" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onChange(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Form" + }, + "component": "tiny-form", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "title", + "type": "string", + "label": { + "text": { + "zh_CN": "title" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Image" + }, + "component": "tiny-image", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "src", + "type": "string", + "label": { + "text": { + "zh_CN": "src" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Table" + }, + "component": "tiny-table", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "columns", + "type": "array", + "defaultValue": [ + { + "title": { + "type": "i18n", + "zh_CN": "序号", + "en_US": "serial number", + "key": "" + }, + "sorter": true, + "dataKey": "testNo", + "width": "150px" + }, + { + "title": { + "type": "i18n", + "zh_CN": "详情", + "en_US": "detail", + "key": "" + }, + "sorter": true, + "dataKey": "testData" + } + ], + "label": { + "text": { + "zh_CN": "列配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "showToolbar", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否显示列显示隐藏配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "showBottom", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "翻页是否显示在屏幕最底部" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "contentMaxHeight", + "type": "string", + "defaultValue": "auto", + "label": { + "text": { + "zh_CN": "表格内容区域最大高度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tableData", + "type": "object", + "defaultValue": { + "data": [ + { + "testNo": "1", + "testData": "测试数据1" + }, + { + "testNo": "2", + "testData": "测试数据2" + } + ], + "state": { + "searched": true, + "sorted": true, + "paginated": true + } + }, + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "remoteTableData", + "type": "object", + "defaultValue": { + "options": { + "method": "GET", + "url": "http://exapmle.com/crm-list.json", + "params": [ + { + "name": "pageNo", + "value": "1" + }, + { + "name": "pageSize", + "value": "10" + } + ], + "isSync": true + } + }, + "label": { + "text": { + "zh_CN": "远程数据源" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "fit", + "type": "jsstring", + "defaultValue": "function fit(response, setState) { return response; }", + "label": { + "text": { + "zh_CN": "远程数据源fit方法" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "didFetch", + "type": "jsstring", + "defaultValue": "function didFetch(response, setState) { return response; }", + "label": { + "text": { + "zh_CN": "远程数据源didFetch方法" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "pagination", + "type": "object", + "defaultValue": { + "currentPage": 1, + "pageSize": { + "options": [10, 20, 50, 100], + "size": 10 + }, + "totalNumber": 2 + }, + "label": { + "text": { + "zh_CN": "翻页配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "storageId", + "type": "string", + "label": { + "text": { + "zh_CN": "持久化Id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "ref", + "type": "string", + "label": { + "text": { + "zh_CN": "表格引用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "storageConfig", + "type": "object", + "defaultValue": { + "colsWidth": true, + "headerFilter": false, + "columnsDisplay": true + }, + "label": { + "text": { + "zh_CN": "持久化配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onStateChange": { + "label": { + "zh_CN": "onStateChange" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onStateChange(e) {}" + }, + "onPageToDetail": { + "label": { + "zh_CN": "onPageToDetail" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onPageToDetail(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "TableFilter" + }, + "component": "tiny-tablefilter", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "showSlide", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否显示展开收起" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "slidePosition", + "type": "number", + "defaultValue": 4, + "label": { + "text": { + "zh_CN": "展开收起位置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "placeholder", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "支持的模糊搜索条件:商务编号,项目名称,客户名称,客户账号,伙伴名称,伙伴账号", + "key": "" + }, + "label": { + "text": { + "zh_CN": "搜索框placeholder" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tipStr", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "支持的模糊搜索条件:商务编号,项目名称,客户名称,客户账号,伙伴名称,伙伴账号", + "key": "" + }, + "label": { + "text": { + "zh_CN": "搜索框提示文案" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "options", + "type": "array", + "defaultValue": [ + { + "key": "status", + "title": { + "type": "i18n", + "zh_CN": "状态", + "key": "" + }, + "multiple": true, + "values": [ + { + "text": { + "type": "i18n", + "zh_CN": "全部", + "key": "" + }, + "value": "all" + }, + { + "text": { + "type": "i18n", + "zh_CN": "草稿", + "key": "" + }, + "value": "draft" + }, + { + "text": { + "type": "i18n", + "zh_CN": "审批中", + "key": "" + }, + "value": "pending" + }, + { + "text": { + "type": "i18n", + "zh_CN": "已通过", + "key": "" + }, + "value": "approved" + } + ] + } + ], + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onSelect": { + "label": { + "zh_CN": "onSelect" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onSelect(e) {}" + }, + "onSearch": { + "label": { + "zh_CN": "onSearch" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onSearch(e) {}" + }, + "onRefresh": { + "label": { + "zh_CN": "onRefresh" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onRefresh(e) {}" + }, + "onToggle": { + "label": { + "zh_CN": "onToggle" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onToggle(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + }, + { + "icon": "", + "name": { + "zh_CN": "Formfield" + }, + "component": "tiny-formfield", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "title", + "type": "string", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "showLine", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否显示间隔" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "isEdit", + "type": "boolean", + "defaultValue": false, + "label": { + "text": { + "zh_CN": "编辑状态" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "colsNumber", + "type": "string", + "defaultValue": "2", + "label": { + "text": { + "zh_CN": "列数" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "labelWidth", + "type": "string", + "defaultValue": "120px", + "label": { + "text": { + "zh_CN": "label的宽度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "colsWidth", + "type": "array", + "defaultValue": ["50%", "50%"], + "label": { + "text": { + "zh_CN": "列宽" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "colsGap", + "type": "array", + "defaultValue": ["50px"], + "label": { + "text": { + "zh_CN": "列间距" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "options", + "type": "array", + "defaultValue": [ + { + "label": "项目名称", + "value": "ghx-123-变更", + "editConfig": { + "type": "text", + "disabled": true + } + }, + { + "label": "合同模板", + "value": "线下客户模板", + "editConfig": { + "type": "select", + "options": [ + { + "label": "线上华为模板(预付费)", + "value": "线上华为模板(预付费)" + }, + { + "label": "线下客户模板", + "value": "线下客户模板" + }, + { + "label": "线上华为模板(后付费)", + "value": "线上华为模板(后付费)" + } + ], + "placeholder": "请选择合同模板" + } + } + ], + "label": { + "text": { + "zh_CN": "表单数据" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onStateChange": { + "label": { + "zh_CN": "onStateChange" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onStateChange(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } + } + ] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/accordion.json b/packages/settings/design/src/assets/materials/ng-components/accordion.json new file mode 100644 index 0000000..ede614e --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/accordion.json @@ -0,0 +1,98 @@ +{ + "icon": "", + "name": { + "zh_CN": "Accordion" + }, + "component": "tiny-accordion", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "title", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "默认标题", + "key": "" + }, + "label": { + "text": { + "zh_CN": "标题名称" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "open", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否默认展开" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/alert.json b/packages/settings/design/src/assets/materials/ng-components/alert.json new file mode 100644 index 0000000..abfaee3 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/alert.json @@ -0,0 +1,96 @@ +{ + "icon": "", + "name": { + "zh_CN": "Alert" + }, + "component": "tiny-alert", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "type", + "type": "string", + "defaultValue": "prompt", + "label": { + "text": {} + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "提示文本", + "key": "" + }, + "label": { + "text": { + "zh_CN": "提示文本" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/button.json b/packages/settings/design/src/assets/materials/ng-components/button.json new file mode 100644 index 0000000..c54df73 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/button.json @@ -0,0 +1,138 @@ +{ + "icon": "", + "name": { + "zh_CN": "Button" + }, + "component": "tiny-button", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "text", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "按钮文案", + "en_US": "Tiny Button", + "key": "" + }, + "label": { + "text": { + "zh_CN": "按钮文字" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "color", + "type": "select", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "按钮颜色" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "select", + "props": { + "options": ["", "danger", "primary"] + } + } + }, + { + "property": "size", + "type": "select", + "defaultValue": "large", + "label": { + "text": { + "zh_CN": "大小" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "select", + "props": { + "options": ["large", "middle", "small", "xs"] + } + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "onClick" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/checkbox.json b/packages/settings/design/src/assets/materials/ng-components/checkbox.json new file mode 100644 index 0000000..2bc40b7 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/checkbox.json @@ -0,0 +1,155 @@ +{ + "icon": "", + "name": { + "zh_CN": "Checkbox" + }, + "component": "tiny-checkbox", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "label", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "标签", + "en_US": "Label", + "key": "" + }, + "label": { + "text": { + "zh_CN": "label" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "checked", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否选中" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/container.json b/packages/settings/design/src/assets/materials/ng-components/container.json new file mode 100644 index 0000000..ccfcdda --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/container.json @@ -0,0 +1,108 @@ +{ + "icon": "", + "name": { + "zh_CN": "Container" + }, + "component": "tiny-container", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "style", + "type": "string", + "defaultValue": "margin: 10px;", + "label": { + "text": { + "zh_CN": "样式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "样式类" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onClick": { + "label": { + "zh_CN": "onClick" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onClick(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/date.json b/packages/settings/design/src/assets/materials/ng-components/date.json new file mode 100644 index 0000000..a0cc374 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/date.json @@ -0,0 +1,187 @@ +{ + "icon": "", + "name": { + "zh_CN": "Date" + }, + "component": "tiny-date", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "format", + "type": "string", + "label": { + "text": { + "zh_CN": "日期格式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "value", + "type": "string", + "label": { + "text": { + "zh_CN": "选中日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "min", + "type": "string", + "label": { + "text": { + "zh_CN": "最小日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "max", + "type": "string", + "label": { + "text": { + "zh_CN": "最大日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/daterange.json b/packages/settings/design/src/assets/materials/ng-components/daterange.json new file mode 100644 index 0000000..8a9b517 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/daterange.json @@ -0,0 +1,172 @@ +{ + "icon": "", + "name": { + "zh_CN": "DateRange" + }, + "component": "tiny-daterange", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "format", + "type": "string", + "defaultValue": "yyyy-MM-dd", + "label": { + "text": { + "zh_CN": "日期格式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "value", + "type": "object", + "defaultValue": { + "begin": "", + "end": "" + }, + "label": { + "text": { + "zh_CN": "选中日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "min", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "最小日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "max", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "最大日期" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "panelAlign", + "type": "string", + "defaultValue": "right", + "label": { + "text": { + "zh_CN": "对齐方向" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onChange": { + "label": { + "zh_CN": "onChange" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onChange(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/form.json b/packages/settings/design/src/assets/materials/ng-components/form.json new file mode 100644 index 0000000..8473e46 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/form.json @@ -0,0 +1,111 @@ +{ + "icon": "", + "name": { + "zh_CN": "Form" + }, + "component": "tiny-form", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "title", + "type": "string", + "label": { + "text": { + "zh_CN": "title" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/formfield.json b/packages/settings/design/src/assets/materials/ng-components/formfield.json new file mode 100644 index 0000000..8b09ef4 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/formfield.json @@ -0,0 +1,259 @@ +{ + "icon": "", + "name": { + "zh_CN": "Formfield" + }, + "component": "tiny-formfield", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "title", + "type": "string", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "showLine", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否显示间隔" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "isEdit", + "type": "boolean", + "defaultValue": false, + "label": { + "text": { + "zh_CN": "编辑状态" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "colsNumber", + "type": "string", + "defaultValue": "2", + "label": { + "text": { + "zh_CN": "列数" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "labelWidth", + "type": "string", + "defaultValue": "120px", + "label": { + "text": { + "zh_CN": "label的宽度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "colsWidth", + "type": "array", + "defaultValue": ["50%", "50%"], + "label": { + "text": { + "zh_CN": "列宽" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "colsGap", + "type": "array", + "defaultValue": ["50px"], + "label": { + "text": { + "zh_CN": "列间距" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "options", + "type": "array", + "defaultValue": [ + { + "label": "项目名称", + "value": "ghx-123-变更", + "editConfig": { + "type": "text", + "disabled": true + } + }, + { + "label": "合同模板", + "value": "线下客户模板", + "editConfig": { + "type": "select", + "options": [ + { + "label": "线上华为模板(预付费)", + "value": "线上华为模板(预付费)" + }, + { + "label": "线下客户模板", + "value": "线下客户模板" + }, + { + "label": "线上华为模板(后付费)", + "value": "线上华为模板(后付费)" + } + ], + "placeholder": "请选择合同模板" + } + } + ], + "label": { + "text": { + "zh_CN": "表单数据" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onStateChange": { + "label": { + "zh_CN": "onStateChange" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onStateChange(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/halfmodal.json b/packages/settings/design/src/assets/materials/ng-components/halfmodal.json new file mode 100644 index 0000000..e755691 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/halfmodal.json @@ -0,0 +1,112 @@ +{ + "icon": "", + "name": { + "zh_CN": "HalfModal" + }, + "component": "tiny-halfmodal", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "width", + "type": "string", + "defaultValue": "80%", + "label": { + "text": { + "zh_CN": "宽度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "style", + "type": "string", + "label": { + "text": { + "zh_CN": "样式" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "样式类" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/image.json b/packages/settings/design/src/assets/materials/ng-components/image.json new file mode 100644 index 0000000..81e1627 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/image.json @@ -0,0 +1,111 @@ +{ + "icon": "", + "name": { + "zh_CN": "Image" + }, + "component": "tiny-image", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "src", + "type": "string", + "label": { + "text": { + "zh_CN": "src" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/index.js b/packages/settings/design/src/assets/materials/ng-components/index.js new file mode 100644 index 0000000..acb5090 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/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 files = import.meta.globEager('./*.json') +const modules = {} + +for (const key in files) { + if (Object.prototype.hasOwnProperty.call(files, key)) { + modules[key.replace(/(\.\/|\.json)/g, '')] = files[key].default + } +} + +export default modules diff --git a/packages/settings/design/src/assets/materials/ng-components/input.json b/packages/settings/design/src/assets/materials/ng-components/input.json new file mode 100644 index 0000000..ca4d95e --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/input.json @@ -0,0 +1,98 @@ +{ + "icon": "", + "name": { + "zh_CN": "Input" + }, + "component": "tiny-input", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "value", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定值" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "placeholder", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "占位文本", + "en_US": "placeholder", + "key": "" + }, + "label": { + "text": { + "zh_CN": "输入框占位文本" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/radio.json b/packages/settings/design/src/assets/materials/ng-components/radio.json new file mode 100644 index 0000000..0732248 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/radio.json @@ -0,0 +1,102 @@ +{ + "icon": "", + "name": { + "zh_CN": "Radio" + }, + "component": "tiny-radio", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "options", + "type": "array", + "defaultValue": [ + { + "label": { + "type": "i18n", + "zh_CN": "蛋糕", + "en_US": "cake", + "key": "" + }, + "text": "cake" + }, + { + "label": { + "type": "i18n", + "zh_CN": "鸡蛋", + "en_US": "egg", + "key": "" + }, + "text": "egg" + }, + { + "label": { + "type": "i18n", + "zh_CN": "牛奶", + "en_US": "milk", + "key": "" + }, + "text": "milk" + } + ], + "label": { + "text": { + "zh_CN": "选项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/select.json b/packages/settings/design/src/assets/materials/ng-components/select.json new file mode 100644 index 0000000..33800d2 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/select.json @@ -0,0 +1,126 @@ +{ + "icon": "", + "name": { + "zh_CN": "Select" + }, + "component": "tiny-select", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "items", + "type": "array", + "defaultValue": [ + { + "label": { + "type": "i18n", + "zh_CN": "黄金糕", + "key": "" + }, + "text": "cake" + }, + { + "label": { + "type": "i18n", + "zh_CN": "双皮奶", + "key": "" + }, + "text": "milk" + }, + { + "label": { + "type": "i18n", + "zh_CN": "鸡蛋", + "key": "" + }, + "text": "egg" + } + ], + "label": { + "text": { + "zh_CN": "选项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "selected", + "type": "object", + "defaultValue": { + "label": { + "type": "i18n", + "zh_CN": "黄金糕", + "key": "" + }, + "text": "cake" + }, + "label": { + "text": { + "zh_CN": "选中项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/swiper.json b/packages/settings/design/src/assets/materials/ng-components/swiper.json new file mode 100644 index 0000000..44fb90c --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/swiper.json @@ -0,0 +1,141 @@ +{ + "icon": "", + "name": { + "zh_CN": "Swiper" + }, + "component": "tiny-swiper", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "items", + "type": "array", + "defaultValue": [ + { + "src": "img/rocket.jpg" + }, + { + "src": "" + } + ], + "label": { + "text": { + "zh_CN": "轮播项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "autoplay", + "type": "boolean", + "defaultValue": false, + "label": { + "text": { + "zh_CN": "是否自动播放" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "autoplaySpeed", + "type": "number", + "defaultValue": 3000, + "label": { + "text": { + "zh_CN": "自动播放速度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "heigth", + "type": "number", + "defaultValue": 200, + "label": { + "text": { + "zh_CN": "高度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/switch.json b/packages/settings/design/src/assets/materials/ng-components/switch.json new file mode 100644 index 0000000..c8e89ba --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/switch.json @@ -0,0 +1,130 @@ +{ + "icon": "", + "name": { + "zh_CN": "Switch" + }, + "component": "tiny-switch", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "switch-state", + "type": "boolean", + "label": { + "text": { + "zh_CN": "开关" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/tab.json b/packages/settings/design/src/assets/materials/ng-components/tab.json new file mode 100644 index 0000000..be32129 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/tab.json @@ -0,0 +1,104 @@ +{ + "icon": "", + "name": { + "zh_CN": "Tab" + }, + "component": "tiny-tab", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "样式类" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tabs", + "type": "array", + "defaultValue": [ + { + "title": "标签页一", + "active": true + }, + { + "title": "标签页二" + }, + { + "title": "标签页三" + } + ], + "label": { + "text": { + "zh_CN": "标签项" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/table.json b/packages/settings/design/src/assets/materials/ng-components/table.json new file mode 100644 index 0000000..250e70c --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/table.json @@ -0,0 +1,390 @@ +{ + "icon": "", + "name": { + "zh_CN": "Table" + }, + "component": "tiny-table", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "columns", + "type": "array", + "defaultValue": [ + { + "title": { + "type": "i18n", + "zh_CN": "序号", + "en_US": "serial number", + "key": "" + }, + "sorter": true, + "dataKey": "testNo", + "width": "150px" + }, + { + "title": { + "type": "i18n", + "zh_CN": "详情", + "en_US": "detail", + "key": "" + }, + "sorter": true, + "dataKey": "testData" + } + ], + "label": { + "text": { + "zh_CN": "列配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaCodeEditorList", + "props": { + "language": "json", + "buttonText": "编辑列配置", + "title": "编辑列配置" + } + } + }, + { + "property": "showToolbar", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否显示列显示隐藏配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "showBottom", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "翻页是否显示在屏幕最底部" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "contentMaxHeight", + "type": "string", + "defaultValue": "auto", + "label": { + "text": { + "zh_CN": "表格内容区域最大高度" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tableData", + "type": "object", + "defaultValue": { + "data": [ + { + "testNo": "1", + "testData": "测试数据1" + }, + { + "testNo": "2", + "testData": "测试数据2" + } + ], + "state": { + "searched": true, + "sorted": true, + "paginated": true + } + }, + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "remoteTableData", + "type": "object", + "defaultValue": { + "options": { + "method": "GET", + "url": "http://exapmle.com/crm-list.json", + "params": [ + { + "name": "pageNo", + "value": "1" + }, + { + "name": "pageSize", + "value": "10" + } + ], + "isSync": true + } + }, + "label": { + "text": { + "zh_CN": "远程数据源" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "fit", + "type": "jsstring", + "defaultValue": "function fit(response, setState) { return response; }", + "label": { + "text": { + "zh_CN": "远程数据源fit方法" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "didFetch", + "type": "jsstring", + "defaultValue": "function didFetch(response, setState) { return response; }", + "label": { + "text": { + "zh_CN": "远程数据源didFetch方法" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "pagination", + "type": "object", + "defaultValue": { + "currentPage": 1, + "pageSize": { + "options": [10, 20, 50, 100], + "size": 10 + }, + "totalNumber": 2 + }, + "label": { + "text": { + "zh_CN": "翻页配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "storageId", + "type": "string", + "label": { + "text": { + "zh_CN": "持久化Id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "ref", + "type": "string", + "label": { + "text": { + "zh_CN": "表格引用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "storageConfig", + "type": "object", + "defaultValue": { + "colsWidth": true, + "headerFilter": false, + "columnsDisplay": true + }, + "label": { + "text": { + "zh_CN": "持久化配置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onStateChange": { + "label": { + "zh_CN": "onStateChange" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onStateChange(e) {}" + }, + "onPageToDetail": { + "label": { + "zh_CN": "onPageToDetail" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onPageToDetail(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/tablefilter.json b/packages/settings/design/src/assets/materials/ng-components/tablefilter.json new file mode 100644 index 0000000..cbe0a03 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/tablefilter.json @@ -0,0 +1,263 @@ +{ + "icon": "", + "name": { + "zh_CN": "TableFilter" + }, + "component": "tiny-tablefilter", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "showSlide", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否显示展开收起" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "slidePosition", + "type": "number", + "defaultValue": 4, + "label": { + "text": { + "zh_CN": "展开收起位置" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "placeholder", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "支持的模糊搜索条件:商务编号,项目名称,客户名称,客户账号,伙伴名称,伙伴账号", + "key": "" + }, + "label": { + "text": { + "zh_CN": "搜索框placeholder" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "tipStr", + "type": "object", + "defaultValue": { + "type": "i18n", + "zh_CN": "支持的模糊搜索条件:商务编号,项目名称,客户名称,客户账号,伙伴名称,伙伴账号", + "key": "" + }, + "label": { + "text": { + "zh_CN": "搜索框提示文案" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "options", + "type": "array", + "defaultValue": [ + { + "key": "status", + "title": { + "type": "i18n", + "zh_CN": "状态", + "key": "" + }, + "multiple": true, + "values": [ + { + "text": { + "type": "i18n", + "zh_CN": "全部", + "key": "" + }, + "value": "all" + }, + { + "text": { + "type": "i18n", + "zh_CN": "草稿", + "key": "" + }, + "value": "draft" + }, + { + "text": { + "type": "i18n", + "zh_CN": "审批中", + "key": "" + }, + "value": "pending" + }, + { + "text": { + "type": "i18n", + "zh_CN": "已通过", + "key": "" + }, + "value": "approved" + } + ] + } + ], + "label": { + "text": { + "zh_CN": "数据源" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + } + ] + } + ], + "events": { + "onSelect": { + "label": { + "zh_CN": "onSelect" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onSelect(e) {}" + }, + "onSearch": { + "label": { + "zh_CN": "onSearch" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onSearch(e) {}" + }, + "onRefresh": { + "label": { + "zh_CN": "onRefresh" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onRefresh(e) {}" + }, + "onToggle": { + "label": { + "zh_CN": "onToggle" + }, + "description": { + "zh_CN": "详细的描述文字,会在鼠标放入?时显示" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "function onToggle(e) {}" + } + }, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/assets/materials/ng-components/tag.json b/packages/settings/design/src/assets/materials/ng-components/tag.json new file mode 100644 index 0000000..9c1b760 --- /dev/null +++ b/packages/settings/design/src/assets/materials/ng-components/tag.json @@ -0,0 +1,130 @@ +{ + "icon": "", + "name": { + "zh_CN": "Tag" + }, + "component": "tiny-tag", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "condition", + "type": "boolean", + "defaultValue": true, + "label": { + "text": { + "zh_CN": "是否渲染" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + }, + { + "property": "id", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定id" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "class", + "type": "string", + "label": { + "text": { + "zh_CN": "绑定class" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "value", + "type": "string", + "label": { + "text": { + "zh_CN": "tag" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "disabled", + "type": "boolean", + "label": { + "text": { + "zh_CN": "是否禁用" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaSwitch", + "props": {} + } + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": [] + }, + "contentMenu": { + "actions": [] + } + } +} diff --git a/packages/settings/design/src/components/ArrayConfigItemForm.vue b/packages/settings/design/src/components/ArrayConfigItemForm.vue new file mode 100644 index 0000000..ecb31eb --- /dev/null +++ b/packages/settings/design/src/components/ArrayConfigItemForm.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/packages/settings/design/src/components/ComponentList.vue b/packages/settings/design/src/components/ComponentList.vue new file mode 100644 index 0000000..2b596a1 --- /dev/null +++ b/packages/settings/design/src/components/ComponentList.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/packages/settings/design/src/components/PropertyCanvas.vue b/packages/settings/design/src/components/PropertyCanvas.vue new file mode 100644 index 0000000..0a5b95f --- /dev/null +++ b/packages/settings/design/src/components/PropertyCanvas.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/packages/settings/design/src/components/PropertyList.vue b/packages/settings/design/src/components/PropertyList.vue new file mode 100644 index 0000000..2f7e404 --- /dev/null +++ b/packages/settings/design/src/components/PropertyList.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/packages/settings/design/src/components/SettingPanel.vue b/packages/settings/design/src/components/SettingPanel.vue new file mode 100644 index 0000000..7a3a1fc --- /dev/null +++ b/packages/settings/design/src/components/SettingPanel.vue @@ -0,0 +1,391 @@ + + + + + diff --git a/packages/settings/design/src/components/SourceEditor.vue b/packages/settings/design/src/components/SourceEditor.vue new file mode 100644 index 0000000..2dcb5f6 --- /dev/null +++ b/packages/settings/design/src/components/SourceEditor.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/packages/settings/design/src/components/widgets/index.js b/packages/settings/design/src/components/widgets/index.js new file mode 100644 index 0000000..10c4612 --- /dev/null +++ b/packages/settings/design/src/components/widgets/index.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 { MetaComponents } from '@opentiny/tiny-engine-common' + +const widgets = {} +const widgetNames = [] + +Object.keys(MetaComponents).forEach((name) => { + if (/meta/i.test(name)) { + widgets[name] = MetaComponents[name] + widgetNames.push({ label: name, value: name }) + } +}) + +export default widgets + +export { widgetNames } diff --git a/packages/settings/design/src/convertToSchema.js b/packages/settings/design/src/convertToSchema.js new file mode 100644 index 0000000..90d75de --- /dev/null +++ b/packages/settings/design/src/convertToSchema.js @@ -0,0 +1,103 @@ +/** +* 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 fs = require('fs-extra') +const path = require('path') + +const componentsName = 'carousel-item' +const propertiePath = path.join(__dirname, `./properties/${componentsName}.json`) +const schemaPath = path.join(__dirname, `./schema/${componentsName}.json`) +const data = fs.readJSONSync(propertiePath) +const properties = data.schema.properties || {} + +const results = { + properties: [ + { + label: { + zh_CN: '基础信息' + }, + description: { + zh_CN: '基础信息' + }, + collapse: { + number: 6, + text: { + zh_CN: '显示更多' + } + }, + content: [] + } + ], + events: {} +} + +const widgetMap = { + object: 'MetaCodeEditor', + array: 'MetaCodeEditor', + enum: 'MetaSelect', + string: 'MetaInput', + number: 'MetaNumeric', + boolean: 'MetaSwitch' +} + +function getWidgetCompoent(value) { + let componentType = '' + if (Array.isArray(value.type)) { + if (value.type.includes('object') || value.type.includes('array')) { + componentType = 'object' + } else if (value.type.includes('sting')) { + componentType = 'string' + } else { + componentType = value.type[0] + } + } else { + componentType = value.type + } + + const props = {} + if (value.enum) { + props.options = [] + value.enum.forEach((item, index) => { + props.options.push({ + label: value.enumNames[index], + value: item + }) + }) + } + return { + component: widgetMap[componentType], + props: props + } +} +Object.entries(properties).forEach(([key, value]) => { + if (!key.includes('#')) { + const obj = { + property: key.replace(/\$/g, ''), + label: { + text: { + zh_CN: value.title || '' + } + }, + required: true, + readOnly: false, + disabled: false, + cols: 12, + widget: getWidgetCompoent(value), + description: { + zh_CN: '' + } + } + results.properties[0].content.push(obj) + } +}) + +fs.writeJSONSync(schemaPath, results) diff --git a/packages/settings/design/src/lib.js b/packages/settings/design/src/lib.js new file mode 100644 index 0000000..893a4df --- /dev/null +++ b/packages/settings/design/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 App from './App.vue' + +export default App diff --git a/packages/settings/design/src/main.js b/packages/settings/design/src/main.js new file mode 100644 index 0000000..87d253b --- /dev/null +++ b/packages/settings/design/src/main.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 { createApp } from 'vue' +import initSvgs from '@opentiny/tiny-engine-svgs' +import i18n from '@opentiny/tiny-engine-controller/js/i18n' +import 'virtual:svg-icons-register' +import App from './App.vue' + +const app = createApp(App) + +initSvgs(app) + +app.use(i18n).mount('#app') diff --git a/packages/settings/design/src/ng-properties/accordion.json b/packages/settings/design/src/ng-properties/accordion.json new file mode 100644 index 0000000..17d264a --- /dev/null +++ b/packages/settings/design/src/ng-properties/accordion.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "title": { + "title": "标题名称", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "默认标题", + "key": "" + } + }, + "open": { + "title": "是否默认展开", + "type": "boolean", + "default": true + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/alert.json b/packages/settings/design/src/ng-properties/alert.json new file mode 100644 index 0000000..fc8af9c --- /dev/null +++ b/packages/settings/design/src/ng-properties/alert.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "type": { + "tile": "标签类型", + "type": "string", + "default": "prompt" + }, + "label": { + "title": "提示文本", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "提示文本", + "key": "" + } + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/button.json b/packages/settings/design/src/ng-properties/button.json new file mode 100644 index 0000000..4b006c7 --- /dev/null +++ b/packages/settings/design/src/ng-properties/button.json @@ -0,0 +1,37 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "text": { + "title": "按钮文字", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "按钮文案", + "en_US": "Tiny Button", + "key": "" + } + }, + "color": { + "title": "按钮颜色", + "type": "select", + "default": ["", "danger", "primary"] + }, + "size": { + "title": "大小", + "type": "select", + "default": ["large", "middle", "small", "xs"] + }, + "onClick": { + "title": "点击事件", + "type": "function", + "default": "function onClick(e) {}" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/checkbox.json b/packages/settings/design/src/ng-properties/checkbox.json new file mode 100644 index 0000000..dcc0f1f --- /dev/null +++ b/packages/settings/design/src/ng-properties/checkbox.json @@ -0,0 +1,38 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "id": { + "title": "绑定id", + "type": "string" + }, + "class": { + "title": "绑定class", + "type": "string" + }, + "label": { + "title": "label", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "标签", + "en_US": "Label", + "key": "" + } + }, + "checked": { + "title": "是否选中", + "type": "boolean" + }, + "disabled": { + "title": "是否禁用", + "type": "boolean" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/container.json b/packages/settings/design/src/ng-properties/container.json new file mode 100644 index 0000000..619ae9e --- /dev/null +++ b/packages/settings/design/src/ng-properties/container.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "style": { + "title": "样式", + "type": "string", + "default": "margin: 10px;" + }, + "class": { + "title": "样式类", + "type": "string" + }, + "onClick": { + "title": "点击事件", + "type": "function", + "default": "function onClick(e) {}" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/date.json b/packages/settings/design/src/ng-properties/date.json new file mode 100644 index 0000000..8a3ddb2 --- /dev/null +++ b/packages/settings/design/src/ng-properties/date.json @@ -0,0 +1,40 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "id": { + "title": "绑定id", + "type": "string" + }, + "class": { + "title": "绑定class", + "type": "string" + }, + "format": { + "title": "日期格式", + "type": "string" + }, + "disabled": { + "title": "是否禁用", + "type": "boolean" + }, + "value": { + "title": "选中日期", + "type": "string" + }, + "min": { + "title": "最小日期", + "type": "string" + }, + "max": { + "title": "最大日期", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/daterange.json b/packages/settings/design/src/ng-properties/daterange.json new file mode 100644 index 0000000..f4f9a82 --- /dev/null +++ b/packages/settings/design/src/ng-properties/daterange.json @@ -0,0 +1,45 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "format": { + "title": "日期格式", + "type": "string", + "default": "yyyy-MM-dd" + }, + "value": { + "title": "选中日期", + "type": "object", + "default": { + "begin": "", + "end": "" + } + }, + "min": { + "title": "最小日期", + "type": "string", + "default": "" + }, + "max": { + "title": "最大日期", + "type": "string", + "default": "" + }, + "panelAlign": { + "title": "对齐方向", + "type": "string", + "default": "right" + }, + "onChange": { + "title": "onChange事件", + "type": "function", + "default": "function onChange(e) {}" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/form.json b/packages/settings/design/src/ng-properties/form.json new file mode 100644 index 0000000..9ed1ca4 --- /dev/null +++ b/packages/settings/design/src/ng-properties/form.json @@ -0,0 +1,24 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "id": { + "title": "绑定id", + "type": "string" + }, + "class": { + "title": "绑定class", + "type": "string" + }, + "title": { + "title": "title", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/formfield.json b/packages/settings/design/src/ng-properties/formfield.json new file mode 100644 index 0000000..997e754 --- /dev/null +++ b/packages/settings/design/src/ng-properties/formfield.json @@ -0,0 +1,87 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "title": { + "title": "标题", + "type": "string" + }, + "showLine": { + "title": "是否显示间隔", + "type": "boolean", + "default": true + }, + "isEdit": { + "title": "编辑状态", + "type": "boolean", + "default": false + }, + "colsNumber": { + "title": "列数", + "type": "string", + "default": "2" + }, + "labelWidth": { + "title": "label的宽度", + "type": "string", + "default": "120px" + }, + "colsWidth": { + "title": "列宽", + "type": "array", + "default": ["50%", "50%"] + }, + "colsGap": { + "title": "列间距", + "type": "array", + "default": ["50px"] + }, + "options": { + "title": "表单数据", + "type": "array", + "default": [ + { + "label": "项目名称", + "value": "ghx-123-变更", + "editConfig": { + "type": "text", + "disabled": true + } + }, + { + "label": "合同模板", + "value": "线下客户模板", + "editConfig": { + "type": "select", + "options": [ + { + "label": "线上华为模板(预付费)", + "value": "线上华为模板(预付费)" + }, + { + "label": "线下客户模板", + "value": "线下客户模板" + }, + { + "label": "线上华为模板(后付费)", + "value": "线上华为模板(后付费)" + } + ], + "placeholder": "请选择合同模板" + } + } + ] + }, + "onStateChange": { + "title": "值变化事件", + "type": "function", + "default": "function handleFormfieldOnStateChange(event) {}" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/halfmodal.json b/packages/settings/design/src/ng-properties/halfmodal.json new file mode 100644 index 0000000..44db40b --- /dev/null +++ b/packages/settings/design/src/ng-properties/halfmodal.json @@ -0,0 +1,25 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "width": { + "title": "宽度", + "type": "string", + "default": "80%" + }, + "style": { + "title": "样式", + "type": "string" + }, + "class": { + "title": "样式类", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/image.json b/packages/settings/design/src/ng-properties/image.json new file mode 100644 index 0000000..be9ef04 --- /dev/null +++ b/packages/settings/design/src/ng-properties/image.json @@ -0,0 +1,24 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "id": { + "title": "绑定id", + "type": "string" + }, + "class": { + "title": "绑定class", + "type": "string" + }, + "src": { + "title": "src", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/index.js b/packages/settings/design/src/ng-properties/index.js new file mode 100644 index 0000000..a05f187 --- /dev/null +++ b/packages/settings/design/src/ng-properties/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 files = import.meta.globEager('./*.json') +const modules = {} + +for (const key in files) { + if (Object.prototype.hasOwnProperty.call(files, key)) { + modules[key.replace(/(\.\/|\.json)/g, '')] = files[key].default.schema + } +} + +export default modules diff --git a/packages/settings/design/src/ng-properties/input.json b/packages/settings/design/src/ng-properties/input.json new file mode 100644 index 0000000..c33b0c2 --- /dev/null +++ b/packages/settings/design/src/ng-properties/input.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "value": { + "title": "绑定值", + "type": "string" + }, + "placeholder": { + "title": "输入框占位文本", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "占位文本", + "en_US": "placeholder", + "key": "" + } + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/radio.json b/packages/settings/design/src/ng-properties/radio.json new file mode 100644 index 0000000..28718c1 --- /dev/null +++ b/packages/settings/design/src/ng-properties/radio.json @@ -0,0 +1,55 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "options": { + "title": "选项", + "type": "array", + "default": [ + { + "label": { + "type": "i18n", + "zh_CN": "蛋糕", + "en_US": "cake", + "key": "" + }, + "text": "cake" + }, + { + "label": { + "type": "i18n", + "zh_CN": "鸡蛋", + "en_US": "egg", + "key": "" + }, + "text": "egg" + }, + { + "label": { + "type": "i18n", + "zh_CN": "牛奶", + "en_US": "milk", + "key": "" + }, + "text": "milk" + } + ] + } + }, + "selected": { + "title": "选中项", + "type": "string", + "default": "egg" + }, + "onChange": { + "title": "onChange", + "type": "function", + "default": "function onChange(){}" + } + } +} diff --git a/packages/settings/design/src/ng-properties/select.json b/packages/settings/design/src/ng-properties/select.json new file mode 100644 index 0000000..1732f80 --- /dev/null +++ b/packages/settings/design/src/ng-properties/select.json @@ -0,0 +1,54 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "items": { + "title": "选项", + "type": "array", + "default": [ + { + "label": { + "type": "i18n", + "zh_CN": "黄金糕", + "key": "" + }, + "text": "cake" + }, + { + "label": { + "type": "i18n", + "zh_CN": "双皮奶", + "key": "" + }, + "text": "milk" + }, + { + "label": { + "type": "i18n", + "zh_CN": "鸡蛋", + "key": "" + }, + "text": "egg" + } + ] + }, + "selected": { + "title": "选中项", + "type": "object", + "default": { + "label": { + "type": "i18n", + "zh_CN": "黄金糕", + "key": "" + }, + "text": "cake" + } + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/swiper.json b/packages/settings/design/src/ng-properties/swiper.json new file mode 100644 index 0000000..e0caa27 --- /dev/null +++ b/packages/settings/design/src/ng-properties/swiper.json @@ -0,0 +1,39 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "items": { + "title": "轮播项", + "type": "array", + "default": [ + { + "src": "img/rocket.jpg" + }, + { + "src": "" + } + ] + }, + "autoplay": { + "title": "是否自动播放", + "type": "boolean", + "default": false + }, + "autoplaySpeed": { + "title": "自动播放速度", + "type": "number", + "default": 3000 + }, + "heigth": { + "title": "高度", + "type": "number", + "default": 200 + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/switch.json b/packages/settings/design/src/ng-properties/switch.json new file mode 100644 index 0000000..3b09a9c --- /dev/null +++ b/packages/settings/design/src/ng-properties/switch.json @@ -0,0 +1,28 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "id": { + "title": "绑定id", + "type": "string" + }, + "class": { + "title": "绑定class", + "type": "string" + }, + "switch-state": { + "title": "开关", + "type": "boolean" + }, + "disabled": { + "title": "是否禁用", + "type": "boolean" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/tab.json b/packages/settings/design/src/ng-properties/tab.json new file mode 100644 index 0000000..e076607 --- /dev/null +++ b/packages/settings/design/src/ng-properties/tab.json @@ -0,0 +1,32 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "class": { + "title": "样式类", + "type": "string" + }, + "tabs": { + "title": "标签项", + "type": "array", + "default": [ + { + "title": "标签页一", + "active": true + }, + { + "title": "标签页二" + }, + { + "title": "标签页三" + } + ] + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/table.json b/packages/settings/design/src/ng-properties/table.json new file mode 100644 index 0000000..bab29ca --- /dev/null +++ b/packages/settings/design/src/ng-properties/table.json @@ -0,0 +1,153 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "columns": { + "title": "列配置", + "type": "array", + "default": [ + { + "title": { + "type": "i18n", + "zh_CN": "序号", + "en_US": "serial number", + "key": "" + }, + "sorter": true, + "dataKey": "testNo", + "width": "150px" + }, + { + "title": { + "type": "i18n", + "zh_CN": "详情", + "en_US": "detail", + "key": "" + }, + "sorter": true, + "dataKey": "testData" + } + ], + "items": { + "properties": { + "title": {}, + "sorter": {}, + "dataKey": {}, + "width": {} + } + } + }, + "showToolbar": { + "title": "是否显示列显示隐藏配置", + "type": "boolean", + "default": true + }, + "showBottom": { + "title": "翻页是否显示在屏幕最底部", + "type": "boolean", + "default": true + }, + "contentMaxHeight": { + "title": "表格内容区域最大高度", + "type": "string", + "default": "auto" + }, + "tableData": { + "title": "数据源", + "type": "object", + "default": { + "data": [ + { + "testNo": "1", + "testData": "测试数据1" + }, + { + "testNo": "2", + "testData": "测试数据2" + } + ], + "state": { + "searched": true, + "sorted": true, + "paginated": true + } + } + }, + "remoteTableData": { + "title": "远程数据源", + "type": "object", + "default": { + "options": { + "method": "GET", + "url": "http://exapmle.com/crm-list.json", + "params": [ + { + "name": "pageNo", + "value": "1" + }, + { + "name": "pageSize", + "value": "10" + } + ], + "isSync": true + } + } + }, + "fit": { + "title": "远程数据源fit方法", + "type": "jsstring", + "default": "function fit(response, setState) { return response; }" + }, + "didFetch": { + "title": "远程数据源didFetch方法", + "type": "jsstring", + "default": "function didFetch(response, setState) { return response; }" + }, + "pagination": { + "title": "翻页配置", + "type": "object", + "default": { + "currentPage": 1, + "pageSize": { + "options": [10, 20, 50, 100], + "size": 10 + }, + "totalNumber": 2 + } + }, + "storageId": { + "title": "持久化Id", + "type": "string" + }, + "ref": { + "title": "表格引用", + "type": "string" + }, + "storageConfig": { + "title": "持久化配置", + "type": "object", + "default": { + "colsWidth": true, + "headerFilter": false, + "columnsDisplay": true + } + }, + "onStateChange": { + "title": "表格状态变化事件", + "type": "function", + "default": "function handleOnStateChange(event) {}" + }, + "onPageToDetail": { + "title": "列表跳详情事件", + "type": "function", + "default": "function handleOnPageToDetail(row) {this.onPageToDetail && this.onPageToDetail.emit(row);}" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/tablefilter.json b/packages/settings/design/src/ng-properties/tablefilter.json new file mode 100644 index 0000000..54259b7 --- /dev/null +++ b/packages/settings/design/src/ng-properties/tablefilter.json @@ -0,0 +1,109 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "showSlide": { + "title": "是否显示展开收起", + "type": "boolean", + "default": true + }, + "slidePosition": { + "title": "展开收起位置", + "type": "number", + "default": 4 + }, + "placeholder": { + "title": "搜索框placeholder", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "支持的模糊搜索条件:商务编号,项目名称,客户名称,客户账号,伙伴名称,伙伴账号", + "key": "" + } + }, + "tipStr": { + "title": "搜索框提示文案", + "type": "object", + "default": { + "type": "i18n", + "zh_CN": "支持的模糊搜索条件:商务编号,项目名称,客户名称,客户账号,伙伴名称,伙伴账号", + "key": "" + } + }, + "options": { + "title": "数据源", + "type": "array", + "default": [ + { + "key": "status", + "title": { + "type": "i18n", + "zh_CN": "状态", + "key": "" + }, + "multiple": true, + "values": [ + { + "text": { + "type": "i18n", + "zh_CN": "全部", + "key": "" + }, + "value": "all" + }, + { + "text": { + "type": "i18n", + "zh_CN": "草稿", + "key": "" + }, + "value": "draft" + }, + { + "text": { + "type": "i18n", + "zh_CN": "审批中", + "key": "" + }, + "value": "pending" + }, + { + "text": { + "type": "i18n", + "zh_CN": "已通过", + "key": "" + }, + "value": "approved" + } + ] + } + ] + }, + "onSelect": { + "title": "选择事件", + "type": "function", + "default": "function handleOnSelect(selected) {}" + }, + "onSearch": { + "title": "搜索事件", + "type": "function", + "default": "function handleOnSearch(keyword) {}" + }, + "onRefresh": { + "title": "刷新事件", + "type": "function", + "default": "function handleOnRefresh($event) {}" + }, + "onToggle": { + "title": "过滤面板Toggle事件", + "type": "function", + "default": "function handleOnToggle($event) {}" + } + } + } +} diff --git a/packages/settings/design/src/ng-properties/tag.json b/packages/settings/design/src/ng-properties/tag.json new file mode 100644 index 0000000..f3bdf67 --- /dev/null +++ b/packages/settings/design/src/ng-properties/tag.json @@ -0,0 +1,28 @@ +{ + "schema": { + "type": "object", + "properties": { + "condition": { + "title": "是否渲染", + "type": "boolean", + "default": true + }, + "id": { + "title": "绑定id", + "type": "string" + }, + "class": { + "title": "绑定class", + "type": "string" + }, + "value": { + "title": "tag", + "type": "string" + }, + "disabled": { + "title": "是否禁用", + "type": "boolean" + } + } + } +} diff --git a/packages/settings/design/src/properties/alert.json b/packages/settings/design/src/properties/alert.json new file mode 100644 index 0000000..64e5d43 --- /dev/null +++ b/packages/settings/design/src/properties/alert.json @@ -0,0 +1,68 @@ +{ + "schema": { + "type": "object", + "properties": { + "center": { + "title": "文字是否居中", + "type": "boolean", + "default": false + }, + "closable": { + "title": "设置警告是否可以关闭", + "type": "boolean", + "default": true + }, + "close-text": { + "title": "关闭按钮自定义文本", + "type": "string", + "default": "" + }, + "description": { + "title": "设置警告的提示内容", + "type": "string", + "default": "" + }, + "$$icon": { + "title": "设置警告的图标,默认会根据 type 值自动使用对应图标", + "type": ["string", "object"], + "default": "" + }, + "show-icon": { + "title": "是否显示图标", + "type": "boolean", + "default": true + }, + "size": { + "title": "设置警告的大小", + "type": "string", + "enum": ["normal", "large"], + "enumNames": ["正常尺寸", "较大尺寸"], + "default": "normal" + }, + "title": { + "title": "设置警告的标题,在 size 为 large 时有效,默认根据 type 自动设置", + "type": "string", + "default": "" + }, + "type": { + "title": "设置警告的类型", + "type": "string", + "enum": ["success", "warning", "info", "error"], + "enumNames": ["成功", "警告", "信息", "错误"], + "default": "info" + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#description": { + "title": "提示内容插槽", + "type": "string" + }, + "#title": { + "title": "标题的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/amount.json b/packages/settings/design/src/properties/amount.json new file mode 100644 index 0000000..30f85c1 --- /dev/null +++ b/packages/settings/design/src/properties/amount.json @@ -0,0 +1,85 @@ +{ + "schema": { + "type": "object", + "properties": { + "currency": { + "title": "指定币种", + "type": "string", + "default": "CNY" + }, + "date": { + "title": "设置弹出框内显示日期框", + "type": "string", + "format": "date" + }, + "digits": { + "title": "设置小数点位数", + "type": "number", + "default": 2 + }, + "disabled": { + "title": "设置是否禁用", + "type": "boolean", + "default": false + }, + "fields": { + "title": "自定义金额组件数据映射,在没有使用框架服务时必填", + "type": "object", + "properties": { + "textField": { + "title": "自定义金额组件的请求服务接口中,币种编码的字段名", + "type": "string", + "default": "" + }, + "valueField": { + "title": "自定义金额组件的请求服务接口中,币种符号的字段名", + "type": "string", + "default": "" + } + } + }, + "max-len": { + "title": "整数位最大长度", + "type": "number", + "default": 15 + }, + "negative": { + "title": "是否可为负数", + "type": "boolean", + "default": true + }, + "placeholder": { + "title": "当数据为空时的占位符", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "为 popper 添加自定义样式类。值为该样式类的类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "rounding": { + "title": "金额是否四舍五入", + "type": "boolean", + "default": true + }, + "size": { + "title": "设置组件大小", + "type": "string", + "default": "", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"] + }, + "value": { + "title": "设置金额组件的值", + "type": ["string", "number"], + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/area.json b/packages/settings/design/src/properties/area.json new file mode 100644 index 0000000..367df3c --- /dev/null +++ b/packages/settings/design/src/properties/area.json @@ -0,0 +1,55 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "禁用输入框", + "type": "boolean", + "default": false + }, + "placeholder": { + "title": "当数据为空时的占位符", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "props": { + "title": "自定义服务时,设置数据的映射字段", + "type": "object", + "properties": { + "label": { + "title": "显示文本对应的字段", + "type": "string", + "default": "name_cn" + }, + "value": { + "title": "值对应的字段", + "type": "string", + "default": "org_id" + } + } + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "$$value": { + "title": "设置片区默认值", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/autocomplete.json b/packages/settings/design/src/properties/autocomplete.json new file mode 100644 index 0000000..0c80a98 --- /dev/null +++ b/packages/settings/design/src/properties/autocomplete.json @@ -0,0 +1,117 @@ +{ + "schema": { + "type": "object", + "properties": { + "clearable": { + "title": "是否可清空", + "type": "boolean", + "default": false + }, + "debounce": { + "title": "获取输入建议的去抖延时", + "type": "number", + "default": 300 + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "hide-loading": { + "title": "是否隐藏远程加载时的加载图标", + "type": "boolean", + "default": false + }, + "highlight-first-item": { + "title": "是否默认突出显示远程搜索建议中的第一项", + "type": "boolean", + "default": false + }, + "label": { + "title": "输入框关联的label文字", + "type": "string", + "default": "" + }, + "name": { + "title": "原生属性name", + "type": "string", + "default": "" + }, + "placeholder": { + "title": "输入框占位文本", + "type": "string", + "default": "" + }, + "$$placement": { + "title": "菜单弹出位置", + "type": "string", + "enum": ["top", "top-start", "top-end", "bottom", "bottom-start", "bottom-end"], + "enumNames": ["顶部", "顶部左侧", "顶部右侧", "底部", "底部左侧", "底部右侧"], + "default": "bottom-start" + }, + "popper-append-to-body": { + "title": "是否将下拉列表插入至 body 元素。在下拉列表的定位出现问题时,可将该属性设置为 false", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "Autocomplete 下拉列表的类名", + "type": "string", + "default": "" + }, + "$$prefix-icon": { + "title": "输入框头部图标", + "type": ["string", "object"], + "default": "" + }, + "select-when-unmatched": { + "title": "在输入没有任何匹配建议的情况下,按下回车是否触发 select 事件", + "type": "boolean", + "default": false + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "$$suffix-icon": { + "title": "输入框尾部图标", + "type": ["string", "object"], + "default": "" + }, + "trigger-on-focus": { + "title": "是否在输入框 focus 时显示建议列表", + "type": "boolean", + "default": true + }, + "value": { + "title": "输入绑定值。必填", + "type": "string", + "default": "" + }, + "value-key": { + "title": "输入建议对象中用于显示的键名", + "type": "string", + "default": "value" + }, + "#append": { + "title": "输入框后置内容插槽", + "type": "string" + }, + "#prefix": { + "title": "输入框头部内容插槽", + "type": "string" + }, + "#prepend": { + "title": "输入框前置内容插槽", + "type": "string" + }, + "#suffix": { + "title": "输入框尾部内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/badge.json b/packages/settings/design/src/properties/badge.json new file mode 100644 index 0000000..5a6a50c --- /dev/null +++ b/packages/settings/design/src/properties/badge.json @@ -0,0 +1,52 @@ +{ + "schema": { + "type": "object", + "properties": { + "hidden": { + "title": "是否隐藏 badge", + "type": "boolean", + "default": false + }, + "href": { + "title": "指定跳转的目标页面地址", + "type": "string", + "default": "" + }, + "is-dot": { + "title": "设置是否有默认的新消息提示", + "type": "boolean", + "default": false + }, + "max": { + "title": "最大值,超过最大值会显示 '{max}+',要求 value 是 Number 类型", + "type": "number" + }, + "target": { + "title": "指定点击徽章 Dom 节点时链接到目标页面的跳转方式,仅在 href 属性存在时使用", + "type": "string", + "enum": ["_self", "_blank"], + "enumNames": ["当前标签打开", "新建标签打开"] + }, + "type": { + "title": "类型", + "type": "string", + "enum": ["primary", "success", "warning", "danger", "info"], + "enumNames": ["主要", "成功", "警告", "危险", "信息"], + "default": "" + }, + "value": { + "title": "显示值", + "type": ["string", "number"], + "default": "" + }, + "#content": { + "title": "消息提示内容插槽", + "type": "string" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/breadcrumb-item.json b/packages/settings/design/src/properties/breadcrumb-item.json new file mode 100644 index 0000000..ff6191e --- /dev/null +++ b/packages/settings/design/src/properties/breadcrumb-item.json @@ -0,0 +1,21 @@ +{ + "schema": { + "type": "object", + "properties": { + "replace": { + "title": "在使用 to 进行路由跳转时,是否向 history 添加新记录", + "type": "boolean", + "default": false + }, + "to": { + "title": "路由跳转对象,同 vue-router 的 to", + "type": ["string", "object"], + "default": "" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/breadcrumb.json b/packages/settings/design/src/properties/breadcrumb.json new file mode 100644 index 0000000..22c4879 --- /dev/null +++ b/packages/settings/design/src/properties/breadcrumb.json @@ -0,0 +1,20 @@ +{ + "schema": { + "type": "object", + "properties": { + "separator": { + "title": "分隔符", + "type": "string", + "default": "/" + }, + "$$separator-icon": { + "title": "图标分隔符", + "type": "object" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/bulletin-board.json b/packages/settings/design/src/properties/bulletin-board.json new file mode 100644 index 0000000..01054b4 --- /dev/null +++ b/packages/settings/design/src/properties/bulletin-board.json @@ -0,0 +1,102 @@ +{ + "schema": { + "type": "object", + "properties": { + "active-name": { + "title": "设置默认激活的选项卡,从 1 开始计算。默认显示第1栏,可选'1' '2' '3'等", + "type": "string", + "default": "1" + }, + "data": { + "title": "tab-item 数据", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "text": { + "title": "文本内容", + "type": "string", + "default": "" + }, + "date": { + "title": "日期", + "type": "string", + "format": "date", + "default": "" + }, + "url": { + "title": "跳转地址", + "type": "string", + "default": "" + }, + "target": { + "title": "跳转方式", + "type": "string", + "enum": ["_self", "_blank"], + "enumNames": ["当前页面跳转", "另起一页跳转"], + "default": "_self" + } + } + } + } + }, + "$$icon": { + "title": "tab-item中第一条信息的字体图标", + "type": ["string", "object"], + "default": "" + }, + "more-link": { + "title": "更多按钮跳转地址,show-more 为true 的时候生效", + "type": "object", + "properties": { + "url": { + "title": "跳转地址", + "description": "跳转地址和跳转路由二选一,跳转地址优先级高", + "type": "string", + "default": "" + }, + "route": { + "title": "跳转路由", + "description": "跳转地址和跳转路由二选一,跳转地址优先级高", + "type": "string", + "default": "" + }, + "target": { + "title": "跳转方式", + "type": "string", + "enum": ["_self", "_blank"], + "enumNames": ["当前页面跳转", "另起一页跳转"], + "default": "_self" + }, + "text": { + "title": "链接文本", + "type": "string", + "default": "更多" + } + } + }, + "show-more": { + "title": "是否显示更多按钮,默认显示,需要与 更多按钮跳转地址 more-link 同时使用", + "type": "boolean", + "default": true + }, + "tab-title": { + "title": "自定义选项卡标题", + "type": "array", + "items": { + "title": "选项卡标题", + "type": "string" + }, + "minItems": 1 + }, + "title": { + "title": "公告牌的标题", + "type": "string", + "default": "" + } + }, + "required": ["data", "tab-title"] + } +} diff --git a/packages/settings/design/src/properties/button-group.json b/packages/settings/design/src/properties/button-group.json new file mode 100644 index 0000000..2a610c1 --- /dev/null +++ b/packages/settings/design/src/properties/button-group.json @@ -0,0 +1,62 @@ +{ + "schema": { + "type": "object", + "properties": { + "data": { + "title": "按钮组数据", + "type": "array", + "items": { + "type": "object", + "properties": { + "text": { + "title": "按钮显示文本", + "type": "string", + "default": "" + }, + "value": { + "title": "双向绑定时指定的值", + "type": "string", + "default": "" + } + } + } + }, + "disabled": { + "title": "设置按钮组是否被禁用", + "type": "boolean", + "default": false + }, + "plain": { + "title": "是否朴素按钮", + "type": "boolean", + "default": false + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "text-field": { + "title": "按钮显示文字的字段值", + "type": "string", + "default": "text" + }, + "value": { + "title": "默认选中按钮的值", + "type": ["string", "number"], + "default": "" + }, + "value-field": { + "title": "按钮值的字段值", + "type": "string", + "default": "value" + }, + "#default": { + "title": "按钮组内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/button.json b/packages/settings/design/src/properties/button.json new file mode 100644 index 0000000..8a3f01a --- /dev/null +++ b/packages/settings/design/src/properties/button.json @@ -0,0 +1,77 @@ +{ + "schema": { + "type": "object", + "properties": { + "autofocus": { + "title": "是否默认聚焦", + "type": "boolean", + "default": false + }, + "circle": { + "title": "是否圆形按钮", + "type": "boolean", + "default": false + }, + "disabled": { + "title": "设置按钮是否被禁用", + "type": "boolean", + "default": false + }, + "$$icon": { + "title": "svg 图片对象", + "type": ["string", "object"], + "default": "" + }, + "loading": { + "title": "是否加载中状态", + "type": "boolean", + "default": false + }, + "native-type": { + "title": "设置 button、image 两种按钮的表单类型", + "type": "string", + "enum": ["button", "submit", "reset"], + "enumNames": ["按钮", "提交", "重置"], + "default": "button" + }, + "plain": { + "title": "是否朴素按钮", + "type": "boolean", + "default": false + }, + "reset-time": { + "title": "设置按钮禁用时间,防止重复提交,单位毫秒", + "type": "number", + "default": 1000 + }, + "round": { + "title": "是否圆角按钮", + "type": "boolean", + "default": false + }, + "size": { + "title": "定义按钮尺寸", + "type": "string", + "enum": ["large", "medium", "small", "mini"], + "enumNames": ["较大尺寸", "中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "text": { + "title": "设置按钮显示的文本", + "type": "string", + "default": "" + }, + "type": { + "title": "类型", + "type": "string", + "enum": ["primary", "success", "warning", "danger", "info", "text"], + "enumNames": ["主要", "成功", "警告", "危险", "信息", "文字"], + "default": "" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/calendar.json b/packages/settings/design/src/properties/calendar.json new file mode 100644 index 0000000..7bb1bd4 --- /dev/null +++ b/packages/settings/design/src/properties/calendar.json @@ -0,0 +1,69 @@ +{ + "schema": { + "type": "object", + "properties": { + "events": { + "title": "事件列表", + "type": "array", + "items": { + "type": "object", + "properties": { + "time": { + "title": "指定需要展示事件的日期", + "type": "number" + }, + "title": { + "title": "指定事件标题", + "type": "string", + "default": "" + }, + "content": { + "title": "指定事件的具体内容", + "type": "string", + "default": "" + }, + "type": { + "title": "指定当鼠标悬停在事件标题上时,弹出的展示事件具体内容的提示框的主题", + "type": "string", + "enum": ["warning", "error", "info", "success"], + "enumNames": ["警告", "错误", "信息", "成功"], + "default": "" + } + } + } + }, + "mode": { + "title": "显示模式", + "type": "string", + "enum": ["month", "year"], + "enumNames": ["月", "年"], + "default": "month" + }, + "month": { + "title": "指定月份,默认当月", + "type": "number" + }, + "show-selected": { + "title": "显示选中的日期", + "type": "boolean", + "default": false + }, + "year": { + "title": "指定年份,默认今年", + "type": "number" + }, + "#day": { + "title": "日期单元格插槽", + "type": "string" + }, + "#month": { + "title": "月份单元格插槽", + "type": "string" + }, + "#tool": { + "title": "日历工具栏插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/carousel-item.json b/packages/settings/design/src/properties/carousel-item.json new file mode 100644 index 0000000..b794eca --- /dev/null +++ b/packages/settings/design/src/properties/carousel-item.json @@ -0,0 +1,21 @@ +{ + "schema": { + "type": "object", + "properties": { + "name": { + "title": "幻灯片的名字,可用作 setActiveItem 的参数", + "type": "string", + "default": "" + }, + "title": { + "title": "幻灯片的标题", + "type": "string", + "default": "" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/carousel.json b/packages/settings/design/src/properties/carousel.json new file mode 100644 index 0000000..7293214 --- /dev/null +++ b/packages/settings/design/src/properties/carousel.json @@ -0,0 +1,69 @@ +{ + "schema": { + "type": "object", + "properties": { + "arrow": { + "title": "切换箭头的显示时机", + "type": "string", + "enum": ["always", "hover", "never"], + "enumNames": ["总是显示", "鼠标悬停时显示", "从不显示"], + "default": "hover" + }, + "autoplay": { + "title": "是否自动切换", + "type": "boolean", + "default": false + }, + "height": { + "title": "走马灯的高度", + "type": "string", + "default": "" + }, + "indicator-position": { + "title": "指示器的位置", + "type": "string", + "enum": ["outside", "none"], + "enumNames": ["走马灯外部", "不显示"], + "default": "" + }, + "initial-index": { + "title": "初始状态激活的幻灯片的索引,从 0 开始 ", + "type": "number", + "default": 0 + }, + "interval": { + "title": "自动切换的时间间隔,单位为毫秒", + "type": "number", + "default": 3000 + }, + "loop": { + "title": "是否循环显示", + "type": "boolean", + "default": true + }, + "show-title": { + "title": "是否显示标题", + "type": "boolean", + "default": false + }, + "trigger": { + "title": "指示器的触发方式,默认为 hover", + "type": "string", + "enum": ["click", "hover"], + "enumNames": ["点击", "悬停"], + "default": "hover" + }, + "type": { + "title": "走马灯的类型", + "type": "string", + "enum": ["horizontal", "vertical", "card"], + "enumNames": ["水平", "垂直", "卡片"], + "default": "horizontal" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/cascader-panel.json b/packages/settings/design/src/properties/cascader-panel.json new file mode 100644 index 0000000..36fe2e8 --- /dev/null +++ b/packages/settings/design/src/properties/cascader-panel.json @@ -0,0 +1,121 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "border": { + "title": "是否显示边框", + "type": "boolean", + "default": true + }, + "$$options": { + "title": "可选项数据源,键名可通过 配置选项Props 属性配置", + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "title": "指定值选项 value 值", + "type": "string", + "default": "" + }, + "label": { + "title": "指定显示选项 label 值", + "type": "string", + "default": "" + }, + "$$children": { + "title": "指定子级选项", + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "title": "指定值选项 value 值", + "type": "string", + "default": "" + }, + "label": { + "title": "指定显示选项 label 值", + "type": "string", + "default": "" + }, + "children": { + "title": "指定子级选项", + "type": "array" + } + } + } + } + } + } + }, + "props": { + "type": "object", + "title": "配置选项", + "properties": { + "checkStrictly": { + "title": "是否严格的遵守父子节点不互相关联", + "type": "boolean", + "default": false + }, + "children": { + "title": "指定选项的子选项为选项对象的某个属性值", + "type": "string", + "default": "children" + }, + "disabled": { + "title": "指定选项的禁用为选项对象的某个属性值", + "type": "string", + "default": "disabled" + }, + "emitPath": { + "title": "在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false,则只返回该节点的值", + "type": "boolean", + "default": true + }, + "expandTrigger": { + "title": "次级菜单的展开方式", + "type": "string", + "enum": ["click", "hover"], + "enumNames": ["点击时触发", "滑过时触发"], + "default": "click" + }, + "label": { + "title": "指定选项标签为选项对象的某个属性值", + "type": "string", + "default": "label" + }, + "lazy": { + "title": "是否动态加载子节点,需与 lazyLoad 方法结合使用", + "type": "boolean", + "default": false + }, + "leaf": { + "title": "指定选项的叶子节点的标志位为选项对象的某个属性值", + "type": "string", + "default": "leaf" + }, + "multiple": { + "title": "是否多选", + "type": "boolean", + "default": false + }, + "value": { + "title": "指定选项的值为选项对象的某个属性值", + "type": "string", + "default": "value" + } + } + }, + "value": { + "title": "选中项绑定值", + "type": "string", + "default": "" + }, + "#default": { + "title": "自定义备选项的节点内容,参数为 { node, data },分别为当前节点的 Node 对象和数据,默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/cascader-props.json b/packages/settings/design/src/properties/cascader-props.json new file mode 100644 index 0000000..3e5b4c4 --- /dev/null +++ b/packages/settings/design/src/properties/cascader-props.json @@ -0,0 +1,59 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "checkStrictly": { + "title": "是否严格的遵守父子节点不互相关联", + "type": "boolean", + "default": false + }, + "children": { + "title": "指定选项的子选项为选项对象的某个属性值", + "type": "string", + "default": "children" + }, + "disabled": { + "title": "指定选项的禁用为选项对象的某个属性值", + "type": "string", + "default": "disabled" + }, + "emitPath": { + "title": "在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false,则只返回该节点的值", + "type": "boolean", + "default": true + }, + "expandTrigger": { + "title": "次级菜单的展开方式", + "type": "string", + "enum": ["click", "hover"], + "enumNames": ["点击时触发", "滑过时触发"], + "default": "click" + }, + "label": { + "title": "指定选项标签为选项对象的某个属性值", + "type": "string", + "default": "label" + }, + "lazy": { + "title": "是否动态加载子节点,需与 lazyLoad 方法结合使用", + "type": "boolean", + "default": false + }, + "leaf": { + "title": "指定选项的叶子节点的标志位为选项对象的某个属性值", + "type": "string", + "default": "leaf" + }, + "multiple": { + "title": "是否多选", + "type": "boolean", + "default": false + }, + "value": { + "title": "指定选项的值为选项对象的某个属性值", + "type": "string", + "default": "value" + } + } + } +} diff --git a/packages/settings/design/src/properties/cascader.json b/packages/settings/design/src/properties/cascader.json new file mode 100644 index 0000000..73f760e --- /dev/null +++ b/packages/settings/design/src/properties/cascader.json @@ -0,0 +1,173 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "clearable": { + "title": "是否支持清空选项", + "type": "boolean", + "default": false + }, + "collapse-tags": { + "title": "多选模式下是否折叠Tag", + "type": "boolean", + "default": false + }, + "debounce": { + "title": "搜索关键词输入的去抖延迟,单位毫秒", + "type": "number", + "default": 300 + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "filterable": { + "title": "是否可搜索选项", + "type": "boolean", + "default": false + }, + "$$options": { + "title": "可选项数据源,键名可通过 配置选项Props 属性配置", + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "title": "指定值选项 value 值", + "type": "string", + "default": "" + }, + "label": { + "title": "指定显示选项 label 值", + "type": "string", + "default": "" + }, + "children": { + "title": "指定子级选项", + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "title": "指定值选项 value 值", + "type": "string", + "default": "" + }, + "label": { + "title": "指定显示选项 label 值", + "type": "string", + "default": "" + }, + "$$children": { + "title": "指定子级选项", + "type": "array" + } + } + } + } + } + } + }, + "placeholder": { + "title": "输入框占位文本", + "type": "string", + "default": "请选择" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "自定义浮层类名", + "type": "string", + "default": "" + }, + "props": { + "type": "object", + "title": "配置选项", + "properties": { + "checkStrictly": { + "title": "是否严格的遵守父子节点不互相关联", + "type": "boolean", + "default": false + }, + "children": { + "title": "指定选项的子选项为选项对象的某个属性值", + "type": "string", + "default": "children" + }, + "disabled": { + "title": "指定选项的禁用为选项对象的某个属性值", + "type": "string", + "default": "disabled" + }, + "emitPath": { + "title": "在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false,则只返回该节点的值", + "type": "boolean", + "default": true + }, + "expandTrigger": { + "title": "次级菜单的展开方式", + "type": "string", + "enum": ["click", "hover"], + "enumNames": ["点击时触发", "滑过时触发"], + "default": "click" + }, + "label": { + "title": "指定选项标签为选项对象的某个属性值", + "type": "string", + "default": "label" + }, + "lazy": { + "title": "是否动态加载子节点,需与 lazyLoad 方法结合使用", + "type": "boolean", + "default": false + }, + "leaf": { + "title": "指定选项的叶子节点的标志位为选项对象的某个属性值", + "type": "string", + "default": "leaf" + }, + "multiple": { + "title": "是否多选", + "type": "boolean", + "default": false + }, + "value": { + "title": "指定选项的值为选项对象的某个属性值", + "type": "string", + "default": "value" + } + } + }, + "separator": { + "title": "选项分隔符", + "type": "string", + "default": "/" + }, + "show-all-levels": { + "title": "输入框中是否显示选中值的完整路径", + "type": "boolean", + "default": true + }, + "size": { + "title": "尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "value": { + "title": "选中项绑定值", + "type": "string", + "default": "" + }, + "#empty": { + "title": "无匹配选项时的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/chart-data.json b/packages/settings/design/src/properties/chart-data.json new file mode 100644 index 0000000..1938e4f --- /dev/null +++ b/packages/settings/design/src/properties/chart-data.json @@ -0,0 +1,22 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "columns": { + "title": "维度和指标的集合,chart 中的大部分图表都是单维度多指标,所以默认第一个值为 维度,剩余的值为指标", + "type": "array", + "items": { + "type": "string" + } + }, + "rows": { + "title": "数据的集合", + "type": "array", + "items": { + "type": "object", + "properties": {} + } + } + } + } +} diff --git a/packages/settings/design/src/properties/chart-pie.json b/packages/settings/design/src/properties/chart-pie.json new file mode 100644 index 0000000..6ad91d5 --- /dev/null +++ b/packages/settings/design/src/properties/chart-pie.json @@ -0,0 +1,395 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "dataType": { + "title": "数据类型", + "type": "string", + "enum": ["KMB", "normal", "percent"], + "enumNames": ["KMB 格式", "千分位", "百分比"], + "default": "normal" + }, + "digit": { + "title": "设置数据类型为percent时保留的位数", + "type": "number", + "default": 2 + }, + "dimension": { + "title": "维度,默认columns第一项为维度", + "type": "string", + "default": "" + }, + "hoverAnimation": { + "title": "是否开启 hover 在扇区上的放大动画效果", + "type": "boolean", + "default": true + }, + "itemStyle": { + "title": "图形样式", + "type": "object", + "properties": { + "color": { + "title": "颜色", + "type": "string" + }, + "borderColor": { + "title": "图形的描边颜色", + "type": "string", + "default": "#000" + }, + "borderWidth": { + "title": "描边线宽。为 0 时无描边", + "type": "number", + "default": 0 + }, + "borderType": { + "title": "柱条的描边类型", + "type": "string", + "enum": ["solid", "dashed", "dotted"], + "enumNames": ["实线", "虚线", "点线"], + "default": "solid" + }, + "shadowBlur": { + "title": "图形阴影的模糊大小", + "type": "number" + }, + "shadowColor": { + "title": "阴影颜色", + "type": "string" + }, + "shadowOffsetX": { + "title": "阴影水平方向上的偏移距离", + "type": "number", + "default": 0 + }, + "shadowOffsetY": { + "title": "阴影垂直方向上的偏移距离", + "type": "number", + "default": 0 + }, + "opacity": { + "title": "图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形", + "type": "number" + } + }, + "level": { + "title": "多圆饼图时设置内层和外层的指标", + "type": "array", + "items": { + "type": "array", + "items": { + "title": "指标关键字", + "type": "string" + } + } + } + }, + "label": { + "title": "饼图图形上的文本标签", + "type": "object", + "properties": { + "show": { + "title": "是否显示标签", + "type": "boolean", + "default": false + }, + "position": { + "title": "标签的位置", + "type": "string", + "enum": ["outside", "inside", "inner", "center"], + "enumNames": [ + "饼图扇区外侧 outside,通过视觉引导线连到相应的扇区", + "饼图扇区内部 inside", + "饼图扇区内部 inner,和 inside 配置相同", + "饼图中心位置" + ], + "default": "outside" + }, + "formatter": { + "title": "标签内容格式器,支持用 \n 换行", + "type": "string", + "default": "" + }, + "color": { + "title": "文字的颜色", + "type": "string", + "default": "#fff" + }, + "fontStyle": { + "title": "文字字体的风格", + "type": "string", + "enum": ["normal", "italic", "oblique"], + "enumNames": ["正常字体", "斜体字 italic", "倾斜的文字 oblique"], + "default": "normal" + }, + "fontWeight": { + "title": "文字字体的粗细", + "type": "string", + "enum": ["normal", "bold", "bolder", "lighter"], + "enumNamse": ["正常", "加粗", "更粗", "更细"], + "default": "normal" + }, + "fontFamily": { + "title": "文字的字体", + "type": "string", + "default": "sans-serif" + }, + "fontSize": { + "title": "文字的字体大小", + "type": "number", + "default": 12 + }, + "align": { + "title": "文字水平对齐方式,默认自动", + "type": "string", + "enum": ["left", "center", "right"], + "enumNames": ["左对齐", "居中对齐", "右对齐"], + "default": "" + }, + "verticalAlign": { + "title": "文字垂直对齐方式,默认自动", + "type": "string", + "enum": ["top", "middle", "bottom"], + "enumNames": ["顶端对齐", "居中对齐", "底部对齐"], + "default": "" + }, + "lineHeight": { + "title": "行高", + "type": "number" + }, + "backgroundColor": { + "title": "文字块背景色", + "type": "string", + "default": "transparent" + }, + "borderWidth": { + "title": "文字块边框宽度", + "type": "number", + "default": 0 + }, + "borderRadius": { + "title": "文字块的圆角", + "type": "number", + "default": 0 + }, + "padding": { + "title": "文字块的内边距", + "type": "array", + "items": { + "type": "number" + } + }, + "shadowColor": { + "title": "文字块的背景阴影颜色", + "type": "string", + "default": "transparent" + }, + "shadowBlur": { + "title": "文字块的背景阴影长度", + "type": "number", + "default": 0 + }, + "shadowOffsetX": { + "title": "文字块的背景阴影 X 偏移", + "type": "number", + "default": 0 + }, + "shadowOffsetY": { + "title": "文字块的背景阴影 Y 偏移", + "type": "number", + "default": 0 + }, + "width": { + "title": "文字块的宽度", + "type": "number", + "default": 0 + }, + "height": { + "title": "文字块的高度", + "type": "number", + "default": 0 + }, + "textBorderColor": { + "title": "文字本身的描边颜色", + "type": "string", + "default": "transparent" + }, + "textShadowBlur": { + "title": "文字本身的阴影长度", + "type": "number", + "default": 0 + }, + "textShadowOffsetX": { + "title": "文字本身的阴影 X 偏移", + "type": "number", + "default": 0 + }, + "textShadowOffsetY": { + "title": "文字本身的阴影 Y 偏移", + "type": "number", + "default": 0 + }, + "rich": { + "title": "自定义富文本样式", + "type": "object" + } + } + }, + "labelLine": { + "title": "标签的视觉引导线样式,在 label位置 设置为 'outside' 时会显示视觉引导线 ", + "type": "object", + "properties": { + "show": { + "title": "是否显示视觉引导线", + "type": "boolean" + }, + "length": { + "title": "视觉引导线第一段的长度", + "type": "number" + }, + "length2": { + "title": "视觉引导线第二段的长度", + "type": "number" + }, + "smooth": { + "title": "是否平滑视觉引导线", + "type": "boolean", + "default": false + }, + "color": { + "title": "线的颜色", + "type": "string", + "default": "#000" + }, + "width": { + "title": "线宽", + "type": "number", + "default": 1 + }, + "type": { + "title": "线的类型", + "type": "string", + "enum": ["solid", "dashed", "dotted"], + "enumNames": ["实线", "虚线", "点线"], + "default": "solid" + }, + "shadowBlur": { + "title": "图形阴影的模糊大小", + "type": "number" + }, + "shadowColor": { + "title": "阴影颜色", + "type": "string" + }, + "shadowOffsetX": { + "title": "阴影水平方向上的偏移距离", + "type": "number", + "default": 0 + }, + "shadowOffsetY": { + "title": "阴影垂直方向上的偏移距离", + "type": "number", + "default": 0 + }, + "opacity": { + "title": "图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形", + "type": "number" + }, + "emphasis": { + "title": "高亮状态下视觉引导线的样式", + "type": "object", + "properties": { + "show": { + "title": "是否显示视觉引导线", + "type": "boolean" + }, + "lineStyle": { + "title": "视觉引导线", + "type": "object", + "properties": { + "color": { + "title": "线的颜色", + "type": "string", + "default": "#000" + }, + "width": { + "title": "线宽", + "type": "number", + "default": 1 + }, + "type": { + "title": "线的类型", + "type": "string", + "enum": ["solid", "dashed", "dotted"], + "enumNames": ["实线", "虚线", "点线"], + "default": "solid" + }, + "shadowBlur": { + "title": "图形阴影的模糊大小", + "type": "number" + }, + "shadowColor": { + "title": "阴影颜色", + "type": "string" + }, + "shadowOffsetX": { + "title": "阴影水平方向上的偏移距离", + "type": "number", + "default": 0 + }, + "shadowOffsetY": { + "title": "阴影垂直方向上的偏移距离", + "type": "number", + "default": 0 + }, + "opacity": { + "title": "图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形", + "type": "number" + } + } + } + } + } + } + }, + "legendLimit": { + "title": "legend显示数量限制,legend数量过多会导致饼图样式错误,限制legend最大值并且当超过此值时,隐藏legend可以解决这个问题", + "type": "number", + "default": 30 + }, + "limitShowNum": { + "title": "设置超过此数字时使用‘其他’代替,此时数据会按照由大到小顺序显示", + "type": "number", + "default": 0 + }, + "metrics": { + "title": "指标,默认columns第二项为指标", + "type": "string", + "default": "" + }, + "offsetY": { + "title": "纵向偏移量", + "type": ["string", "number"], + "default": "50%" + }, + "radius": { + "title": "饼图半径", + "type": "number" + }, + "roseType": { + "title": "显示为南丁格尔玫瑰图时的显示模式", + "type": ["string", "boolean"], + "enum": ["radius", "area"], + "enumNames": ["扇区圆心角展现数据的百分比,半径咱先数据的大小", "所有扇区圆心角相同,仅通过半径展现数据大小"], + "default": "" + }, + "selectedMode": { + "title": "选中模式", + "type": ["string", "boolean"], + "enum": ["single", "multiple"], + "enumNames": ["单选", "多选"], + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/chart.json b/packages/settings/design/src/properties/chart.json new file mode 100644 index 0000000..94195d3 --- /dev/null +++ b/packages/settings/design/src/properties/chart.json @@ -0,0 +1,90 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "cancel-resize-check": { + "title": "是否禁用 resize 时的容器检测", + "type": "boolean", + "default": false + }, + "change-delay": { + "title": "属性修改触发图表重绘回调的延迟,单位毫秒", + "type": "number", + "default": 0 + }, + "data": { + "title": "数据由指标和维度组成,“维度” 指的是数据的属性,“指标” 是量化衡量标准", + "type": "object" + }, + "events": { + "title": "事件绑定", + "type": "object" + }, + "height": { + "title": "设置图表容器的高度", + "type": "string", + "default": "400px" + }, + "init-options": { + "title": "init 附加参数", + "type": "object" + }, + "judge-width": { + "title": "是否处理生成图表时的宽度问题", + "type": "boolean", + "default": false + }, + "legend-visible": { + "title": "是否显示图例", + "type": "boolean", + "default": true + }, + "not-set-unchange": { + "title": "未发生变化时不参加 setOption 的属性", + "type": "array" + }, + "resize-delay": { + "title": "窗口 resize 事件回调的延迟,单位毫秒", + "type": "number", + "default": 200 + }, + "resizeable": { + "title": "是否处理窗口 resize 事件", + "type": "boolean", + "default": true + }, + "set-option-opts": { + "title": "echarts setOption 的第二个参数", + "type": ["object", "boolean"] + }, + "settings ": { + "title": "配置项,各图表 Settings 属性配置请查阅各图表详情页面", + "type": "object" + }, + "theme": { + "title": "自定义主题对象", + "type": "object" + }, + "theme-name": { + "title": "自定义主题名称,如果设置了theme-name,则theme无效", + "type": "string", + "default": "" + }, + "tooltip-visible": { + "title": "是否显示提示框", + "type": "boolean", + "default": true + }, + "width": { + "title": "设置图表容器的宽度", + "type": "string", + "default": "auto" + }, + "width-change-delay": { + "title": "容器宽度变化的延迟,单位毫秒", + "type": "number", + "default": 300 + } + } + } +} diff --git a/packages/settings/design/src/properties/checkbox-button.json b/packages/settings/design/src/properties/checkbox-button.json new file mode 100644 index 0000000..17e52eb --- /dev/null +++ b/packages/settings/design/src/properties/checkbox-button.json @@ -0,0 +1,55 @@ +{ + "schema": { + "type": "object", + "properties": { + "checked": { + "title": "是否勾选", + "type": "boolean", + "default": false + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "$$events": { + "title": "原生事件", + "type": "object" + }, + "false-label": { + "title": "没有选中时的值", + "type": ["string", "number"], + "default": "" + }, + "label": { + "title": "选中状态的值(只有在checkbox-group或者绑定对象类型为array时有效)", + "type": ["string", "number", "boolean"], + "default": "" + }, + "name": { + "title": "名称,原生 name 属性", + "type": "string", + "default": "" + }, + "text": { + "title": "复选框显示的文本", + "type": "string", + "default": "" + }, + "true-label": { + "title": "选中时的值", + "type": ["string", "number"], + "default": "" + }, + "value": { + "title": "绑定值", + "type": ["string", "number", "boolean"], + "default": "" + }, + "#default": { + "title": "Checkbox-button的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/checkbox-group.json b/packages/settings/design/src/properties/checkbox-group.json new file mode 100644 index 0000000..82f5b41 --- /dev/null +++ b/packages/settings/design/src/properties/checkbox-group.json @@ -0,0 +1,84 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "fill": { + "title": "按钮形式的 Checkbox 激活时的填充色和边框色", + "type": "string", + "default": "#409EFF" + }, + "max": { + "title": "可被勾选的 Checkbox 的最大数量", + "type": "number" + }, + "min": { + "title": "可被勾选的 Checkbox 的最小数量", + "type": "number" + }, + "options": { + "title": "通过配置对象数组的形式来渲染复选框组", + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "title": "标签文本", + "type": "string", + "default": "" + }, + "text": { + "title": "显示的文本", + "type": "string", + "default": "" + }, + "$$events": { + "title": "原生事件", + "type": "object", + "properties": {} + } + } + } + }, + "size": { + "title": "复选框组尺寸,仅对按钮形式的 Checkbox 或带有边框的 Checkbox 有效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "text-color": { + "title": "按钮形式的 Checkbox 激活时的文本颜色", + "type": "string", + "default": "#ffffff" + }, + "type": { + "title": "当通过 options 属性渲染复选框组时,可通过该属性来指定 Checkbox 类型", + "type": "string", + "enum": ["button", "checkbox"], + "enumNames": ["按钮类型", "复选框类型"], + "default": "checkbox" + }, + "value": { + "title": "绑定值", + "type": "array", + "items": { + "type": "string" + } + }, + "vertical": { + "title": "设置复选框是否垂直排列", + "type": "boolean", + "default": false + }, + "#default": { + "title": "checkbox选项组插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/checkbox.json b/packages/settings/design/src/properties/checkbox.json new file mode 100644 index 0000000..4cfc119 --- /dev/null +++ b/packages/settings/design/src/properties/checkbox.json @@ -0,0 +1,68 @@ +{ + "schema": { + "type": "object", + "properties": { + "border": { + "title": "是否显示边框", + "type": "boolean", + "default": false + }, + "checked": { + "title": "是否勾选", + "type": "boolean", + "default": false + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "false-label": { + "title": "没有选中时的值", + "type": ["string", "number"], + "default": "" + }, + "indeterminate": { + "title": "是否设置 indeterminate 状态,只负责样式控制", + "type": "boolean", + "default": false + }, + "label": { + "title": "选中状态的值(只有在checkbox-group或者绑定对象类型为array时有效)", + "type": ["string", "number", "boolean"], + "default": "" + }, + "name": { + "title": "名称,原生 name 属性", + "type": "string", + "default": "" + }, + "size": { + "title": "Checkbox 的尺寸,仅在 是否显示边框 border 为真时有效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "text": { + "title": "复选框显示的文本", + "type": "string", + "default": "" + }, + "true-label": { + "title": "选中时的值", + "type": ["string", "number"], + "default": "" + }, + "value": { + "title": "绑定值", + "type": ["string", "number", "boolean"], + "default": "" + }, + "#default": { + "title": "Checkbox的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/col.json b/packages/settings/design/src/properties/col.json new file mode 100644 index 0000000..b0db1d8 --- /dev/null +++ b/packages/settings/design/src/properties/col.json @@ -0,0 +1,79 @@ +{ + "schema": { + "type": "object", + "properties": { + "lg": { + "title": "≥1200px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "number" + }, + "$$lg": { + "title": "≥1200px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "object" + }, + "md": { + "title": "≥992px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "number" + }, + "$$md": { + "title": "≥992px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "object" + }, + "move": { + "title": "栅格左右移动格数(正数向右,负数向左)", + "type": "number", + "default": 0 + }, + "no": { + "title": "排序编号(Row 中启用 order 时生效),默认值为 0", + "type": "number", + "default": 0 + }, + "offset": { + "title": "栅格左侧的间隔格数,默认为 0", + "type": "number", + "minimum": 0, + "default": 0 + }, + "sm": { + "title": "≥768px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "number" + }, + "$$sm": { + "title": "≥768px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "object" + }, + "span": { + "title": "栅格占据的列数", + "type": "number", + "exclusiveMinimum": 0, + "maximum": 12, + "default": 12 + }, + "tag": { + "title": "自定义元素标签,可选任意标签", + "type": "string", + "default": "div" + }, + "xl": { + "title": "≥1920px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "number" + }, + "$$xl": { + "title": "≥1920px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "object" + }, + "xs": { + "title": "<768px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "number" + }, + "$$xs": { + "title": "<768px 响应式栅格数或者栅格属性对象,例如:{span: 4, offset: 4}", + "type": "object" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/collapse-item.json b/packages/settings/design/src/properties/collapse-item.json new file mode 100644 index 0000000..f17aa28 --- /dev/null +++ b/packages/settings/design/src/properties/collapse-item.json @@ -0,0 +1,28 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "name": { + "title": "唯一标志符", + "type": ["string", "number"] + }, + "title": { + "title": "面板标题", + "type": "string" + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#title": { + "title": "标题插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/collapse.json b/packages/settings/design/src/properties/collapse.json new file mode 100644 index 0000000..93f96e3 --- /dev/null +++ b/packages/settings/design/src/properties/collapse.json @@ -0,0 +1,20 @@ +{ + "schema": { + "type": "object", + "properties": { + "accordion": { + "title": "是否手风琴模式", + "type": "boolean", + "default": false + }, + "value": { + "title": "当前激活的面板(如果是手风琴模式,绑定值类型需要为 String,否则为 Array)", + "type": ["string", "array"] + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/company.json b/packages/settings/design/src/properties/company.json new file mode 100644 index 0000000..8ab63b1 --- /dev/null +++ b/packages/settings/design/src/properties/company.json @@ -0,0 +1,44 @@ +{ + "schema": { + "type": "object", + "properties": { + "clearable": { + "title": "是否可清空", + "type": "boolean", + "default": true + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "$$fields": { + "title": "自定义公司数据映射,未使用框架服务时必填", + "type": "object" + }, + "max": { + "title": "原生属性,设置最大值", + "type": "number", + "default": 1000 + }, + "placeholder": { + "title": "设置输入框内的提示占位文本", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string" + }, + "value": { + "title": "设置下拉框的值", + "type": ["string", "number"] + } + } + } +} diff --git a/packages/settings/design/src/properties/container.json b/packages/settings/design/src/properties/container.json new file mode 100644 index 0000000..f19be02 --- /dev/null +++ b/packages/settings/design/src/properties/container.json @@ -0,0 +1,45 @@ +{ + "schema": { + "type": "object", + "properties": { + "aside-width": { + "title": "左侧宽度", + "type": ["number", "string"], + "default": 200 + }, + "footer-height": { + "title": "底部高度", + "type": ["number", "string"], + "default": 60 + }, + "header-height": { + "title": "头部高度", + "type": ["number", "string"], + "default": 60 + }, + "pattern": { + "title": "版型类型", + "type": "string", + "enum": ["default", "simple", "legend", "classic", "fashion"], + "enumNames": ["默认布局", "简约布局", "传奇布局", "经典布局", "时尚布局"], + "default": "default" + }, + "#aside": { + "title": "侧边内容插槽", + "type": "string" + }, + "#default": { + "title": "主要内容插槽", + "type": "string" + }, + "#footer": { + "title": "底部内容插槽", + "type": "string" + }, + "#header": { + "title": "头部内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/country.json b/packages/settings/design/src/properties/country.json new file mode 100644 index 0000000..bc84c87 --- /dev/null +++ b/packages/settings/design/src/properties/country.json @@ -0,0 +1,39 @@ +{ + "schema": { + "type": "object", + "properties": { + "clearable": { + "title": "是否可清空", + "type": "boolean", + "default": true + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "$$fields": { + "title": "自定义数据映射,未使用框架服务时必填", + "type": "object" + }, + "placeholder": { + "title": "设置输入框内的提示占位文本", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string" + }, + "value": { + "title": "设置下拉框的值", + "type": ["string", "number"] + } + } + } +} diff --git a/packages/settings/design/src/properties/credit-card-form.json b/packages/settings/design/src/properties/credit-card-form.json new file mode 100644 index 0000000..c60dd61 --- /dev/null +++ b/packages/settings/design/src/properties/credit-card-form.json @@ -0,0 +1,46 @@ +{ + "schema": { + "type": "object", + "properties": { + "background-image": { + "title": "设置卡片的背景图片", + "type": "string" + }, + "$$background-image": { + "title": "设置卡片的背景图片", + "type": "object" + }, + "form-data": { + "title": "设置信用卡显示数据", + "type": "object", + "properties": { + "cardCvv": { + "title": "cvv", + "type": "string", + "default": "" + }, + "cardName": { + "title": "持有者姓名", + "type": "string", + "default": "" + }, + "cardYear": { + "title": "年份", + "type": "string", + "default": "" + }, + "cardMonth": { + "title": "月份", + "type": "string", + "default": "" + }, + "cardNumber": { + "title": "卡号", + "type": "string", + "default": "" + } + } + } + } + } +} diff --git a/packages/settings/design/src/properties/crop.json b/packages/settings/design/src/properties/crop.json new file mode 100644 index 0000000..63627a8 --- /dev/null +++ b/packages/settings/design/src/properties/crop.json @@ -0,0 +1,140 @@ +{ + "schema": { + "type": "object", + "properties": { + "aspect-ratio": { + "title": "裁剪框的宽高比, 默认为 16 / 9", + "type": "number", + "default": "16/9" + }, + "auto-crop": { + "title": "初始化时,是否自动显示裁剪框", + "type": "boolean", + "default": true + }, + "auto-crop-area": { + "title": "定义自动裁剪面积大小(百分比)", + "type": "number", + "default": 0.8 + }, + "background": { + "title": "是否显示容器的网格背景", + "type": "boolean", + "default": true + }, + "center": { + "title": "裁剪框是否在图片正中心", + "type": "boolean", + "default": true + }, + "crop-type": { + "title": "设置图片裁剪后返回的类型", + "type": "string", + "default": "base64", + "enum": ["blob", "base64"], + "enumNames": ["blob", "base64"] + }, + "cropvisible": { + "title": "设置裁剪弹框是否可见", + "type": "boolean", + "default": false + }, + "drag-mode": { + "title": "定义 cropper 的拖拽模式,'crop': 可以产生一个新的裁剪框 3;'move':只可以移动图片 3;'none': 什么也不处理", + "type": "string", + "enum": ["crop", "move", "none"], + "enumNames": ["可以产生一个新的裁剪框", "只可以移动图片", "什么也不处理"], + "default": "crop" + }, + "guides": { + "title": "是否在裁剪框上方显示虚线", + "type": "boolean", + "default": true + }, + "max-size": { + "title": "设置待裁剪图片的最大大小", + "type": "string", + "default": "1M" + }, + "min-container-height": { + "title": "容器的最小高度", + "type": "number", + "default": 300 + }, + "min-container-width": { + "title": "容器的最小宽度", + "type": "number", + "default": 652 + }, + "min-crop-box-height": { + "title": "裁剪层的最小高度", + "type": "number", + "default": 0 + }, + "min-crop-box-width": { + "title": "裁剪层的最小宽度", + "type": "number", + "default": 0 + }, + "modal": { + "title": "是否显示图片上方裁剪框下方的黑色模态", + "type": "boolean", + "default": true + }, + "movable": { + "title": "是否允许可以移动后面的图片", + "type": "boolean", + "default": true + }, + "preview": { + "title": "设置裁剪区域图片是否可预览", + "type": "boolean", + "default": false + }, + "quality": { + "title": "设置图片裁剪后的压缩比例,值在 0-1 之间", + "type": "number", + "exclusiveMinimum": 0, + "maximum": 1, + "default": 0.92 + }, + "rotatable": { + "title": "是否允许旋转图像", + "type": "boolean", + "default": true + }, + "src": { + "title": "默认裁剪的源图片", + "type": "string", + "default": "" + }, + "view-mode": { + "title": "定义 cropper 的视图模式,0:没有限制,3 可以移动到 2 外;1:3 只能在 2 内移动;2:2 图片不全部铺满 1 (即缩小时可以有一边出现空隙);3:2 图片填充整个 1", + "type": "number", + "enum": [0, 1, 2, 3], + "enumNames": [ + "没有限制,3 可以移动到 2 外", + "3 只能在 2 内移动", + "2 图片不全部铺满 1 (即缩小时可以有一边出现空隙)", + "2 图片填充整个 1" + ], + "default": 0 + }, + "wheel-zoom-ratio": { + "title": "用鼠标移动图像时,定义缩放比例", + "type": "number", + "default": 0.1 + }, + "zoom-on-wheel": { + "title": "是否可以通过滚动鼠标滚轮来缩放图像", + "type": "boolean", + "default": true + }, + "zoomable": { + "title": "是否允许放大图像", + "type": "boolean", + "default": true + } + } + } +} diff --git a/packages/settings/design/src/properties/currency.json b/packages/settings/design/src/properties/currency.json new file mode 100644 index 0000000..b8be26e --- /dev/null +++ b/packages/settings/design/src/properties/currency.json @@ -0,0 +1,45 @@ +{ + "schema": { + "type": "object", + "properties": { + "clearable": { + "title": "是否可清空", + "type": "boolean", + "default": true + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "$$fields": { + "title": "自定义数据映射,在没有使用框架服务时必填", + "type": "object" + }, + "placeholder": { + "title": "设置输入框内的提示占位文本", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string" + }, + "size": { + "title": "输入框尺寸,只在 type!=\"textarea\" 时有效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"] + }, + "value": { + "title": "设置下拉框的值", + "type": ["string", "number"] + } + } + } +} diff --git a/packages/settings/design/src/properties/date-picker-date-format.json b/packages/settings/design/src/properties/date-picker-date-format.json new file mode 100644 index 0000000..48f169c --- /dev/null +++ b/packages/settings/design/src/properties/date-picker-date-format.json @@ -0,0 +1,6 @@ +{ + "$$schema": { + "type": "object", + "properties": {} + } +} diff --git a/packages/settings/design/src/properties/date-picker-options.json b/packages/settings/design/src/properties/date-picker-options.json new file mode 100644 index 0000000..71821cf --- /dev/null +++ b/packages/settings/design/src/properties/date-picker-options.json @@ -0,0 +1,18 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "firstDayOfWeek": { + "title": "周起始日", + "type": "number", + "enum": [1, 2, 3, 4, 5, 6, 7], + "enumNames": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"], + "default": 7 + }, + "shortcuts": { + "title": "设置快捷选项,需要传入 { text, onClick } 对象用法参考 demo 或下表", + "type": "object" + } + } + } +} diff --git a/packages/settings/design/src/properties/date-picker-shortcuts.json b/packages/settings/design/src/properties/date-picker-shortcuts.json new file mode 100644 index 0000000..99f76b8 --- /dev/null +++ b/packages/settings/design/src/properties/date-picker-shortcuts.json @@ -0,0 +1,12 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "text": { + "title": "标题文本", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/date-picker.json b/packages/settings/design/src/properties/date-picker.json new file mode 100644 index 0000000..fecf0d9 --- /dev/null +++ b/packages/settings/design/src/properties/date-picker.json @@ -0,0 +1,169 @@ +{ + "schema": { + "type": "object", + "properties": { + "align": { + "title": "对齐方式", + "type": "string", + "enum": ["left", "center", "right"], + "enumNames": ["左对齐", "居中对齐", "右对齐"], + "default": "left" + }, + "$$clear-icon": { + "title": "自定义清空图标的类名", + "type": "object", + "default": "IconOperationfaild" + }, + "clearable": { + "title": "是否显示清除按钮", + "type": "boolean", + "default": true + }, + "default-time": { + "title": "范围选择时选中日期所使用的当日内具体时刻,可选值为 支持的日期格式", + "type": "string", + "default": "" + }, + "default-value": { + "title": "可选,选择器打开时默认显示的时间,可选值为 可被new Date()解析", + "type": "date", + "format": "date-time", + "default": "" + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "editable": { + "title": "文本框可输入", + "type": "boolean", + "default": true + }, + "end-placeholder": { + "title": "范围选择时结束日期的占位内容", + "type": "string", + "default": "" + }, + "format": { + "title": "显示在输入框中的格式", + "type": "string", + "default": "yyyy-MM-dd" + }, + "isutc8": { + "title": "默认值为 false ,设置为 true 时切换系统默认时区,时间依然显示为东八区时间。适用场景为海外地区显示东八区时间", + "type": "boolean", + "default": false + }, + "name": { + "title": "原生属性", + "type": "string", + "default": "" + }, + "$$picker-options": { + "title": "当前时间日期选择器特有的选项参考下表", + "type": "object", + "properties": { + "firstDayOfWeek": { + "title": "周起始日", + "type": "number", + "enum": [1, 2, 3, 4, 5, 6, 7], + "enumNames": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"], + "default": "7" + }, + "$$shortcuts": { + "title": "设置快捷选项,需要传入 { text, onClick } 对象用法参考 demo 或下表", + "type": "object", + "properties": { + "text": { + "title": "快捷选项文本", + "type": "string", + "default": "" + }, + "onClick": { + "title": "快捷选项点击事件", + "type": "function", + "default": "" + } + } + } + } + }, + "placeholder": { + "title": "非范围选择时的占位内容", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "range-separator": { + "title": "选择范围时的分隔符", + "type": "string", + "default": "-" + }, + "readonly": { + "title": "设置日历组件是否只读", + "type": "boolean", + "default": false + }, + "size": { + "title": "输入框尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "start-placeholder": { + "title": "范围选择时开始日期的占位内容", + "type": "string", + "default": "" + }, + "$$suffix-icon ": { + "title": "自定义后置图标的类名,prefix-icon 自 AUI 3.8.0 版本将替换为 suffix-icon ", + "type": "object", + "default": "IconCalendar" + }, + "time-arrow-control": { + "title": "通过箭头按钮控制时间选择,当 type 为 datetime、datetimerange 时使用,默认为 通过鼠标滚轮滚动选择时间", + "type": "boolean", + "default": false + }, + "type": { + "title": "显示类型", + "type": "string", + "enum": ["year", "month", "dates", "week", "daterange", "date", "datetime", "datetimerange", "monthrange"], + "enumNames": ["年", "月", "多个日期", "周", "日期范围", "日期", "日期时间", "日期时间范围", "月范围"], + "default": "date" + }, + "unlink-panels": { + "title": "在范围选择器里取消两个日期面板之间的联动", + "type": "boolean", + "default": false + }, + "validate-event": { + "title": "设置日期选择器在输入时是否会触发表单校验", + "type": "boolean", + "default": true + }, + "value": { + "title": "绑定值", + "type": ["string", "array"], + "format": "date-time", + "default": "" + }, + "value-format": { + "title": "指定绑定值的格式。不指定则绑定值为 Date 对象", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/dept.json b/packages/settings/design/src/properties/dept.json new file mode 100644 index 0000000..11f9b99 --- /dev/null +++ b/packages/settings/design/src/properties/dept.json @@ -0,0 +1,28 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "value": { + "title": "设置部门组件的初始化时的显示值", + "type": "string", + "default": "" + }, + "#hrapprover": { + "title": "权签人插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/detail-page.json b/packages/settings/design/src/properties/detail-page.json new file mode 100644 index 0000000..a4cb92c --- /dev/null +++ b/packages/settings/design/src/properties/detail-page.json @@ -0,0 +1,52 @@ +{ + "schema": { + "type": "object", + "properties": { + "cancel-button": { + "title": "个性化弹窗取消按钮的文本", + "type": "string", + "default": "取 消" + }, + "dialog-title": { + "title": "个性化弹窗标题", + "type": "string", + "default": "个性化设置" + }, + "label-title": { + "title": "个性化弹窗表头文本标题栏字段", + "type": "string", + "default": "字段" + }, + "save-button": { + "title": "个性化弹窗确定按钮的文本", + "type": "string", + "default": "确 定" + }, + "text-split": { + "title": "详情栏标题分隔符", + "type": "string", + "default": ":" + }, + "tips": { + "title": "提示不能全部隐藏的提示语", + "type": "string", + "default": "至少显示一个" + }, + "title": { + "title": "详情栏标题", + "type": "string", + "default": "带表头的详情栏" + }, + "$$value": { + "title": "设置表头详情栏的数据", + "type": "array", + "default": "" + }, + "value-title": { + "title": "个性化弹窗表头文本操作栏字段", + "type": "string", + "default": "隐藏" + } + } + } +} diff --git a/packages/settings/design/src/properties/dialog-box.json b/packages/settings/design/src/properties/dialog-box.json new file mode 100644 index 0000000..b7f4beb --- /dev/null +++ b/packages/settings/design/src/properties/dialog-box.json @@ -0,0 +1,109 @@ +{ + "schema": { + "type": "object", + "properties": { + "append-to-body": { + "title": "DialogBox 本身是否插入到 body 上,嵌套的 Dialog 必须指定该属性并赋值为 true", + "type": "boolean", + "default": false + }, + "center": { + "title": "设置为 true 时 弹出框的头部与底部内容会自动居中", + "type": "boolean", + "default": false + }, + "close-on-click-modal": { + "title": "是否可以通过点击遮罩层关闭弹窗,默认为 true ,可以在标签上设置 :modal-closable=\"false\" 不能通过点击遮罩层关闭弹窗", + "type": "boolean", + "default": true + }, + "close-on-press-escape": { + "title": "是否可以通过 ESC 键关闭遮罩层", + "type": "boolean", + "default": true + }, + "dialog-class": { + "title": "自定义配置弹窗类名", + "type": "string", + "default": "" + }, + "draggable": { + "title": "是否开启弹窗的拖拽功能", + "type": "boolean", + "default": false + }, + "fullscreen": { + "title": "弹出框是否全屏", + "type": "boolean", + "default": false + }, + "is-form-reset": { + "title": "关闭弹窗时是否重置表单数据", + "type": "boolean", + "default": true + }, + "lock-scroll": { + "title": "Dialog弹出时是否禁用滚动条", + "type": "boolean", + "default": true + }, + "modal": { + "title": "是否启用遮罩层", + "type": "boolean", + "default": true + }, + "modal-append-to-body": { + "title": "遮罩层是否应用到 body 上,为 false 时遮罩层会应用到 DialogBox 的父元素上", + "type": "boolean", + "default": true + }, + "right-slide": { + "title": "是否开启弹出右侧滑出功能", + "type": "boolean", + "default": false + }, + "show-close": { + "title": "是否显示关闭按钮", + "type": "boolean", + "default": true + }, + "show-header": { + "title": "是否显示弹窗头部 header", + "type": "boolean", + "default": true + }, + "title": { + "title": "弹出框标题", + "type": "string", + "default": "" + }, + "top": { + "title": "设置弹出框距离窗口顶部的高度,默认为屏高的 15%", + "type": "string", + "default": "15vh" + }, + "visible": { + "title": "控制弹出框显示与关闭", + "type": "boolean", + "default": true + }, + "width": { + "title": "弹出框的宽度", + "type": "string", + "default": "500px" + }, + "#default": { + "title": "Dialog 的内容插槽", + "type": "string" + }, + "#footer": { + "title": "Dialog 按钮操作区的内容插槽", + "type": "string" + }, + "#title": { + "title": "Dialog 标题区的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/drop-roles.json b/packages/settings/design/src/properties/drop-roles.json new file mode 100644 index 0000000..85c68a4 --- /dev/null +++ b/packages/settings/design/src/properties/drop-roles.json @@ -0,0 +1,49 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$fetchCurrentRole": { + "title": "自定义获取当前用户角色接口,未使用框架服务时必填", + "type": "object", + "default": "" + }, + "$$fetchRole": { + "title": "自定义获取角色列表接口,未使用框架服务时必填", + "type": "object", + "default": "" + }, + "$$fields": { + "title": "自定义数据映射,未使用框架服务时必填", + "type": "object", + "default": "" + }, + "placeholder": { + "title": "设置输入框内的提示占位文本", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "value": { + "title": "绑定值", + "type": ["string", "number"], + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/drop-times.json b/packages/settings/design/src/properties/drop-times.json new file mode 100644 index 0000000..fe946ef --- /dev/null +++ b/packages/settings/design/src/properties/drop-times.json @@ -0,0 +1,44 @@ +{ + "schema": { + "type": "object", + "properties": { + "end": { + "title": "结束时间,以分钟计算", + "type": "number", + "default": 1440 + }, + "placeholder": { + "title": "设置输入框内的提示占位文本", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "start": { + "title": "开始时间,以分钟计算", + "type": "number", + "default": 0 + }, + "step": { + "title": "间隔时间,以分钟计算", + "type": "number", + "default": 15 + } + } + } +} diff --git a/packages/settings/design/src/properties/edoc.json b/packages/settings/design/src/properties/edoc.json new file mode 100644 index 0000000..4c0a5ae --- /dev/null +++ b/packages/settings/design/src/properties/edoc.json @@ -0,0 +1,75 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$btn-icon": { + "title": "按钮图标", + "type": "object", + "default": "" + }, + "btn-text": { + "title": "自定义按钮文字", + "type": "string", + "default": "" + }, + "can-be-del": { + "title": "是否可下载,默认为 true, 为 true 且当前页面为可编辑状态时,下载附件列表将包含删除图标", + "type": "boolean", + "default": true + }, + "direct-download": { + "title": "是否快捷下载,默认为 false,即需要在打开的 EDM 页面中再次点击下载", + "type": "boolean", + "default": false + }, + "doc-format": { + "title": "文档格式,比如 wm/pdf/swf,下载转换成功的水印文档时使用", + "type": "string", + "default": "" + }, + "file-whitelist": { + "title": "允许用户上传文档类型的白名单,例如 .doc,.ppt,.txt等,若配置了此参数,则取此参数与 EDM 注册时给业务系统配置的值的交集,否则取 EDM 注册时给业务系统配置的值", + "type": "string", + "default": "" + }, + "is-constraint": { + "title": "是否严格下载", + "type": "string", + "enum": ["yes", "no"], + "enumNames": ["只能下载指定文档格式的文档", "指定文档格式的文档不存在,可下载原始文档"], + "default": "" + }, + "$$not-submit-data": { + "title": "不提交到服务端的文档信息", + "type": "array", + "default": ["hw_business_key", "canBeDel", "canBeEdit"] + }, + "sub-class-name": { + "title": "快捷下载时,用于校验用户是否有权限。该配置值为业务系统后台实现 EdocAuthentication 接口的子类名,需要找业务系统后台确认该类名后再配置,配置的类名若后台还没实现,就会报错", + "type": "string", + "default": "" + }, + "upload-flag": { + "title": "组织类型,one 表示上载单个文件,上载完成后默认的上载按钮会隐藏;more 表示上载多个文件", + "type": "string", + "enum": ["one", "more"], + "enumNames": ["单个文件", "多个文件"], + "default": "one" + }, + "$$web-doc-ext": { + "title": "可以预览的文档类型,Gateway 和 Jalor 模式不支持预览服务,可设置 webDocExt 为空数组", + "type": "array", + "default": [] + }, + "$$web-doc-preview": { + "title": "预览文档/图片的配置信息, Gataway 和 Jalor5 模式不支持预览功能", + "type": "object", + "default": "" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/espace.json b/packages/settings/design/src/properties/espace.json new file mode 100644 index 0000000..692f9bf --- /dev/null +++ b/packages/settings/design/src/properties/espace.json @@ -0,0 +1,31 @@ +{ + "schema": { + "type": "object", + "properties": { + "data": { + "title": "设置组件数据,数组对象中包含选项有 type、value、icon。type 的可选择值有:im、sip、mailto", + "type": "array", + "default": "", + "items": { + "type": "object", + "properties": { + "type": { + "title": "Espace 消息弹窗的类型", + "type": "string", + "enum": ["im", "sip", "mailto"], + "enumNames": ["即时消息", "呼叫", "邮件"] + }, + "value": { + "title": "用户信息", + "type": "string" + }, + "icon": { + "title": "显示的图标", + "type": "string" + } + } + } + } + } + } +} diff --git a/packages/settings/design/src/properties/fall-menu.json b/packages/settings/design/src/properties/fall-menu.json new file mode 100644 index 0000000..b6fa23e --- /dev/null +++ b/packages/settings/design/src/properties/fall-menu.json @@ -0,0 +1,66 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "$$data": { + "title": "设置瀑布菜单的数据", + "type": "array", + "default": [], + "items": { + "type": "object", + "properties": { + "title": { + "title": "菜单名称", + "type": "string" + }, + "url": { + "title": "点击菜单跳转的 URL", + "type": "string" + }, + "children": { + "title": "菜单下的子菜单", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "title": "菜单名称", + "type": "string" + }, + "url": { + "title": "点击菜单跳转的 URL", + "type": "string" + }, + "children": { + "title": "菜单下的子菜单", + "type": "array" + } + } + } + } + } + } + }, + "#left": { + "title": "自定义左侧切换图标插槽", + "type": "string" + }, + "#level1": { + "title": "自定义一级菜单插槽", + "type": "string" + }, + "#level2": { + "title": "自定义二级菜单插槽", + "type": "string" + }, + "#level3": { + "title": "自定义三级菜单插槽", + "type": "string" + }, + "#right": { + "title": "自定义右侧切换图标插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/file-upload.json b/packages/settings/design/src/properties/file-upload.json new file mode 100644 index 0000000..a55b3df --- /dev/null +++ b/packages/settings/design/src/properties/file-upload.json @@ -0,0 +1,215 @@ +{ + "schema": { + "type": "object", + "properties": { + "accept": { + "title": "接受上传的文件类型(thumbnail-mode 模式下此参数无效)", + "type": "string", + "default": "" + }, + "action": { + "title": "上传的服务地址,当不配置 action 时,会连接默认的网关地址", + "type": "string", + "default": "" + }, + "auto-upload": { + "title": "是否在选取文件后立即进行上传", + "type": "boolean", + "default": true + }, + "$$data": { + "title": "上传时附带的额外参数", + "type": "object" + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "drag": { + "title": "是否启用拖拽上传", + "type": "boolean", + "default": false + }, + "$$dragger": { + "title": "拖拽器", + "type": "boolean", + "default": false + }, + "$$edm": { + "title": "使用 EDM 的上传下载预览功能,可在该对象里边配置上传、下载、预览功能的参数", + "type": "object", + "default": "", + "properties": { + "updateId": { + "title": "EDM 需要更新文档的 docId", + "type": "string", + "default": "" + }, + "upload": { + "title": "配置 EDM 上传功能所需的参数,例如:edm:{upload:{plugin:sha256,token:()=>{}}},plugin 为第三方依赖可生成文档内容校验 hash 值,token为鉴权token,类型为Function,返回 Promise", + "type": "object", + "properties": { + "plugin": { + "title": "依赖的第三方插件 js-sha256 的对象", + "type": "object" + }, + "isFolder": { + "title": "是否启用 EDM 上传文件夹的功能,若配置为 true,最多只能上传 5 层;{edm:upload:{plugin:sha256,isFolder:true,token:()=>{}}}", + "type": "boolean", + "default": false + }, + "levelCode": { + "title": "标签密级", + "type": "string", + "enum": ["C", "S", "IP", "EP", "GI", "KI", "SI"], + "enumNames": ["机密", "秘密", "内部公开", "外部公开", "普通信息", "关键信息", "保密信息"] + }, + "finalSite": { + "title": "指定文档永久存储站点", + "type": "string" + }, + "textStyle": { + "title": "标签名称", + "type": "string" + } + } + }, + "download": { + "title": "配置 EDM 下载功能所需的参数,例如:edm:{download:{token:()=>{}}},token为鉴权token", + "type": "object" + }, + "preivew": { + "title": "配置 EDM 预览功能所需的参数,例如:edm:{preview:{plugin:util.default,previewUrl:./_index.html?appid=应用Id,packageName: 'jslib',token:()=>{}}}", + "type": "object", + "properties": { + "online": { + "title": "线上预览", + "type": "object", + "properties": { + "showdownload": { + "title": "在预览界面隐藏下载按钮,'hide'为隐藏下载按钮,其他值为显示", + "type": "string" + }, + "appid": { + "title": "应用ID", + "type": "string" + }, + "baseurl": { + "title": "请求的基准路径", + "type": "string", + "enum": ["http://example.com/", "https://example.com/"], + "enumNames": ["内网 UAT 地址", "内网 PRO 地址"] + }, + "jslibhtml": { + "title": "预览包静态资源地址", + "type": "string", + "enum": ["http://example.com/index.html?", "http://example.com/index.html?"], + "enumNames": ["内网 UAT 地址", "内网 PRO 地址"] + } + } + }, + "watermark": { + "title": "预览水印", + "type": "object", + "properties": { + "showWatermark": { + "title": "水印宽度", + "type": "number" + }, + "text": { + "title": "水印文本", + "type": "string" + }, + "rotation": { + "title": "水印旋转角度", + "type": "number" + } + } + } + } + } + } + }, + "$$ext-icons": { + "title": "设置自定义文件类型图标,根据扩展名定义,默认由组件内部提供", + "type": "object" + }, + "$$file-list": { + "title": "上传的文件列表, 例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}]", + "type": "array", + "default": [] + }, + "$$headers": { + "title": "设置上传的请求头部", + "type": "object" + }, + "limit": { + "title": "最大允许上传个数", + "type": "number" + }, + "list-type": { + "title": "文件列表的类型", + "type": "string", + "enum": ["text", "picture", "picture-card"], + "enumNames": ["文字", "缩略图", "照片墙"], + "default": "text" + }, + "mergeService": { + "title": "配置 mergeService 为true 且开启多文件上传走默认服务会将多个上传服务合并为一个服务上传", + "type": "boolean", + "default": false + }, + "$$mini-mode": { + "title": "设置 mini 模式", + "type": "boolean", + "default": false + }, + "multiple": { + "title": "是否支持多选文件", + "type": "boolean", + "default": false + }, + "$$name": { + "title": "上传的文件字段名", + "type": "string", + "default": "file" + }, + "open-download-file": { + "title": "是否开启点击下载文件", + "type": "boolean", + "default": false + }, + "show-file-list": { + "title": "是否显示已上传文件列表", + "type": "boolean", + "default": true + }, + "size": { + "title": "设置按钮尺寸,为单个按钮且按钮为 AUI 的 Button 组件时生效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "$$type": { + "title": "文本", + "type": "string", + "default": "select" + }, + "with-credentials": { + "title": "支持发送 cookie 凭证信息", + "type": "boolean", + "default": true + }, + "#tip": { + "title": "提示说明文字", + "type": "string" + }, + "#trigger": { + "title": "触发文件选择框的内容", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/floatbar.json b/packages/settings/design/src/properties/floatbar.json new file mode 100644 index 0000000..72c3d8f --- /dev/null +++ b/packages/settings/design/src/properties/floatbar.json @@ -0,0 +1,11 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/flow-chart.json b/packages/settings/design/src/properties/flow-chart.json new file mode 100644 index 0000000..e8ab0ff --- /dev/null +++ b/packages/settings/design/src/properties/flow-chart.json @@ -0,0 +1,70 @@ +{ + "schema": { + "type": "object", + "properties": { + "arrow-end": { + "title": "设置线条末端的形状", + "type": "string", + "default": "block", + "enum": ["block", "line"], + "enumNames": ["箭头", "线条"] + }, + "element-color": { + "title": "设置节点颜色", + "type": "string", + "default": "black" + }, + "fill": { + "title": "设置节点填充颜色", + "type": "string", + "default": "white" + }, + "font-color": { + "title": "设置字体颜色", + "type": "string", + "default": "black" + }, + "font-size": { + "title": "设置文本的字体大小", + "type": "number", + "default": 12 + }, + "line-color": { + "title": "设置线条颜色", + "type": "string", + "default": "black" + }, + "line-length": { + "title": "设置线条长度", + "type": "number", + "default": 50 + }, + "line-width": { + "title": "设置线条宽度", + "type": "number", + "default": 2 + }, + "no-text": { + "title": "设置 no 分支显示文本", + "type": "string", + "default": "no" + }, + "scale": { + "title": "设置缩放比例", + "type": "number", + "default": 1, + "enum": [0.5, 1, 2], + "enumNames": ["缩小 1 倍显示", "正常比例显示", "放大 2 倍显示"] + }, + "$$value": { + "title": "设置复杂流程图的数据", + "type": "array" + }, + "yes-text": { + "title": "设置 yes 分支显示文本", + "type": "string", + "default": "yes" + } + } + } +} diff --git a/packages/settings/design/src/properties/form-item.json b/packages/settings/design/src/properties/form-item.json new file mode 100644 index 0000000..60b4443 --- /dev/null +++ b/packages/settings/design/src/properties/form-item.json @@ -0,0 +1,57 @@ +{ + "schema": { + "type": "object", + "properties": { + "error": { + "title": "表单域验证错误信息, 设置该值会使表单验证状态变为error,并显示该错误信息", + "type": "string" + }, + "inline-message": { + "title": "以行内形式展示校验信息", + "type": "boolean", + "default": false + }, + "label": { + "title": "标签文本", + "type": "string" + }, + "label-width": { + "title": "表单域标签的的宽度,例如 '50px'。支持 auto", + "type": "string" + }, + "prop": { + "title": "表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的", + "type": "string" + }, + "required": { + "title": "是否必填,如不设置,则会根据校验规则自动生成", + "type": "boolean", + "default": false + }, + "$$rules": { + "title": "表单验证规则", + "type": "object" + }, + "show-message": { + "title": "是否显示校验错误信息", + "type": "boolean", + "default": true + }, + "size": { + "title": "用于控制该表单域下组件的尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#label": { + "title": "标签文本的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/form.json b/packages/settings/design/src/properties/form.json new file mode 100644 index 0000000..f0b279b --- /dev/null +++ b/packages/settings/design/src/properties/form.json @@ -0,0 +1,81 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用该表单内的所有组件。若设置为 true,则表单内组件上的 disabled 属性不再生效", + "type": "boolean", + "default": false + }, + "hide-required-asterisk": { + "title": "是否隐藏必填字段的标签旁边的红色星号", + "type": "boolean", + "default": false + }, + "inline": { + "title": "行内布局模式", + "type": "boolean", + "default": false + }, + "inline-message": { + "title": "是否以行内形式展示校验信息", + "type": "boolean", + "default": false + }, + "label-position": { + "title": "表单中标签的布局位置", + "type": "string", + "enum": ["right", "left", "top"], + "enumNames": ["右对齐", "左对齐", "顶部对齐"], + "default": "right" + }, + "label-suffix": { + "title": "表单中标签后缀 ", + "type": "string", + "default": "" + }, + "label-width": { + "title": "表单中标签占位宽度,默认为 80px ", + "type": "string", + "default": "80px" + }, + "$$model": { + "title": "表单数据对象", + "type": "object" + }, + "$$rules": { + "title": "表单验证规则", + "type": "object" + }, + "show-message": { + "title": "是否显示校验错误信息", + "type": "boolean", + "default": true + }, + "size": { + "title": "用于控制该表单内组件的尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "validate-on-rule-change": { + "title": "是否在 rules 属性改变后立即触发一次验证", + "type": "boolean", + "default": true + }, + "$$validate-position": { + "title": "自定义校验提示出现的位置", + "type": "string" + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#label": { + "title": "标签文本插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/gantt.json b/packages/settings/design/src/properties/gantt.json new file mode 100644 index 0000000..92a8ebc --- /dev/null +++ b/packages/settings/design/src/properties/gantt.json @@ -0,0 +1,51 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "columns": { + "title": "甘特图列配置", + "type": "array", + "default": "" + }, + "configs": { + "title": "dates,scale,controls等的配置选项", + "type": "object", + "default": "" + }, + "events": { + "title": "包括所有处理事件", + "type": "object", + "default": "" + }, + "locale": { + "title": "设置组件的国际化", + "type": "object", + "default": "" + }, + "scale": { + "title": "刻度,可以配置数组中设置对象来指定任意数量的刻度", + "type": "object", + "default": "" + }, + "skin": { + "title": "设置甘特图皮肤", + "type": "string", + "default": "" + }, + "subscales": { + "title": "指定第二时间刻度", + "type": "array", + "default": "" + }, + "tasks": { + "type": "object", + "default": "" + }, + "width": { + "title": "设置甘特图的宽度,不设置时,甘特图宽度自适应", + "type": "string", + "default": "500px" + } + } + } +} diff --git a/packages/settings/design/src/properties/grid-column.json b/packages/settings/design/src/properties/grid-column.json new file mode 100644 index 0000000..8ea5e7f --- /dev/null +++ b/packages/settings/design/src/properties/grid-column.json @@ -0,0 +1,229 @@ +{ + "schema": { + "type": "object", + "properties": { + "align": { + "title": "列对其方式", + "type": "string", + "enum": ["left", "right", "center"], + "enumNames": ["左对齐", "右对齐", "居中对齐"], + "default": "left" + }, + "class-name": { + "title": "给单元格附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "$$editor": { + "title": "单元格编辑渲染配置项,也可以是函数 Function(h, params)", + "type": "object" + }, + "field": { + "title": "设置表格列对应数据源的字段名,注意:该属性配置不支持含'.',数字开头的字符串,不支持中文,不支持列字段重复(会导致配置个性化设置,自定义列拖动无效)", + "type": "string", + "default": "" + }, + "filter": { + "title": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息", + "type": "boolean", + "default": false + }, + "$$filter": { + "title": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息", + "type": "object" + }, + "fixed": { + "title": "将列固定在左侧或者右侧(注意:固定列应该放在左右两侧的位置)", + "type": "string", + "enum": ["left", "right"], + "enumNames": ["左侧", "右侧"], + "default": "" + }, + "footer-align": { + "title": "表尾列的对齐方式", + "type": "string", + "enum": ["left", "right", "center"], + "enumNames": ["左对齐", "右对齐", "居中对齐"], + "default": "" + }, + "footer-class-name": { + "title": "给表尾的单元格附加 className,也可以是函数 Function({$rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "$$format-config": { + "title": "开启该列数据异步渲染", + "type": "object" + }, + "format-text": { + "title": "设置当前表格列的显示获取编辑类型,也可以是函数 Function(params)", + "type": "string", + "enum": [ + "money", + "enum", + "number", + "integer", + "filesize", + "date", + "dateTime", + "longDateTime", + "time", + "longTime", + "yearMonth", + "ellipsis", + "rate", + "boole" + ], + "enumNames": [ + "金额", + "枚举", + "小数", + "整数", + "文件大小", + "年月日", + "年月日时分", + "年月日时分秒", + "时分", + "时分秒", + "年月", + "省略号,hover 时提示全部内容", + "百分比", + "对号或者叉号的图标" + ], + "default": "" + }, + "header-align": { + "title": "表头列的对齐方式", + "type": "string", + "enum": ["left", "right", "center"], + "enumNames": ["左对齐", "右对齐", "居中对齐"], + "default": "left" + }, + "header-class-name": { + "title": "给表头的单元格附加 className,也可以是函数 Function({$rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "min-width": { + "title": "最小列宽度;会自动将剩余空间按比例分配,值可以为整数, px,%,", + "type": ["string", "number"] + }, + "multi": { + "title": "是 filter 对象内置的属性,筛选是否允许多选", + "type": "boolean", + "default": true + }, + "$$params": { + "title": "额外的参数(自定义一些数据参数,对于某些特殊的场景可能会用到)", + "type": "object" + }, + "remote-sort": { + "title": "是否使用服务端排序,如果设置为 true 则不会对数据进行处理", + "type": "boolean", + "default": false + }, + "$$renderer": { + "title": "单元格渲染配置项,其优先级高于列的 formatText 属性配置,也可以是函数 Function(h, params)", + "type": "object" + }, + "required": { + "title": "是否必填,如不设置,则会根据校验规则自动生成", + "type": "boolean", + "default": false + }, + "resizable": { + "title": "设置是否允许调整列宽", + "type": "boolean", + "default": true + }, + "$$rules": { + "title": "表单的验证功能", + "type": "object" + }, + "show-header-overflow": { + "title": "当表头内容过长时显示为省略号", + "type": ["string", "boolean"], + "enum": ["ellipsis", "title", "tooltip"], + "enumNames": [ + "只显示省略号", + "显示省略号并且 hover 时显示原生 title 提示", + "显示省略号并且 hover 时显示 tooltip 提示" + ] + }, + "show-header-tip": { + "title": "表格列头是否需要提示", + "type": "boolean", + "default": false + }, + "show-icon": { + "title": "是否显示列头编辑图标,在编辑时有效", + "type": "boolean", + "default": true + }, + "show-overflow": { + "title": "当内容过长时显示为省略号", + "type": ["string", "boolean"], + "enum": ["ellipsis", "title", "tooltip"], + "enumNames": [ + "只显示省略号", + "显示省略号并且 hover 时显示原生 title 提示", + "显示省略号并且 hover 时显示 tooltip 提示" + ] + }, + "show-tip": { + "title": "表格列单元格是否需要提示", + "type": "boolean", + "default": false + }, + "sort-by": { + "title": "只对 sortable 有效,自定义排序的属性", + "type": "string", + "default": "" + }, + "$$sort-by": { + "title": "只对 sortable 有效,自定义排序的属性", + "type": "array", + "default": "" + }, + "sortable": { + "title": "设置是否允许列数据排序。默认为 true 可排序", + "type": "boolean", + "default": true + }, + "title": { + "title": "列标题(支持开启国际化),也可以是函数 Function(h, params)", + "type": "string", + "default": "" + }, + "tree-node": { + "title": "只对 tree-config 配置时有效,指定为树节点", + "type": "boolean", + "default": false + }, + "type": { + "title": "列的类型", + "type": "string", + "enum": ["index", "selection", "radio", "expand"], + "enumNames": ["序号列", "复选框列", "单选框列", "展开行"], + "default": "" + }, + "width": { + "title": "设置列的宽度,可以是像素或者百分比或者'auto',设置为'auto'时,列宽会自动适应", + "type": ["string", "number"] + }, + "#default": { + "title": "自定义显示内容模板插槽", + "type": "string" + }, + "#edit": { + "title": "自定义可编辑组件模板插槽", + "type": "string" + }, + "#filter": { + "title": "自定义筛选模板插槽", + "type": "string" + }, + "#header": { + "title": "自定义表头内容的模板插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/grid-toolbar.json b/packages/settings/design/src/properties/grid-toolbar.json new file mode 100644 index 0000000..528fc9b --- /dev/null +++ b/packages/settings/design/src/properties/grid-toolbar.json @@ -0,0 +1,79 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$buttons": { + "title": "按钮列表", + "type": "array", + "default": [] + }, + "full-screen": { + "title": "设置工具栏属性是否显示全屏按钮", + "type": "boolean", + "default": false + }, + "id": { + "title": "唯一 ID 标识", + "type": "string" + }, + "loading": { + "title": "是否加载中", + "type": "boolean", + "default": false + }, + "refresh": { + "title": "工具栏组件开启表格刷新功能", + "type": "boolean", + "default": false + }, + "$$refresh": { + "title": "工具栏组件开启表格刷新功能", + "type": "object" + }, + "resizable": { + "title": "列宽拖动配置(需要设置 id)", + "type": "boolean", + "default": true + }, + "$$resizable": { + "title": "列宽拖动配置(需要设置 id)", + "type": "object", + "properties": { + "storage": { + "title": "调整列宽是否保存在本地的 localStroage 里", + "type": "boolean", + "default": false + } + } + }, + "setting": { + "title": "设置工具栏属性是否显示个性化配置(需要设置 id)", + "type": "boolean", + "default": false + }, + "$$setting": { + "title": "设置工具栏属性是否显示个性化配置(需要设置 id)", + "type": "object" + }, + "size": { + "title": "尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "#buttons": { + "title": "按钮列表插槽", + "type": "string" + }, + "#toolbar": { + "title": "工具栏插槽", + "type": "string" + }, + "#tools": { + "title": "右侧工具列表插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/grid.json b/packages/settings/design/src/properties/grid.json new file mode 100644 index 0000000..06dcf91 --- /dev/null +++ b/packages/settings/design/src/properties/grid.json @@ -0,0 +1,750 @@ +{ + "schema": { + "type": "object", + "properties": { + "align": { + "title": "所有的列对其方式", + "type": "string", + "enum": ["left", "center", "right"], + "enumNames": ["左对齐", "居中对齐", "右对齐"], + "default": "left" + }, + "auto-load": { + "title": "是否开启自动请求服务,配置 fetch-data 时有效,该属性的默认值为 true", + "type": "boolean", + "default": true + }, + "auto-resize": { + "title": "父元素响应式监听(对于父元素可能存在动态变化的场景可能会用到)", + "type": "boolean", + "default": false + }, + "border": { + "title": "是否带有纵向边框", + "type": "boolean", + "default": false + }, + "cell-class-name": { + "title": "给单元格附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "column-key": { + "title": "是否需要为每一列的 VNode 设置 key 属性(非特殊情况下不需要使用)", + "type": "boolean", + "default": false + }, + "column-min-width": { + "title": "设置可以调整到的最小宽度,不设置时默认为列头 span 的宽度 + 36(头部固定宽度)值可以为整数, px,% ", + "type": ["string", "number"] + }, + "column-width": { + "title": "所有列宽度,值可以为整数, px,%,默认均匀分配", + "type": ["string", "number"] + }, + "columns": { + "title": "表格列的配置信息,具体参考列配置项", + "type": "array", + "items": { + "properties": { + "align": { + "title": "列对其方式", + "type": "string", + "enum": ["left", "right", "center"], + "enumNames": ["左对齐", "右对齐", "居中对齐"], + "default": "left" + }, + "class-name": { + "title": "给单元格附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "$$editor": { + "title": "单元格编辑渲染配置项,也可以是函数 Function(h, params)", + "type": "object", + "properties": { + "test1": { + "title": "最小列宽度;会自动将剩余空间按比例分配,值可以为整数, px,%,", + "type": ["string", "number"] + }, + "test2": { + "title": "是 filter 对象内置的属性,筛选是否允许多选", + "type": "boolean", + "default": true + }, + "test3": { + "title": "额外的参数(自定义一些数据参数,对于某些特殊的场景可能会用到)", + "type": "object" + }, + "test4": { + "title": "是否使用服务端排序,如果设置为 true 则不会对数据进行处理", + "type": "boolean", + "default": false + }, + "test5": { + "title": "单元格渲染配置项,其优先级高于列的 formatText 属性配置,也可以是函数 Function(h, params)", + "type": "object" + }, + "test6": { + "title": "是否必填,如不设置,则会根据校验规则自动生成", + "type": "boolean", + "default": false + }, + "test7": { + "title": "设置是否允许调整列宽", + "type": "boolean", + "default": true + } + } + }, + "field": { + "title": "设置表格列对应数据源的字段名,注意:该属性配置不支持含'.',数字开头的字符串,不支持中文,不支持列字段重复(会导致配置个性化设置,自定义列拖动无效)", + "type": "string", + "default": "" + }, + "filter": { + "title": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息", + "type": "boolean", + "default": false + }, + "$$filter": { + "title": "设置表格列的筛选配置信息。默认值为 false 不配置筛选信息", + "type": "object" + }, + "fixed": { + "title": "将列固定在左侧或者右侧(注意:固定列应该放在左右两侧的位置)", + "type": "string", + "enum": ["left", "right"], + "enumNames": ["左侧", "右侧"], + "default": "" + }, + "footer-align": { + "title": "表尾列的对齐方式", + "type": "string", + "enum": ["left", "right", "center"], + "enumNames": ["左对齐", "右对齐", "居中对齐"], + "default": "" + }, + "footer-class-name": { + "title": "给表尾的单元格附加 className,也可以是函数 Function({$rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "$$format-config": { + "title": "开启该列数据异步渲染", + "type": "object" + }, + "format-text": { + "title": "设置当前表格列的显示获取编辑类型,也可以是函数 Function(params)", + "type": "string", + "enum": [ + "money", + "enum", + "number", + "integer", + "filesize", + "date", + "dateTime", + "longDateTime", + "time", + "longTime", + "yearMonth", + "ellipsis", + "rate", + "boole" + ], + "enumNames": [ + "金额", + "枚举", + "小数", + "整数", + "文件大小", + "年月日", + "年月日时分", + "年月日时分秒", + "时分", + "时分秒", + "年月", + "省略号,hover 时提示全部内容", + "百分比", + "对号或者叉号的图标" + ], + "default": "" + }, + "header-align": { + "title": "表头列的对齐方式", + "type": "string", + "enum": ["left", "right", "center"], + "enumNames": ["左对齐", "右对齐", "居中对齐"], + "default": "left" + }, + "header-class-name": { + "title": "给表头的单元格附加 className,也可以是函数 Function({$rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "min-width": { + "title": "最小列宽度;会自动将剩余空间按比例分配,值可以为整数, px,%,", + "type": ["string", "number"] + }, + "multi": { + "title": "是 filter 对象内置的属性,筛选是否允许多选", + "type": "boolean", + "default": true + }, + "$$params": { + "title": "额外的参数(自定义一些数据参数,对于某些特殊的场景可能会用到)", + "type": "object" + }, + "remote-sort": { + "title": "是否使用服务端排序,如果设置为 true 则不会对数据进行处理", + "type": "boolean", + "default": false + }, + "$$renderer": { + "title": "单元格渲染配置项,其优先级高于列的 formatText 属性配置,也可以是函数 Function(h, params)", + "type": "object" + }, + "required": { + "title": "是否必填,如不设置,则会根据校验规则自动生成", + "type": "boolean", + "default": false + }, + "resizable": { + "title": "设置是否允许调整列宽", + "type": "boolean", + "default": true + }, + "$$rules": { + "title": "表单的验证功能", + "type": "object" + }, + "show-header-overflow": { + "title": "当表头内容过长时显示为省略号", + "type": ["string", "boolean"], + "enum": ["ellipsis", "title", "tooltip"], + "enumNames": [ + "只显示省略号", + "显示省略号并且 hover 时显示原生 title 提示", + "显示省略号并且 hover 时显示 tooltip 提示" + ] + }, + "show-header-tip": { + "title": "表格列头是否需要提示", + "type": "boolean", + "default": false + }, + "show-icon": { + "title": "是否显示列头编辑图标,在编辑时有效", + "type": "boolean", + "default": true + }, + "show-overflow": { + "title": "当内容过长时显示为省略号", + "type": ["string", "boolean"], + "enum": ["ellipsis", "title", "tooltip"], + "enumNames": [ + "只显示省略号", + "显示省略号并且 hover 时显示原生 title 提示", + "显示省略号并且 hover 时显示 tooltip 提示" + ] + }, + "show-tip": { + "title": "表格列单元格是否需要提示", + "type": "boolean", + "default": false + }, + "sort-by": { + "title": "只对 sortable 有效,自定义排序的属性", + "type": "string", + "default": "" + }, + "$$sort-by": { + "title": "只对 sortable 有效,自定义排序的属性", + "type": "array", + "default": "" + }, + "sortable": { + "title": "设置是否允许列数据排序。默认为 true 可排序", + "type": "boolean", + "default": true + }, + "title": { + "title": "列标题(支持开启国际化),也可以是函数 Function(h, params)", + "type": "string", + "default": "" + }, + "tree-node": { + "title": "只对 tree-config 配置时有效,指定为树节点", + "type": "boolean", + "default": false + }, + "type": { + "title": "列的类型", + "type": "string", + "enum": ["index", "selection", "radio", "expand"], + "enumNames": ["序号列", "复选框列", "单选框列", "展开行"], + "default": "" + }, + "width": { + "title": "设置列的宽度,可以是像素或者百分比或者'auto',设置为'auto'时,列宽会自动适应", + "type": ["string", "number"] + }, + "#default": { + "title": "自定义显示内容模板插槽", + "type": "string" + }, + "#edit": { + "title": "自定义可编辑组件模板插槽", + "type": "string" + }, + "#filter": { + "title": "自定义筛选模板插槽", + "type": "string" + }, + "#header": { + "title": "自定义表头内容的模板插槽", + "type": "string" + } + } + } + }, + "$$context-menu": { + "title": "菜单的配置信息", + "type": "object" + }, + "$$data": { + "title": "设置表格的数据", + "type": "array" + }, + "$$delete-data": { + "title": "服务端数据删除方法", + "type": "object" + }, + "$$drop-config": { + "title": "表格行上下拖拽配置信息", + "type": "object" + }, + "$$edit-config": { + "title": "编辑配置", + "type": "object", + "properties": { + "trigger": { + "title": "触发激活编辑的方式", + "type": "string", + "default": "click", + "enum": ["click", "dblclick", "manual"], + "enumNames": ["单击触发", "双击触发", "手动触发,行编辑下生效"] + }, + "mode": { + "title": "激活类型", + "type": "string", + "default": "cell", + "enum": ["cell", "row"], + "enumNames": ["单元格编辑", "行编辑"] + }, + "showStatus": { + "title": "是否显示编辑状态", + "type": "boolean", + "default": true + } + } + }, + "$$edit-rules": { + "title": "校验规则配置项", + "type": "object" + }, + "$$events": { + "title": "事件对象", + "type": "object" + }, + "$$expand-config": { + "title": "展开行配置项", + "type": "object" + }, + "expand-last-column": { + "title": "是否展开最后一列", + "type": "boolean", + "default": false + }, + "$$fetch-data": { + "title": "服务端数据查询方法", + "type": "object" + }, + "fit": { + "title": "所有列的宽度是否自撑开", + "type": "boolean", + "default": true + }, + "footer-align": { + "title": "所有的表尾列的对齐方式", + "type": "string", + "enum": ["left", "center", "right"], + "enumNames": ["左对齐", "居中对齐", "右对齐"], + "default": "left" + }, + "footer-cell-class-name": { + "title": "给表尾的单元格附加 className,也可以是函数 Function({$rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "footer-row-class-name": { + "title": "给表尾的行附加 className,也可以是函数 Function({$rowIndex})", + "type": "string" + }, + "$$head-custom": { + "title": "设置自定义表头的容器选择器", + "type": "string", + "default": "" + }, + "header-align": { + "title": "所有的表头列的对齐方式", + "type": "string", + "enum": ["left", "center", "right"], + "enumNames": ["左对齐", "居中对齐", "右对齐"], + "default": "left" + }, + "header-cell-class-name": { + "title": "给表头的单元格附加 className,也可以是函数 Function({$rowIndex, column, columnIndex, $columnIndex})", + "type": "string" + }, + "header-row-class-name": { + "title": "给表头的行附加 className,也可以是函数 Function({$rowIndex})", + "type": "string" + }, + "height": { + "title": "表格的高度;支持铺满父容器或者固定宽高,值可以为整数, px,%", + "type": ["string", "number"] + }, + "highlight-cell": { + "title": "只对 editConfig 配置时有效,是否在编辑时高亮单元格边框", + "type": "boolean", + "default": false + }, + "highlight-current-column": { + "title": "是否要高亮当前列", + "type": "boolean", + "default": false + }, + "highlight-current-row": { + "title": "是否要高亮当前行", + "type": "boolean", + "default": false + }, + "highlight-hover-column": { + "title": "鼠标移到列是否要高亮显示", + "type": "boolean", + "default": false + }, + "highlight-hover-row": { + "title": "鼠标移到行是否要高亮显示", + "type": "boolean", + "default": false + }, + "is-async-column": { + "title": "是否开启异步列功能,配合 scrollLoad 一起使用", + "type": "boolean", + "default": false + }, + "$$keyboard-config": { + "title": "按键配置项,配置 :keyboard-config={isArrow: true} 属性启用方向键功能", + "type": "object" + }, + "loading": { + "title": "表格是否显示加载中", + "type": "boolean", + "default": true + }, + "max-height": { + "title": "设置表格内容区域(不含表格头部,底部)的最大高度", + "type": ["string", "number"] + }, + "min-height": { + "title": "设置表格内容区域(不含表格头部,底部)的最小高度", + "type": ["string", "number"] + }, + "$$mouse-config": { + "title": "鼠标配置项,mouse-config {selected: true 是否开启左键选中功能 默认为false }", + "type": "object" + }, + "$$optimization": { + "title": "优化配置项", + "type": "object", + "properties": { + "animat": { + "title": "是否开启动画效果", + "type": "boolean", + "default": true + }, + "delayHover": { + "title": "当表格发生拖动、滚动等行为时,至少多少毫秒之后才允许触发 hover 事件", + "type": "number", + "default": 250 + }, + "scrollX": { + "title": "横向 X 虚拟滚动配置", + "type": "number", + "properties": { + "gt": { + "title": "指定大于多少范围时自动启动虚拟滚动(启用 X 虚拟滚动,必须固定所有列宽,否则无法兼容)", + "type": "number", + "default": 100 + }, + "oSize": { + "title": "当剩余数据少于指定范围时触发重新渲染 默认自动计算", + "type": "number", + "default": 2 + }, + "rSize": { + "title": "每次渲染条数 默认自动计算", + "type": "number", + "default": 2 + }, + "vSize": { + "title": "指定可视区域条数", + "type": "number", + "default": 5 + } + } + }, + "scrollY": { + "title": "纵向 Y 虚拟滚动配置", + "type": "number", + "properties": { + "gt": { + "title": "指定大于多少范围时自动启动虚拟滚动(启用 Y 虚拟滚动,必须固定所有行高,否则无法兼容)", + "type": "number", + "default": 500 + }, + "oSize": { + "title": "当剩余数据少于指定范围时触发重新渲染 默认自动计算", + "type": "number", + "default": 2 + }, + "rSize": { + "title": "每次渲染条数 默认自动计算", + "type": "number", + "default": 2 + }, + "vSize": { + "title": "指定可视区域条数 默认自动计算", + "type": "number", + "default": 5 + }, + "rHeight": { + "title": "指定行高 默认自动计算", + "type": "number", + "default": 50 + }, + "adaptive": { + "title": "自动适配最优的渲染方式", + "type": "boolean", + "default": true + } + } + } + } + }, + "$$pager": { + "title": "分页配置项", + "type": "object" + }, + "$$params": { + "title": "额外的参数", + "type": "object" + }, + "$$radio-config": { + "title": "单选框配置项,可以配置单选框的默认选中项和禁用配置等特性", + "type": "object" + }, + "remote-filter": { + "title": "所有列是否使用服务端筛选,如果设置为 true 则不会对数据进行处理", + "type": "boolean", + "default": false + }, + "remote-sort": { + "title": "是否将服务端的全部数据进行排序。默认为 false 不进行服务端排序", + "type": "boolean", + "default": false + }, + "resizable": { + "title": "设置是否允许调整列宽", + "type": "boolean", + "default": true + }, + "row-class-name": { + "title": "给行附加 className,也可以是函数 Function({seq, row, rowIndex, $rowIndex})", + "type": "string" + }, + "$$row-group": { + "title": "设置行分组", + "type": "object" + }, + "row-id": { + "title": "自定义行数据唯一主键的字段名(行数据必须要有唯一主键,默认自动生成)", + "type": "string", + "default": "_RID" + }, + "row-key": { + "title": "是否需要为每一行的 VNode 设置 key 属性(非特殊情况下没必要设置)", + "type": "boolean", + "default": false + }, + "$$row-span": { + "title": "设置行合并,该属性仅适用于普通表格,不可与 tree-config 同时使用", + "type": "array" + }, + "$$save-data": { + "title": "服务端数据保存方法", + "type": "object" + }, + "$$scroll-load": { + "title": "滚动加载配置", + "type": "object", + "properties": { + "pageSize": { + "title": "每次加载多少条", + "type": "number", + "default": 10 + }, + "isInfinity": { + "title": "是否连续", + "type": "boolean", + "default": false + } + } + }, + "$$select-config": { + "title": "复选框配置项", + "type": "object" + }, + "seq-serial": { + "title": "设置行序号是否连续,开启分页时有效,该属性的默认值为 false", + "type": "boolean", + "default": false + }, + "show-footer": { + "title": "是否显示表尾合计", + "type": "boolean", + "default": false + }, + "show-header": { + "title": "是否显示表头", + "type": "boolean", + "default": false + }, + "show-header-overflow": { + "title": "设置表头所有内容过长时显示为省略号", + "type": ["string", "boolean"], + "enum": ["ellipsis", "title", "tooltip"], + "enumNames": [ + "只显示省略号", + "显示省略号并且 hover 时显示原生 title 提示", + "显示省略号并且 hover 时显示 tooltip 提示" + ] + }, + "show-overflow": { + "title": "设置所有内容过长时显示为省略号(如果是固定列建议设置该值,提升渲染速度)", + "type": ["string", "boolean"], + "enum": ["ellipsis", "title", "tooltip"], + "enumNames": [ + "只显示省略号", + "显示省略号并且 hover 时显示原生 title 提示", + "显示省略号并且 hover 时显示 tooltip 提示" + ] + }, + "size": { + "title": "表格的尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "$$sort-config": { + "title": "排序配置项", + "type": "object", + "properties": { + "trigger": { + "title": "点击头部单元格触发排序", + "type": "string", + "default": "default", + "enum": ["cell", "default"], + "enumNames": ["点击头部单元格触发排序", "点击上下箭头触发排序"] + } + } + }, + "sortable": { + "title": "设置是否允许列数据排序。默认为 true 可排序", + "type": "boolean", + "default": true + }, + "start-index": { + "title": "只对 type=index 的列有效,动态索引的起始值", + "type": "number", + "default": 0 + }, + "stripe": { + "title": "是否带有斑马纹", + "type": "boolean", + "default": false + }, + "$$summary-config": { + "title": "设置表格统计功能", + "type": "object", + "properties": { + "fields": { + "title": "统计字段名", + "type": "array" + }, + "fraction": { + "title": "小数点后保留的小数位", + "type": "number", + "default": 2 + }, + "truncate": { + "title": "是否截断", + "type": "boolean", + "default": false + }, + "text": { + "title": "统计显示的文本", + "type": "string", + "default": "" + } + } + }, + "sync-resize": { + "title": "响应式跟随某个属性(对于通过某个属性来控制显示/隐藏切换的场景可能会用到)", + "type": "boolean", + "default": false + }, + "$$toolbar": { + "title": "工具栏配置", + "type": "object" + }, + "$$tooltip-config": { + "title": "tooltip 配置项", + "type": "object" + }, + "$$tree-config": { + "title": "树形结构配置项", + "type": "object" + }, + "$$valid-config": { + "title": "校验配置项", + "type": "object" + }, + "#default": { + "title": "默认插槽(表格列 )", + "type": "string" + }, + "#empty": { + "title": "空数据时显示的文本内容插槽", + "type": "string" + }, + "#pager": { + "title": "分页插件插槽,", + "type": "string" + }, + "#toolbar": { + "title": "工具栏插槽,(包含:缩放、个性化、刷新表格、自定义按钮)", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/hrapprover.json b/packages/settings/design/src/properties/hrapprover.json new file mode 100644 index 0000000..423d2f0 --- /dev/null +++ b/packages/settings/design/src/properties/hrapprover.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "approval-person": { + "title": "权签人", + "type": "string", + "default": "" + }, + "category": { + "title": "默认权签类别", + "type": "string", + "default": "0303" + }, + "disabled": { + "title": "设置组件是否为禁用状态", + "type": "boolean", + "default": false + }, + "value": { + "title": "设置权签人的值", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/image.json b/packages/settings/design/src/properties/image.json new file mode 100644 index 0000000..df58093 --- /dev/null +++ b/packages/settings/design/src/properties/image.json @@ -0,0 +1,52 @@ +{ + "schema": { + "type": "object", + "properties": { + "fit": { + "title": "确定图片如何适应容器框,同原生 object-fit", + "type": "string", + "enum": ["fill", "contain", "cover", "none", "scale-down"], + "enumNames": [ + "被替换的内容将被缩放,以在填充元素的内容框时保持其宽高比", + "被替换的内容大小可以填充元素的内容框", + "被替换的内容大小保持其宽高比,同时填充元素的整个内容框", + "被替换的内容尺寸不会被改变", + "内容的尺寸就像是指定了none 或 contain,取决于哪一个将导致更小的对象尺寸" + ], + "default": "" + }, + "lazy": { + "title": "是否开启懒加载", + "type": "boolean", + "default": false + }, + "$$preview-src-list": { + "title": "开启图片预览功能", + "type": "array", + "default": [] + }, + "scroll-container": { + "title": "开启懒加载后,监听 scroll 事件的容器,默认值为最近一个 overflow 值为 auto 或 scroll 的父元素", + "type": "string", + "default": "" + }, + "src": { + "title": "图片源,同原生src属性", + "type": "string" + }, + "z-index": { + "title": "设置图片预览的 z-index", + "type": "number", + "default": 2000 + }, + "#error": { + "title": "加载失败的内容插槽", + "type": "string" + }, + "#placeholder": { + "title": "图片未加载的占位内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/index.js b/packages/settings/design/src/properties/index.js new file mode 100644 index 0000000..a05f187 --- /dev/null +++ b/packages/settings/design/src/properties/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 files = import.meta.globEager('./*.json') +const modules = {} + +for (const key in files) { + if (Object.prototype.hasOwnProperty.call(files, key)) { + modules[key.replace(/(\.\/|\.json)/g, '')] = files[key].default.schema + } +} + +export default modules diff --git a/packages/settings/design/src/properties/input.json b/packages/settings/design/src/properties/input.json new file mode 100644 index 0000000..87558ef --- /dev/null +++ b/packages/settings/design/src/properties/input.json @@ -0,0 +1,192 @@ +{ + "schema": { + "type": "object", + "properties": { + "autocomplete": { + "title": "原生属性,自动补全", + "type": "string", + "default": "off" + }, + "autofocus": { + "title": "原生属性,自动获取焦点", + "type": "boolean", + "default": false + }, + "autosize": { + "title": "自适应内容高度,只对 type= 'textarea' 有效,可传入对象,如,{ minRows: 2, maxRows: 6 }", + "type": "boolean", + "default": false + }, + "$$autosize": { + "title": "自适应内容高度,只对 type= 'textarea' 有效,可传入对象,如,{ minRows: 2, maxRows: 6 }", + "type": "object" + }, + "clearable": { + "title": "是否可清空", + "type": "boolean", + "default": false + }, + "cols": { + "title": "原生属性,规定文本区域的可见宽度,以平均字符宽度计,在 type = 'textarea' 时有效", + "type": "number", + "default": 20 + }, + "counter": { + "title": "是否显示字数统计,只在 type = 'text' 或 type = 'textarea' 时有效", + "type": "boolean", + "default": false + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "form": { + "title": "原生属性", + "type": "string" + }, + "label": { + "title": "输入框关联的label文字", + "type": "string" + }, + "max": { + "title": "原生属性,设置最大值", + "type": "string" + }, + "maxlength": { + "title": "原生属性,最大输入长度", + "type": "number" + }, + "min": { + "title": "原生属性,设置最小值", + "type": "string" + }, + "name": { + "title": "原生属性", + "type": "string" + }, + "placeholder": { + "title": "输入框占位文本", + "type": "string", + "default": "" + }, + "prefix-icon": { + "title": "输入框头部图标", + "type": "string" + }, + "readonly": { + "title": "设置文本的只读属性", + "type": "boolean", + "default": false + }, + "resize": { + "title": "控制是否能被用户缩放", + "type": "string", + "enum": ["none", "both", "horizontal", "vertical"], + "enumNames": ["不能缩放", "水平垂直都可以缩放", "水平缩放", "垂直缩放"], + "default": "vertical" + }, + "rows": { + "title": "原生属性,规定文本区域的可见高度,以行数计,只对 type= 'textarea' 有效", + "type": "number", + "default": 2 + }, + "show-password": { + "title": "是否显示切换密码图标", + "type": "boolean", + "default": false + }, + "show-word-limit": { + "title": "是否显示输入字数统计,只在 type = 'text' 或 type = 'textarea' 时有效", + "type": "boolean", + "default": false + }, + "size": { + "title": "输入框尺寸,只在 type != 'textarea' 时有效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "step": { + "title": "原生属性,设置输入字段的合法数字间隔", + "type": "string" + }, + "suffix-icon": { + "title": "输入框尾部图标", + "type": "string" + }, + "tabindex": { + "title": "输入框的tabindex", + "type": "string", + "default": "1" + }, + "type": { + "title": "类型,该属性的可选值为 text,textarea 和其他原生 input 的 type 值", + "type": "string", + "default": "text", + "enum": [ + "text", + "password", + "textarea", + "email", + "number", + "tel", + "url", + "hidden", + "color", + "date", + "month", + "week", + "datetime-local", + "time", + "file", + "range" + ], + "enumNames": [ + "text", + "password", + "textarea", + "email", + "number", + "tel", + "url", + "hidden", + "color", + "date", + "month", + "week", + "datetime-local", + "time", + "file", + "range" + ] + }, + "validate-event": { + "title": "输入时是否触发表单的校验", + "type": "boolean", + "default": true + }, + "value": { + "title": ["绑定值", "number"], + "type": "string" + }, + "#append": { + "title": "输入框后置内容插槽,只对 type=\"text\" 有效", + "type": "string" + }, + "#prefix": { + "title": "输入框头部内容插槽,只对 type=\"text\" 有效", + "type": "string" + }, + "#prepend": { + "title": "输入框前置内容插槽,只对 type=\"text\" 有效", + "type": "string" + }, + "#suffix": { + "title": "输入框尾部内容插槽,只对 type=\"text\" 有效", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/ip-address.json b/packages/settings/design/src/properties/ip-address.json new file mode 100644 index 0000000..3aa655a --- /dev/null +++ b/packages/settings/design/src/properties/ip-address.json @@ -0,0 +1,44 @@ +{ + "schema": { + "type": "object", + "properties": { + "delimiter": { + "title": "设置IP段之间的分隔符类名", + "type": "string", + "default": "icon-dot-ipv4" + }, + "disabled": { + "title": "设置文本的禁用属性", + "type": "boolean", + "default": false + }, + "readonly": { + "title": "设置文本的只读属性", + "type": "boolean", + "default": false + }, + "size": { + "title": "设置组件大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "type": { + "title": "设置 IpAddress 框的 type 属性", + "type": "string", + "enum": ["IPv4", "IPv6"], + "enumNames": ["IPv4", "IPv6"], + "default": "IPv4" + }, + "value": { + "title": "设置文本显示的默认值", + "type": "string" + }, + "#default": { + "title": "IP段之间的分隔符插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/layout.json b/packages/settings/design/src/properties/layout.json new file mode 100644 index 0000000..ec7052a --- /dev/null +++ b/packages/settings/design/src/properties/layout.json @@ -0,0 +1,23 @@ +{ + "schema": { + "type": "object", + "properties": { + "size": { + "title": "大小", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "medium" + }, + "tag": { + "title": "标签", + "type": "string", + "default": "div" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/link-menu.json b/packages/settings/design/src/properties/link-menu.json new file mode 100644 index 0000000..1c9991d --- /dev/null +++ b/packages/settings/design/src/properties/link-menu.json @@ -0,0 +1,56 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$data": { + "title": "设置收藏夹菜单的数据", + "type": "array", + "default": "" + }, + "default-expand-all": { + "title": "设置打开菜单弹窗时默认是否展开所有节点", + "type": "boolean", + "default": true + }, + "$$ellipsis": { + "title": "菜单内容超长时省略显示", + "type": "boolean", + "default": true + }, + "$$icon": { + "title": "自定义节点展开折叠的图标", + "type": "object", + "default": "" + }, + "keep-selected-nodes": { + "title": "树节点勾选内容后,点击取消按钮,再次打开弹窗是否保留取消前勾选的内容的状态", + "type": "boolean", + "default": true + }, + "max-item": { + "title": "设置可收藏的栏目的最大数量", + "type": "number", + "minimum": 0 + }, + "$$search-icon": { + "title": "自定义搜索图标", + "type": "object", + "default": "" + }, + "titile": { + "title": "设置收藏夹菜单的标题", + "type": "string", + "default": "" + }, + "$$wrap": { + "title": "菜单内容超长时换行显示", + "type": "boolean", + "default": false + }, + "#foot": { + "title": "菜单弹窗底部插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/link.json b/packages/settings/design/src/properties/link.json new file mode 100644 index 0000000..47af69f --- /dev/null +++ b/packages/settings/design/src/properties/link.json @@ -0,0 +1,47 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用状态", + "type": "boolean", + "default": false + }, + "href": { + "title": "原生 href 属性", + "type": "string", + "default": "" + }, + "icon": { + "title": "图标类名", + "type": "string", + "default": "" + }, + "$$icon": { + "title": "图标类名", + "type": "object", + "default": "" + }, + "type": { + "title": "类型", + "type": "string", + "enum": ["primary", "success", "warning", "danger", "info"], + "enumNames": ["主要类型", "成功类型", "警告类型", "危险类型", "信息类型"], + "default": "default" + }, + "underline": { + "title": "是否下划线", + "type": "boolean", + "default": true + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#icon": { + "title": "图标插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/loading.json b/packages/settings/design/src/properties/loading.json new file mode 100644 index 0000000..ec64d5b --- /dev/null +++ b/packages/settings/design/src/properties/loading.json @@ -0,0 +1,47 @@ +{ + "schema": { + "type": "object", + "properties": { + "background": { + "title": "遮罩背景色", + "type": "string", + "default": "" + }, + "body": { + "title": "同 v-loading 指令中的 body 修饰符", + "type": "boolean", + "default": false + }, + "$$customClass": { + "title": "Loading 的自定义类名", + "type": "string", + "default": "" + }, + "fullscreen": { + "title": "同 v-loading 指令中的 fullscreen 修饰符", + "type": "boolean", + "default": true + }, + "lock": { + "title": "同 v-loading 指令中的 lock 修饰符", + "type": "boolean", + "default": false + }, + "spinner": { + "title": "自定义加载图标类名", + "type": "string", + "default": "" + }, + "$$target": { + "title": "Loading 需要覆盖的 DOM 节点。可传入一个 DOM 对象或字符串;若传入字符串,则会将其作为参数传入 document.querySelector 以获取到对应 DOM 节点", + "type": ["string", "object"], + "default": "document.body" + }, + "text": { + "title": "显示在加载图标下方的加载文案", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/locales.json b/packages/settings/design/src/properties/locales.json new file mode 100644 index 0000000..cc20926 --- /dev/null +++ b/packages/settings/design/src/properties/locales.json @@ -0,0 +1,22 @@ +{ + "schema": { + "type": "object", + "properties": { + "local": { + "title": "是否本地", + "type": "boolean", + "default": false + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/logon-user.json b/packages/settings/design/src/properties/logon-user.json new file mode 100644 index 0000000..48f169c --- /dev/null +++ b/packages/settings/design/src/properties/logon-user.json @@ -0,0 +1,6 @@ +{ + "$$schema": { + "type": "object", + "properties": {} + } +} diff --git a/packages/settings/design/src/properties/logout.json b/packages/settings/design/src/properties/logout.json new file mode 100644 index 0000000..e468897 --- /dev/null +++ b/packages/settings/design/src/properties/logout.json @@ -0,0 +1,12 @@ +{ + "schema": { + "type": "object", + "properties": { + "redirectUrl": { + "title": "自定义配置注销后跳转地址", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/menu-bar.json b/packages/settings/design/src/properties/menu-bar.json new file mode 100644 index 0000000..48f169c --- /dev/null +++ b/packages/settings/design/src/properties/menu-bar.json @@ -0,0 +1,6 @@ +{ + "$$schema": { + "type": "object", + "properties": {} + } +} diff --git a/packages/settings/design/src/properties/milestone.json b/packages/settings/design/src/properties/milestone.json new file mode 100644 index 0000000..456cc7e --- /dev/null +++ b/packages/settings/design/src/properties/milestone.json @@ -0,0 +1,101 @@ +{ + "schema": { + "type": "object", + "properties": { + "completed-field": { + "title": "设置里程碑完成状态对应的取值", + "type": "string", + "default": "completed" + }, + "$$data": { + "title": "设置步骤条的数据 ", + "type": ["object", "array"] + }, + "flag-before": { + "title": "设置里程碑上活动即旗子上的数据从前面还是后面节点上获取,默认为 false 取后面节点上的数据", + "type": "boolean", + "default": false + }, + "flag-content-field": { + "title": "设置节点旗子数据中描述对应的字段名", + "type": "string", + "default": "content" + }, + "flag-field": { + "title": "设置节点信息中旗子数据所在字段名", + "type": "string", + "default": "flags" + }, + "flag-name-field": { + "title": "设置节点旗子数据中名称对应的字段名", + "type": "string", + "default": "name" + }, + "flag-status-field": { + "title": "设置节点旗子数据中状态对应的字段名", + "type": "string", + "default": "status" + }, + "line-style": { + "title": "在里程碑模式下,设置线条颜色取值模式,默认为1,采用两种颜色区分完成与未完成状态,完成状态的线条颜色与milestonesStatus定义的完成颜色一致。设置为 2 时线条颜色根随节点状态。设置为 16进制的色值 如:#1890ff 时,线条不区分状态,全部为所设置的颜色", + "type": ["string", "number"], + "default": "1" + }, + "$$milestones-status": { + "title": "定义里程碑的状态与颜色对应关系,颜色取值必需为 16进制 如:{completed: '#1890FF'}", + "type": "object", + "default": "" + }, + "name-field": { + "title": "设置节点信息中名称对应的字段名", + "type": "string", + "default": "name" + }, + "show-number": { + "title": "设置未完成的状态是否显示序号", + "type": "boolean", + "default": true + }, + "solid": { + "title": "在里程碑模式下,设置已经完成节点显示为实心,且光晕不透明", + "type": "boolean", + "default": false + }, + "space": { + "title": "设置步骤条的宽度", + "type": "number" + }, + "start": { + "title": "设置步骤条序号起始值", + "type": "number", + "default": -1 + }, + "status-field": { + "title": "设置数据状态对应的字段名", + "type": "string", + "default": "status" + }, + "time-field": { + "title": "设置节点时间信息对应的字段名", + "type": "string", + "default": "time" + }, + "#bottom": { + "title": "节点下方内容插槽", + "type": "string" + }, + "#flag": { + "title": "旗帜内容插槽", + "type": "string" + }, + "#icon": { + "title": "节点图标插槽", + "type": "string" + }, + "#top": { + "title": "节点上方内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/modal.json b/packages/settings/design/src/properties/modal.json new file mode 100644 index 0000000..2882d5e --- /dev/null +++ b/packages/settings/design/src/properties/modal.json @@ -0,0 +1,143 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$duration": { + "title": "只对 type=message 有效,自动关闭的延时", + "type": "string", + "default": "3000" + }, + "duration": { + "title": "只对 type=message 有效,自动关闭的延时", + "type": "number", + "default": 3000 + }, + "esc-closable": { + "title": "是否允许按 Esc 键关闭窗口", + "type": "boolean", + "default": true + }, + "fullscreen": { + "title": "默认最大化显示", + "type": "boolean", + "default": false + }, + "height": { + "title": "窗口的高度", + "type": ["string", "number"], + "default": "" + }, + "id": { + "title": "只对 type=message 有效,如果不想窗口重复点击,可以设置唯一的 id 防止重复提示", + "type": "string", + "default": "" + }, + "is-form-reset": { + "title": "关闭弹窗时是否默认重置表单数据", + "type": "boolean", + "default": true + }, + "lock-scroll": { + "title": "是否锁住滚动条,不允许页面滚动", + "type": "boolean", + "default": true + }, + "lock-view": { + "title": "是否锁住页面,不允许窗口之外的任何操作", + "type": "boolean", + "default": true + }, + "mask": { + "title": "是否显示遮罩层", + "type": "boolean", + "default": true + }, + "mask-closable": { + "title": "是否允许点击遮罩层关闭窗口", + "type": "boolean", + "default": "" + }, + "message": { + "title": "窗口的内容", + "type": "string", + "default": "" + }, + "min-height": { + "title": "窗口的最小高度", + "type": ["string", "number"], + "default": "" + }, + "min-width": { + "title": "窗口的最小宽度", + "type": ["string", "number"], + "default": "" + }, + "resize": { + "title": "是否允许拖动调整窗口大小", + "type": "boolean", + "default": false + }, + "show-header": { + "title": "是否显示头部", + "type": "boolean", + "default": true + }, + "showFooter": { + "title": "是否显示底部", + "type": "boolean" + }, + "status": { + "title": "只对 type=alert | confirm | message 有效,消息状态", + "type": "string", + "enum": ["info", "success", "warning", "error", "loading"], + "enumNames": ["基本提示", "成功提示", "警告提示", "错误提示", "加载提示"], + "default": "info" + }, + "title": { + "title": "窗口的标题(支持开启国际化)", + "type": "string", + "default": "" + }, + "$$top": { + "title": "只对 type=message 有效,消息距离顶部的位置", + "type": "string", + "default": "15" + }, + "top": { + "title": "只对 type=message 有效,消息距离顶部的位置", + "type": "number", + "default": 15 + }, + "type": { + "title": "窗口类型", + "type": "string", + "enum": ["alert", "confirm", "message"], + "enumNames": ["警告弹框", "确认弹框", "提示弹框"], + "default": "alert" + }, + "value": { + "title": "绑定值", + "type": "boolean", + "default": true + }, + "width": { + "title": "窗口的宽度", + "type": ["string", "number"], + "default": "" + }, + "zIndex": { + "title": "自定义堆叠顺序(对于某些特殊场景,比如被遮挡时可能会用到)", + "type": "number", + "default": 3000 + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#footer": { + "title": "窗口底部的模板插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/nav-menu.json b/packages/settings/design/src/properties/nav-menu.json new file mode 100644 index 0000000..19c9f8c --- /dev/null +++ b/packages/settings/design/src/properties/nav-menu.json @@ -0,0 +1,32 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$data": { + "title": "设置导航菜单的数据", + "type": "array", + "default": "" + }, + "$$fields": { + "title": "自定义菜单数据的映射", + "type": "object", + "default": "" + }, + "overflow": { + "title": "设置一级菜单无法在当前菜单容器里显示完全时的处理策略", + "type": "string", + "enum": ["auto", "retract", "fixed", "hidden"], + "enumNames": ["显示 更多 菜单", "显示 三明治折叠/展开 图标", "只显示 三明治折叠/展开 图标", "多余隐藏不显示"], + "default": "auto" + }, + "#logo": { + "title": "菜单栏 Logo 插槽", + "type": "string" + }, + "#toolbar": { + "title": "菜单工具栏插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/numeric.json b/packages/settings/design/src/properties/numeric.json new file mode 100644 index 0000000..e86ac35 --- /dev/null +++ b/packages/settings/design/src/properties/numeric.json @@ -0,0 +1,87 @@ +{ + "schema": { + "type": "object", + "properties": { + "circulate": { + "title": "向上到达最大值后从最小值开始,或反过来", + "type": "boolean", + "default": false + }, + "controls": { + "title": "是否使用控制按钮", + "type": "boolean", + "default": true + }, + "controls-position": { + "title": "控制按钮位置", + "type": "string", + "enum": ["right"], + "enumNames": ["右边"], + "default": "" + }, + "disabled": { + "title": "是否禁用计数器", + "type": "boolean", + "default": false + }, + "label": { + "title": "输入框关联的label文字", + "type": "string", + "default": "" + }, + "$$max": { + "title": "设置计数器允许的最大值", + "type": "number", + "default": "Infinity" + }, + "$$min": { + "title": "设置计数器允许的最小值", + "type": "number", + "default": "-Infinity" + }, + "mouse-wheel": { + "title": "设置鼠标滚动滑轮是否改变数值", + "type": "boolean", + "default": true + }, + "name": { + "title": "原生属性", + "type": "string", + "default": "" + }, + "placeholder": { + "title": "设置输入框内的提示占位文本 ", + "type": "string", + "default": "" + }, + "precision": { + "title": "数值精度", + "type": "number", + "minimum": 0, + "multipleOf": 1 + }, + "size": { + "title": "计数器尺寸", + "type": "string", + "enum": ["large", "small"], + "enumNames": ["较大尺寸", "较小尺寸"], + "default": "" + }, + "step": { + "title": "设置按上下方向键或点击上下按钮增减的数值", + "type": "number", + "default": 1 + }, + "step-strictly": { + "title": "是否只能输入 step 的倍数", + "type": "boolean", + "default": false + }, + "value": { + "title": "设置输入组件的默认值", + "type": "number", + "default": 0 + } + } + } +} diff --git a/packages/settings/design/src/properties/option-group.json b/packages/settings/design/src/properties/option-group.json new file mode 100644 index 0000000..9c24ab1 --- /dev/null +++ b/packages/settings/design/src/properties/option-group.json @@ -0,0 +1,21 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否将该分组下所有选项置为禁用", + "type": "boolean", + "default": false + }, + "label": { + "title": "分组的组名", + "type": "string", + "default": "" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/option.json b/packages/settings/design/src/properties/option.json new file mode 100644 index 0000000..ac1db0b --- /dev/null +++ b/packages/settings/design/src/properties/option.json @@ -0,0 +1,36 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用该选项", + "type": "boolean", + "default": false + }, + "$$highlight-class": { + "title": "下拉选项自定义高亮类名", + "type": "string", + "default": "" + }, + "label": { + "title": "选项的标签,若不设置则默认与 value 相同", + "type": ["string", "number"], + "default": "" + }, + "value": { + "title": "选项的值", + "type": ["string", "number"], + "default": "" + }, + "$$value": { + "title": "选项的值", + "type": "object", + "default": "" + }, + "#default": { + "title": "默认插槽(将自定义的 HTML 模板插入 aui-option 中)", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/pager.json b/packages/settings/design/src/properties/pager.json new file mode 100644 index 0000000..c9f2603 --- /dev/null +++ b/packages/settings/design/src/properties/pager.json @@ -0,0 +1,86 @@ +{ + "schema": { + "type": "object", + "properties": { + "current-page": { + "title": "当前页数,支持 .sync 修饰符", + "type": "number", + "default": 1 + }, + "hide-on-single-page": { + "title": "只有一页时是否隐藏", + "type": "boolean" + }, + "is-before-page-change": { + "title": "是否打开页面改变时的前置处理特性。在值为true时,翻页操作或者改变页大小操作不会立即生效,留给用户处理业务逻辑,之后通过调用预留的callback或者rollback使之生效或者失效,详看事件before-page-change", + "type": "boolean" + }, + "$$layout": { + "title": "组件布局,子组件名用逗号分隔", + "type": "string", + "enum": ["sizes", "prev", "pager", "next", "jumper", "->", "total", "slot"], + "enumNames": ["初始加载页码数", "上一页", "页码", "下一页", "跳转", "总条数展示位置", "总条数", "插槽"], + "$$default": "prev, pager, next, jumper, ->, total" + }, + "mode": { + "title": "设置分页显示模式", + "type": "string", + "enum": ["number", "simple", "complete", "fixed"], + "enumNames": ["数字模式", "简单模式", "完成模式", "固定模式"], + "default": "" + }, + "next-text": { + "title": "替代图标显示的下一页文字", + "type": "string", + "default": "" + }, + "page-count": { + "title": "总页数,total 和 page-count 设置任意一个就可以达到显示页码的功能;如果要支持 page-sizes 的更改,则需要使用 total 属性", + "type": "number" + }, + "page-size": { + "title": "每页显示条目个数,支持 .sync 修饰符", + "type": "number", + "default": 10 + }, + "page-sizes": { + "title": "每页显示个数选择器的选项设置", + "type": "array", + "items": { + "type": "number" + }, + "default": [10, 20, 30, 40, 50, 100] + }, + "pager-count": { + "title": "页码按钮的数量,当总页数超过该值时会折叠", + "type": "number", + "enum": [5, 7, 9, 11, 13, 15, 17, 19, 21], + "enumNames": [5, 7, 9, 11, 13, 15, 17, 19, 21], + "default": 7 + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "prev-text": { + "title": "替代图标显示的上一页文字", + "type": "string", + "default": "" + }, + "total": { + "title": "总条目数", + "type": "number" + }, + "#default": { + "title": "自定义内容插槽,需要在 layout 中列出 slot", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/panel.json b/packages/settings/design/src/properties/panel.json new file mode 100644 index 0000000..a59b857 --- /dev/null +++ b/packages/settings/design/src/properties/panel.json @@ -0,0 +1,58 @@ +{ + "schema": { + "type": "object", + "properties": { + "expand": { + "title": "初始化时是否默认展开内容区,默认为 true 展开,false 则为收起", + "type": "boolean", + "default": true + }, + "foot": { + "title": "指定底部内容,可输入 i18n 内容", + "type": "string", + "default": "" + }, + "head": { + "title": "指定头部内容,可输入 i18n 内容", + "type": "string", + "default": "" + }, + "$$iconClose": { + "title": "收缩时的 icon,提供 icon-font 的样式类名称", + "type": "string", + "default": "icon-chevron-down" + }, + "$$iconOpen": { + "title": "展开时的 icon,提供 icon-font 的样式类名称", + "type": "string", + "default": "icon-chevron-right" + }, + "isToggle": { + "title": "是否可收缩模式,默认为 true 可以收缩", + "type": "boolean", + "default": true + }, + "transition": { + "title": "动画名称", + "type": "string", + "default": "panel" + }, + "#collapse": { + "title": "内容插槽", + "type": "string" + }, + "#default": { + "title": "默认插槽", + "type": "string" + }, + "#footer": { + "title": "底部插槽", + "type": "string" + }, + "#header": { + "title": "头部插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/pop-upload.json b/packages/settings/design/src/properties/pop-upload.json new file mode 100644 index 0000000..ceaeac8 --- /dev/null +++ b/packages/settings/design/src/properties/pop-upload.json @@ -0,0 +1,86 @@ +{ + "schema": { + "type": "object", + "properties": { + "allString": { + "dialog-title": { + "title": "设置文件上传弹框的标题", + "type": "string", + "default": "文件上传" + }, + "size": { + "title": "设置组件大小", + "type": "string", + "default": "" + }, + "submit-button-text": { + "title": "设置文件上传弹框中提交按钮的文本", + "type": "string", + "default": "开始上传" + }, + "cancel-button-text": { + "title": "设置文件上传弹框中取消按钮的文本", + "type": "string", + "default": "取消" + }, + "action": { + "title": "必选参数,设置上传的地址", + "type": "string", + "default": "" + }, + "accept": { + "title": "接受上传的文件类型", + "type": "string", + "default": "" + }, + "upload-name": { + "title": "上传的文件字段名", + "type": "string", + "default": "file" + }, + "upload-button-text": { + "title": "打开弹出框的按钮的文本配置属性", + "type": "string", + "default": "选择文件" + }, + "limit": { + "title": "最大允许上传个数", + "type": "number" + }, + "max-upload-file-size": { + "title": "最大上传文件大小", + "type": "number" + }, + "multiple": { + "title": "是否支持多选文件", + "type": "boolean" + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "with-credentials": { + "title": "支持发送 cookie 凭证信息", + "type": "boolean", + "default": false + }, + "$$data": { + "title": "上传时附带的额外参数", + "type": "object", + "default": "" + }, + "$$headers": { + "title": "设置上传的请求头部", + "type": "object", + "default": "" + }, + "$$upload-file-type": { + "title": "对上传文件进行校验的类型,比如 ['.png', '.jpg']", + "type": "array", + "default": "" + } + } + } + } +} diff --git a/packages/settings/design/src/properties/popeditor.json b/packages/settings/design/src/properties/popeditor.json new file mode 100644 index 0000000..e4d1ad4 --- /dev/null +++ b/packages/settings/design/src/properties/popeditor.json @@ -0,0 +1,147 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$conditions": { + "title": "当弹出面板配置的是表格时,设置弹出面板中的表单查询项", + "type": "array", + "default": "" + }, + "dialog-class": { + "title": "自定义配置弹窗类名", + "type": "string", + "default": "" + }, + "disabled": { + "title": "设置组件是否为禁用状态", + "type": "boolean", + "default": false + }, + "draggable": { + "title": "设置弹出窗口是否可拖动", + "type": "boolean", + "default": true + }, + "$$grid-op": { + "title": "设置弹出面板中表格组件的配置信息", + "type": "object", + "default": "" + }, + "height": { + "title": "设置弹出面板的高度(单位像素)", + "type": ["string", "number"], + "default": "" + }, + "$$icon": { + "title": "Popeditor 组件的 Icon 图标设置。默认为 svg 组件", + "type": "object", + "default": "" + }, + "multi": { + "title": "设置弹出面板中的数据是否可多选", + "type": "boolean", + "default": false + }, + "$$pager-op": { + "title": "设置分页配置", + "type": "object", + "default": "" + }, + "placeholder": { + "title": "占位符", + "type": "string", + "default": "" + }, + "popseletor": { + "title": "设置弹出面板中可显示的树或者表格组件", + "type": "string", + "enum": ["grid", "tree"], + "enumNames": ["表格组件", "树组件"], + "default": "grid" + }, + "readonly": { + "title": "设置是否只读,设置为 false 后点击 Ipunt 框可以弹出选择框", + "type": "boolean", + "default": true + }, + "resize": { + "title": "是否显示弹框全屏按钮", + "type": "boolean", + "default": false + }, + "show-clear-btn": { + "title": "设置输入框中右侧是否显示清除按钮", + "type": "boolean", + "default": true + }, + "show-history": { + "title": "当弹出面板配置的是表格时,设置历史记录标签页是否显示表格", + "type": "boolean", + "default": false + }, + "show-pager": { + "title": "展示分页", + "type": "boolean", + "default": false + }, + "size": { + "title": "设置组件的size大小,三种类型可以选择:medium,small,mini", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "tabindex": { + "title": "设置是否可通过 Tab 键获焦及获焦顺序(readonly 属性设置为 false 时有效)", + "type": "string", + "default": "1" + }, + "text-field": { + "title": "设置输入框中显示文本的字段,提交数据时,不提交该显示文本", + "type": "string", + "default": "label" + }, + "text-split": { + "title": "在多选的情况下,设置输入框中要显示多个数据时的分隔符", + "type": "string", + "default": "/" + }, + "title": { + "title": "设置弹出面板的标题,并且支持国际化", + "type": "string", + "default": "" + }, + "trigger": { + "title": "弹框表格中为单选时radio的选中配置,可配置:default(默认), cell(点击单元格触发), row(点击行触发)", + "type": "string", + "enum": ["cell", "row", "default"], + "enumNames": ["点击单元格触发", "点击行触发", "默认"], + "default": "default" + }, + "value": { + "title": "绑定值", + "type": "string", + "default": "" + }, + "value-field": { + "title": "设置输入框要提交数据的字段", + "type": "string", + "default": "id" + }, + "value-split": { + "title": "在多选的情况下,设置输入框要提交多个数据时的分隔符", + "type": "string", + "default": ";" + }, + "width": { + "title": "设置弹出面板的宽度(单位像素)", + "type": ["string", "number"], + "default": "" + }, + "#search": { + "title": "查询条件插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/popover.json b/packages/settings/design/src/properties/popover.json new file mode 100644 index 0000000..2293d0b --- /dev/null +++ b/packages/settings/design/src/properties/popover.json @@ -0,0 +1,129 @@ +{ + "schema": { + "type": "object", + "properties": { + "append-to-body": { + "title": "是否添加到body上", + "type": "boolean", + "default": true + }, + "arrow-offset": { + "title": "箭头的位置偏移", + "type": "number", + "default": 0 + }, + "close-delay": { + "title": "触发方式为 hover 时的隐藏延迟,单位为毫秒", + "type": "number", + "default": 200 + }, + "content": { + "title": "显示的内容,也可以通过 slot 传入 DOM", + "type": "string", + "default": "" + }, + "disabled": { + "title": "Popover 是否可用", + "type": "boolean", + "default": false + }, + "offset": { + "title": "出现位置的偏移量", + "type": "number", + "default": 0 + }, + "open-delay": { + "title": "触发方式为 hover 时的显示延迟,单位为毫秒", + "type": "number", + "default": 0 + }, + "placement": { + "title": "出现位置", + "type": "string", + "enum": [ + "top", + "top-start", + "top-end", + "bottom", + "bottom-start", + "bottom-end", + "left", + "left-start", + "left-end", + "right", + "right-start", + "right-end" + ], + "enumNames": ["上边", "上左", "上右", "下边", "下左", "下右", "左边", "左上", "左下", "右边", "右上", "右下"], + "default": "bottom" + }, + "popper-class": { + "title": "为 popper 添加类名", + "type": "string", + "default": "" + }, + "$$popper-options": { + "title": "popper.js 的参数", + "type": "object", + "default": "{ boundariesElement: 'body', gpuAcceleration: false }", + "properties": { + "boundariesElement": { + "title": "临近元素", + "type": "string", + "default": "body" + }, + "gpuAcceleration": { + "title": "是否 popper 的位置将通过 CSS3 的 translate3d 来改变", + "type": "boolean", + "default": false + } + } + }, + "title": { + "title": "标题", + "type": "string", + "default": "" + }, + "transform-origin": { + "title": "组件的旋转中心点", + "type": ["number", "string"], + "default": true + }, + "transition": { + "title": "定义渐变动画", + "type": "string", + "default": "fade-in-linear" + }, + "trigger": { + "title": "触发方式", + "type": "string", + "enum": ["click", "focus", "hover", "manual"], + "enumNames": ["点击触发", "鼠标长按触发", "鼠标悬浮触发", "点击触发,再次点击隐藏"], + "default": "click" + }, + "value": { + "title": "状态是否可见", + "type": "boolean", + "default": false + }, + "visible-arrow": { + "title": "是否显示 Tooltip 箭头,更多参数可见Vue-popper", + "type": "boolean", + "default": true + }, + "width": { + "title": "宽度", + "type": ["string", "number"], + "default": "150" + }, + "#default": { + "title": "Popover 内嵌 HTML 文本插槽", + "type": "string" + }, + "#reference": { + "title": "触发 Popover 显示的 HTML 元素插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/progress.json b/packages/settings/design/src/properties/progress.json new file mode 100644 index 0000000..1b66e9f --- /dev/null +++ b/packages/settings/design/src/properties/progress.json @@ -0,0 +1,59 @@ +{ + "schema": { + "type": "object", + "properties": { + "color": { + "title": "进度条背景色(会覆盖 status 状态颜色)", + "type": "string", + "default": "" + }, + "$$color": { + "title": "进度条背景色(会覆盖 status 状态颜色)", + "type": "array", + "default": "" + }, + "percentage": { + "title": "百分比(必填)", + "type": "number", + "minimum": 0, + "maximum": 100, + "default": 0 + }, + "show-text": { + "title": "是否显示进度条文字内容", + "type": "boolean", + "default": true + }, + "status": { + "title": "进度条当前状态", + "type": "string", + "enum": ["success", "exception", "warning"], + "enumNames": ["成功状态", "意外状态", "警告状态"], + "default": "" + }, + "stroke-width": { + "title": "进度条的宽度,单位 px", + "type": "number", + "default": 6 + }, + "text-inside": { + "title": "进度条显示文字内置在进度条内(只在 type=line 时可用)", + "type": "boolean", + "default": false + }, + "type": { + "title": "进度条类型", + "type": "string", + "enum": ["line", "circle", "dashboard"], + "enumNames": ["线性进度条", "环形进度条", "仪表盘形进度条"], + "default": "line" + }, + "width": { + "title": "环形进度条画布宽度(只在 type 为 circle 或 dashboard 时可用)", + "type": "number", + "default": 126 + } + }, + "required": ["percentage"] + } +} diff --git a/packages/settings/design/src/properties/radio-button.json b/packages/settings/design/src/properties/radio-button.json new file mode 100644 index 0000000..0671e94 --- /dev/null +++ b/packages/settings/design/src/properties/radio-button.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "$$label": { + "title": "Radio 的 value", + "type": ["string", "number"], + "default": "" + }, + "name": { + "title": "原生 name 属性", + "type": "string", + "default": "" + }, + "#default": { + "title": "button按钮的内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/radio-group.json b/packages/settings/design/src/properties/radio-group.json new file mode 100644 index 0000000..27743cf --- /dev/null +++ b/packages/settings/design/src/properties/radio-group.json @@ -0,0 +1,48 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "fill": { + "title": "按钮形式的 Radio 激活时的填充色和边框色", + "type": "string", + "default": "" + }, + "$$options": { + "title": "循环配置 Radio", + "type": "array", + "default": "" + }, + "size": { + "title": "单选框组尺寸,仅对按钮形式的 Radio 或带有边框的 Radio 有效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "text-color": { + "title": "按钮形式的 Radio 激活时的文本颜色", + "type": "string", + "default": "#fff" + }, + "$$value": { + "title": "绑定值", + "type": "string", + "default": "" + }, + "vertical": { + "title": "设置组件排列方式", + "type": "boolean", + "default": true + }, + "#default": { + "title": "radio默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/radio.json b/packages/settings/design/src/properties/radio.json new file mode 100644 index 0000000..ba74f73 --- /dev/null +++ b/packages/settings/design/src/properties/radio.json @@ -0,0 +1,48 @@ +{ + "schema": { + "type": "object", + "properties": { + "border": { + "title": "是否显示边框", + "type": "boolean", + "default": false + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "label": { + "title": "Radio 的 value", + "type": ["string", "number", "boolean"], + "default": "" + }, + "name": { + "title": "原生 name 属性", + "type": "string", + "default": "" + }, + "size": { + "title": "Radio 的尺寸,仅在 border 为真时有效", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "text": { + "title": "文本", + "type": "string", + "default": "" + }, + "value": { + "title": "绑定值", + "type": "string", + "default": "" + }, + "#default": { + "title": "Radio的默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/rate.json b/packages/settings/design/src/properties/rate.json new file mode 100644 index 0000000..8bc012d --- /dev/null +++ b/packages/settings/design/src/properties/rate.json @@ -0,0 +1,112 @@ +{ + "schema": { + "type": "object", + "properties": { + "allow-half": { + "title": "是否允许半选", + "type": "boolean", + "default": false + }, + "$$colors": { + "title": "icon 的颜色数组,为 Threshold 3 个分段所对应的颜色", + "type": "array", + "$$default": ["#FADB14", "#FADB14", "#FADB14"] + }, + "disabled": { + "title": "是否为只读", + "type": "boolean", + "default": false + }, + "disabled-void-color": { + "title": "禁用状态下未选中 icon 的颜色", + "type": "string", + "default": "#D9D9D9" + }, + "$$disabled-void-icon-class": { + "title": "只读状态下未选中的图标样式名", + "type": "string", + "default": "icon-stardisable" + }, + "high-threshold": { + "title": "高分和中等分数的界限值,值本身被划分在高分中", + "type": "number", + "default": 4 + }, + "$$icon-classes": { + "title": "三个分段对应的图标样式名", + "type": "array", + "$$default": ["icon-starActive", "icon-starActive", "icon-starActive"] + }, + "low-threshold": { + "title": "低分和中等分数的界限值,值本身被划分在低分中", + "type": "number", + "default": 2 + }, + "max": { + "title": "最大分值", + "type": "number", + "default": 5 + }, + "radio": { + "title": "评分其他形态单选", + "type": "boolean", + "default": false + }, + "$$score-template": { + "title": "分数显示模板", + "type": "string", + "default": "{value}" + }, + "show-score": { + "title": "是否显示当前分数,show-score 和 show-text 不能同时为真", + "type": "boolean", + "default": false + }, + "show-text": { + "title": "是否显示辅助文字,若为真,则会从 texts 数组中选取当前分数对应的文字内容", + "type": "boolean", + "default": false + }, + "size": { + "title": "图标字体大小", + "type": "string", + "default": "18px" + }, + "space": { + "title": "每个图标所占宽度", + "type": "string", + "default": "24px" + }, + "text-color": { + "title": "辅助文字的颜色", + "type": "string", + "default": "#666666" + }, + "text-on-bottom": { + "title": "是否在图标下显示对应的文字", + "type": "boolean", + "default": false + }, + "$$texts": { + "title": "辅助文字数组", + "type": "array", + "$$default": ["很差", "差", "一般", "好", "很好"] + }, + "value": { + "title": "绑定值", + "type": "number", + "default": 0 + }, + "void-color": { + "title": "未选中 icon 的颜色", + "type": "string", + "default": "#BFBFBF" + }, + "$$void-icon-class": { + "title": "未选中 icon 的类名", + "type": "string", + "default": "icon-stardisable" + } + } + } +} diff --git a/packages/settings/design/src/properties/rich-text.json b/packages/settings/design/src/properties/rich-text.json new file mode 100644 index 0000000..85da0dd --- /dev/null +++ b/packages/settings/design/src/properties/rich-text.json @@ -0,0 +1,47 @@ +{ + "schema": { + "type": "object", + "properties": { + "content": { + "title": "富文本编辑器内容,一段 HTML 代码的字符串", + "type": "string", + "default": "" + }, + "disabled": { + "title": "是否禁用富文本编辑器", + "type": "boolean", + "default": false + }, + "$$file-upload": { + "title": "上传文件配置(包括上传地址,上传头部信息配置,是否跨域,以及上传前,上传失败,上传成功回调事件),IE 浏览器下不支持", + "type": "object", + "default": "" + }, + "$$global-options": { + "title": "内部的 quill 插件全局配置", + "type": "object", + "default": "" + }, + "image-drop": { + "title": "配置图片是否可以拖拽到富文本编辑器内,IE 浏览器下不支持", + "type": "boolean", + "default": true + }, + "$$image-upload": { + "title": "上传图片配置(包括上传地址,上传头部信息配置,是否跨域,以及上传前,上传失败,上传成功回调事件),IE 浏览器下不支持", + "type": "object", + "default": "" + }, + "$$options": { + "title": "内部的 quill 插件配置", + "type": "object", + "default": "" + }, + "value": { + "title": "富文本编辑器初始值", + "type": "string", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/roles.json b/packages/settings/design/src/properties/roles.json new file mode 100644 index 0000000..48f169c --- /dev/null +++ b/packages/settings/design/src/properties/roles.json @@ -0,0 +1,6 @@ +{ + "$$schema": { + "type": "object", + "properties": {} + } +} diff --git a/packages/settings/design/src/properties/row.json b/packages/settings/design/src/properties/row.json new file mode 100644 index 0000000..ebb6737 --- /dev/null +++ b/packages/settings/design/src/properties/row.json @@ -0,0 +1,47 @@ +{ + "schema": { + "type": "object", + "properties": { + "align": { + "title": "flex 布局下的垂直排列方式", + "type": "string", + "enum": ["top", "middle", "bottom"], + "enumNames": ["默认排列", "middle", "bottom"], + "default": "top" + }, + "flex": { + "title": "启用 flex 布局模式,现代浏览器下有效", + "type": "boolean" + }, + "gutter": { + "title": "栅格间隔", + "type": "number", + "minimum": 0, + "default": 0 + }, + "justify": { + "title": "flex 布局下的水平排列方式", + "type": "string", + "enum": ["start", "center", "end", "space-between", "space-around"], + "enumNames": ["默认排列", "center", "end", "space-between", "space-around"], + "default": "start" + }, + "order": { + "title": "flex 布局下排序方式", + "type": "string", + "enum": ["asc", "des"], + "enumNames": ["顺序", "倒序"], + "default": "" + }, + "tag": { + "title": "自定义元素标签,可选任意标签", + "type": "string", + "default": "div" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/scroll-text.json b/packages/settings/design/src/properties/scroll-text.json new file mode 100644 index 0000000..ba3112b --- /dev/null +++ b/packages/settings/design/src/properties/scroll-text.json @@ -0,0 +1,33 @@ +{ + "schema": { + "type": "object", + "properties": { + "direction": { + "title": "滚动的方向", + "type": "string", + "enum": ["up", "left", "down", "right"], + "enumNames": ["上", "左", "下", "右"], + "default": "left" + }, + "hover-stop": { + "title": "hover 滚动是否停止", + "type": "boolean", + "default": true + }, + "text": { + "title": "滚动的文本内容", + "type": "string", + "default": "ScrollText" + }, + "time": { + "title": "整个滚动过程所用的时间", + "type": "number", + "default": 5 + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/search.json b/packages/settings/design/src/properties/search.json new file mode 100644 index 0000000..91dd073 --- /dev/null +++ b/packages/settings/design/src/properties/search.json @@ -0,0 +1,45 @@ +{ + "schema": { + "type": "object", + "properties": { + "clearable": { + "title": "属性设置显示清空图标按钮", + "type": "boolean", + "default": false + }, + "default-value": { + "title": "设置搜索输入框内的默认搜索值", + "type": "string", + "default": "" + }, + "mini": { + "title": "迷你模式,配置为true时,搜索默认显示为一个带图标的圆形按钮,点击后展开", + "type": "boolean", + "default": false + }, + "placeholder": { + "title": "设置搜索输入框内的提示占位文本 ", + "type": "string", + "default": "" + }, + "$$search-types": { + "title": "搜索的类型选项,格式为[{text:'文档',value:1},...],不配置时类型选择固定显示为All ", + "type": "array", + "default": "" + }, + "transparent": { + "title": "设置为透明模式,配置为true时,边框变为透明且收缩后半透明显示,一般用在带有背景的场景", + "type": "boolean", + "default": false + }, + "#poplist": { + "title": "搜索的弹出列表插槽", + "type": "string" + }, + "#text": { + "title": "默认搜索类型插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/select.json b/packages/settings/design/src/properties/select.json new file mode 100644 index 0000000..b9eaba1 --- /dev/null +++ b/packages/settings/design/src/properties/select.json @@ -0,0 +1,205 @@ +{ + "schema": { + "type": "object", + "properties": { + "allow-create": { + "title": "是否允许用户创建新条目,需配合 filterable 使用", + "type": "boolean", + "default": false + }, + "autocomplete": { + "title": "select input 的 autocomplete 属性", + "type": "string", + "default": "off" + }, + "automatic-dropdown": { + "title": "对于不可搜索的 Select,是否在输入框获得焦点后自动弹出选项菜单", + "type": "boolean", + "default": false + }, + "$$cache-op": { + "title": "开启 select 本地缓存功能(根据用户点击选择的次数、最后时间继续存储排序)", + "type": "object", + "default": "" + }, + "clearable": { + "title": "是否可以清空选项", + "type": "boolean", + "default": false + }, + "collapse-tags": { + "title": "多选时是否将选中值按文字的形式展示", + "type": "boolean", + "default": false + }, + "default-first-option": { + "title": "在输入框按下回车,选择第一个匹配项。需配合 filterable 或 remote 使用", + "type": "boolean", + "default": false + }, + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "filterable": { + "title": "是否可搜索", + "type": "boolean", + "default": false + }, + "$$grid-op": { + "title": "下拉列表嵌套 Grid 组件时,用来配置 Grid 的数据信息", + "type": "object", + "default": "" + }, + "loading": { + "title": "是否正在从远程获取数据", + "type": "boolean", + "default": false + }, + "loading-text": { + "title": "远程加载时显示的文字", + "type": "string", + "default": "加载中" + }, + "multiple": { + "title": "是否多选", + "type": "boolean", + "default": false + }, + "multiple-limit": { + "title": "多选时用户最多可以选择的项目数,为 0 则不限制", + "type": "number", + "default": 0 + }, + "name": { + "title": "select input 的 name 属性", + "type": "string", + "default": "" + }, + "no-data-text": { + "title": "选项为空时显示的文字,也可以使用slot= 'empty' 设置", + "type": "string", + "default": "无数据" + }, + "no-match-text": { + "title": "搜索条件无匹配时显示的文字,也可以使用slot= 'empty' 设置", + "type": "string", + "default": "无匹配数据" + }, + "$$options": { + "title": "配置 Select 数据项,使用后不需要再配置 aui-option", + "type": "array", + "default": "" + }, + "placeholder": { + "title": "占位符", + "type": "string", + "default": "请选择" + }, + "placement": { + "title": "tip 相对于创建 tip 的 dom 节点的位置", + "type": "string", + "enum": [ + "top", + "top-start", + "top-end", + "bottom", + "bottom-start", + "bottom-end", + "left", + "left-start", + "left-end", + "right", + "right-start", + "right-end" + ], + "enumNames": ["上边", "上左", "上右", "下边", "下左", "下右", "左边", "左上", "左下", "右边", "右上", "右下"], + "default": "bottom-start" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "Select 下拉框的类名", + "type": "string", + "default": "" + }, + "remote": { + "title": "是否为远程搜索", + "type": "boolean", + "default": false + }, + "render-type": { + "title": "设置下拉列表嵌套 Grid 或 Tree 时的组件类型", + "type": "string", + "default": "" + }, + "reserve-keyword": { + "title": "多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词", + "type": "boolean", + "default": false + }, + "show-alloption": { + "title": "是否展示 `全选` 选项", + "type": "boolean", + "default": true + }, + "size": { + "title": "输入框尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "tag-selectable": { + "title": "下拉框内选中项支持复制功能", + "type": "string", + "default": "" + }, + "text-field": { + "title": "设置下拉框的文本对应的数据源的字段名称", + "type": "string", + "default": "label" + }, + "$$tree-op": { + "title": "下拉列表嵌套 Tree 组件时,用来配置 Tree 的数据信息", + "type": "object", + "default": "" + }, + "value": { + "title": "绑定值", + "type": ["string", "boolean"], + "default": "" + }, + "$$value": { + "title": "绑定值", + "type": "number" + }, + "value-field": { + "title": "设置下拉框的值所对应数据源的字段名称,下拉框的值用于提交到服务器", + "type": "string", + "default": "value" + }, + "value-key": { + "title": "作为 value 唯一标识的键名,绑定值为对象类型时必填", + "type": "string", + "default": "value" + }, + "#default": { + "title": "Option 组件列表插槽", + "type": "string" + }, + "#empty": { + "title": "无选项时的列表插槽", + "type": "string" + }, + "#prefix": { + "title": "Select 组件头部内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/slide-bar.json b/packages/settings/design/src/properties/slide-bar.json new file mode 100644 index 0000000..4369b2c --- /dev/null +++ b/packages/settings/design/src/properties/slide-bar.json @@ -0,0 +1,35 @@ +{ + "schema": { + "type": "object", + "properties": { + "init-blocks": { + "title": "初始时需要显示的块数", + "type": "number" + }, + "sub-tag": { + "title": "设置组件的子级 Dom 标签", + "type": "string", + "default": "li" + }, + "tag": { + "title": "设置组件的 Dom 标签", + "type": "string", + "default": "ul" + }, + "$$value": { + "title": "调用服务时候获取数据的来源", + "type": "array", + "default": "" + }, + "wheel-blocks": { + "title": "鼠标滚轮上下滚动的时候,滚动的块数长度", + "type": "number", + "default": 1 + }, + "#default": { + "title": "默认的作用域插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/slider.json b/packages/settings/design/src/properties/slider.json new file mode 100644 index 0000000..5938054 --- /dev/null +++ b/packages/settings/design/src/properties/slider.json @@ -0,0 +1,62 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "height": { + "title": "Slider 高度", + "type": "string", + "default": "300px" + }, + "max": { + "title": "设置最大值。必需是整数,可以负数。必需大于所设置的最小值", + "type": "number", + "default": 100 + }, + "min": { + "title": "设置最小值", + "type": "number", + "default": 0 + }, + "num-pages": { + "title": "设置总步数,即按快捷键 PageDown/PageUp 时,每次移动的距离是(最大值-最小值)/分页数", + "type": "number", + "default": 1 + }, + "show-input": { + "title": "是否显示输入框,仅在非范围选择时有效", + "type": "boolean", + "default": false + }, + "show-tip": { + "title": "是否显示 tooltip", + "type": "boolean", + "default": true + }, + "step": { + "title": "设置滑块移动时,每步位移距离,必需是大于0的正整数", + "type": "number", + "minimum": 1, + "default": 1 + }, + "value": { + "title": "绑定值", + "type": "number", + "default": 0 + }, + "vertical": { + "title": "是否竖向模式", + "type": "boolean", + "default": false + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/split.json b/packages/settings/design/src/properties/split.json new file mode 100644 index 0000000..1d92285 --- /dev/null +++ b/packages/settings/design/src/properties/split.json @@ -0,0 +1,49 @@ +{ + "schema": { + "type": "object", + "properties": { + "left-top-min": { + "title": "左面板 / 上面板最小阈值", + "type": ["string", "number"], + "default": "40px" + }, + "mode": { + "title": "分割类型", + "type": "string", + "default": "horizontal", + "enum": ["horizontal", "vertical"], + "enumNames": ["横向分割", "纵向分割"] + }, + "right-bottom-min": { + "title": "右面板 / 下面板最小阈值", + "type": ["string", "number"], + "default": "40px" + }, + "value": { + "title": "分割面板的位置", + "type": ["number", "string"], + "default": 0.5 + }, + "#bottom": { + "title": "下面板插槽", + "type": "string" + }, + "#left": { + "title": "左面板插槽", + "type": "string" + }, + "#right": { + "title": "右面板插槽", + "type": "string" + }, + "#top": { + "title": "上面板插槽", + "type": "string" + }, + "#trigger": { + "title": "拖拽插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/steps.json b/packages/settings/design/src/properties/steps.json new file mode 100644 index 0000000..9b4d19a --- /dev/null +++ b/packages/settings/design/src/properties/steps.json @@ -0,0 +1,39 @@ +{ + "schema": { + "type": "object", + "properties": { + "active": { + "title": "设置步骤条的选中步骤", + "type": "number", + "default": -1 + }, + "count-field": { + "title": "设置高级向导里徽标计数对应的字段名", + "type": "string", + "default": "count" + }, + "$$data": { + "title": "设置步骤条的数据 ", + "type": ["object", "array"] + }, + "name-field": { + "title": "设置节点信息中名称对应的字段名", + "type": "string", + "default": "name" + }, + "space": { + "title": "设置步骤条的宽度", + "type": "number" + }, + "status-field": { + "title": "设置数据状态对应的字段名", + "type": "string", + "default": "status" + }, + "#item": { + "title": "步骤条数据项插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/svg-icon.json b/packages/settings/design/src/properties/svg-icon.json new file mode 100644 index 0000000..035ad14 --- /dev/null +++ b/packages/settings/design/src/properties/svg-icon.json @@ -0,0 +1,28 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "fill": { + "title": "颜色", + "type": "string", + "default": "" + }, + "height": { + "title": "高度", + "type": "string", + "default": "" + }, + "src": { + "title": "", + "type": "string", + "default": "" + }, + "width": { + "title": "宽度", + "type": "string", + "default": "" + } + }, + "required": ["src"] + } +} diff --git a/packages/settings/design/src/properties/switch.json b/packages/settings/design/src/properties/switch.json new file mode 100644 index 0000000..9cbd1d7 --- /dev/null +++ b/packages/settings/design/src/properties/switch.json @@ -0,0 +1,45 @@ +{ + "schema": { + "type": "object", + "properties": { + "disabled": { + "title": "是否禁用", + "type": "boolean", + "default": false + }, + "false-value": { + "title": "switch 关闭时的值", + "type": ["string", "boolean", "number"], + "default": "" + }, + "mini": { + "title": "设置是否显示为 mini 模式。mini 模式下不会显示 slot 的内容", + "type": "boolean", + "default": false + }, + "true-value": { + "title": "switch 打开时的值", + "type": ["string", "boolean", "number"], + "default": "" + }, + "$$value": { + "title": "绑定值", + "type": ["string", "number"], + "default": "" + }, + "value": { + "title": "绑定值", + "type": "boolean", + "default": false + }, + "#close": { + "title": "关闭内容插槽", + "type": "string" + }, + "#open": { + "title": "开启内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/tabs.json b/packages/settings/design/src/properties/tabs.json new file mode 100644 index 0000000..b9d5189 --- /dev/null +++ b/packages/settings/design/src/properties/tabs.json @@ -0,0 +1,75 @@ +{ + "schema": { + "type": "object", + "properties": { + "active-name": { + "title": "激活当前页面", + "type": "string", + "default": "" + }, + "editable": { + "title": "标签是否同时可增加和关闭", + "type": "boolean", + "default": false + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "position": { + "title": "选项卡所在位置", + "type": "string", + "enum": ["top", "right", "bottom", "left"], + "enumNames": ["上边", "右边", "下边", "左边"], + "default": "top" + }, + "show-more-tabs": { + "title": "当标签页超过一定宽度时将显示 更多 ,鼠标悬停到 更多 时,将显示超出宽度的标签页", + "type": "boolean", + "default": false + }, + "size": { + "title": "设置 tabs 标签页尺寸,当与 tabStyle 为 card 或者 border-card 时生效, 该属性可选值为 small", + "type": "string", + "default": "" + }, + "stretch": { + "title": "标签的宽度是否自撑开", + "type": "boolean", + "default": false + }, + "tab-style": { + "title": "标签页样式", + "type": "string", + "enum": ["card", "border-card"], + "enumNames": ["卡片类型", "带边框卡片类型"], + "default": "" + }, + "$$value": { + "title": "绑定值,选中选项卡的 name", + "type": "string", + "default": "" + }, + "with-add": { + "title": "标签是否可增加", + "type": "boolean", + "default": false + }, + "with-close": { + "title": "标签是否可关闭", + "type": "boolean", + "default": false + }, + "#title": { + "title": "自定义title内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/tag.json b/packages/settings/design/src/properties/tag.json new file mode 100644 index 0000000..a427def --- /dev/null +++ b/packages/settings/design/src/properties/tag.json @@ -0,0 +1,51 @@ +{ + "schema": { + "type": "object", + "properties": { + "closeable": { + "title": "是否可关闭", + "type": "boolean" + }, + "color": { + "title": "背景色", + "type": "string", + "default": "" + }, + "disable-transitions": { + "title": "是否禁用渐变动画", + "type": "boolean", + "default": false + }, + "effect": { + "title": "主题", + "type": "string", + "enum": ["dark", "light", "plain"], + "enumNames": ["暗色", "亮色", "朴素色"], + "default": "light" + }, + "hit": { + "title": "是否有边框描边", + "type": "boolean", + "default": false + }, + "size": { + "title": "尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "type": { + "title": "类型", + "type": "string", + "enum": ["success", "info", "warning", "danger"], + "enumNames": ["成功类型", "信息类型", "警告类型", "危险类型"], + "default": "" + }, + "#default": { + "title": "标签内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/text-popup.json b/packages/settings/design/src/properties/text-popup.json new file mode 100644 index 0000000..5edc8db --- /dev/null +++ b/packages/settings/design/src/properties/text-popup.json @@ -0,0 +1,34 @@ +{ + "schema": { + "type": "object", + "properties": { + "placeholder": { + "title": "设置输入框内的提示占位文本", + "type": "string", + "default": "" + }, + "readonly": { + "title": "设置是否只读", + "type": "boolean", + "default": false + }, + "separtor": { + "title": "分隔符", + "type": "string", + "default": "," + }, + "value": { + "title": "绑定值", + "type": "string", + "default": "" + }, + "width": { + "title": "设置宽度", + "type": ["number", "string"], + "minimum": 0, + "multipleOf": 1, + "default": "150" + } + } + } +} diff --git a/packages/settings/design/src/properties/time-line.json b/packages/settings/design/src/properties/time-line.json new file mode 100644 index 0000000..09939f3 --- /dev/null +++ b/packages/settings/design/src/properties/time-line.json @@ -0,0 +1,67 @@ +{ + "schema": { + "type": "object", + "properties": { + "active": { + "title": "设置步骤条的选中步骤", + "type": "number", + "default": -1 + }, + "$$data": { + "title": "设置时间线步骤条数据", + "type": "array", + "default": "" + }, + "name-field": { + "title": "设置节点信息中名称对应的字段名", + "type": "string", + "default": "name" + }, + "reverse": { + "title": "是否设置竖向步骤条反方向", + "type": "boolean", + "default": false + }, + "show-number": { + "title": "设置未完成的状态是否显示序号", + "type": "boolean", + "default": true + }, + "space": { + "title": "设置步骤条的宽度", + "type": "number" + }, + "start": { + "title": "设置步骤条序号起始值", + "type": "number", + "default": 1 + }, + "time-field": { + "title": "设置节点时间信息对应的字段名", + "type": "string", + "default": "time" + }, + "vertical": { + "title": "竖式步骤条", + "type": "boolean", + "default": false + }, + "#bottom": { + "title": "定义步骤条底部插槽", + "type": "string" + }, + "#left": { + "title": "定义步骤条左侧内容插槽", + "type": "string" + }, + "#right": { + "title": "定义步骤条右侧内容插槽", + "type": "string" + }, + "#top": { + "title": "定义步骤条顶部插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/time-picker-options.json b/packages/settings/design/src/properties/time-picker-options.json new file mode 100644 index 0000000..85fa1a2 --- /dev/null +++ b/packages/settings/design/src/properties/time-picker-options.json @@ -0,0 +1,17 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "format": { + "title": "时间格式化(TimePicker)", + "type": "string", + "default": "'HH:mm:ss'" + }, + "selectableRange": { + "title": "可选时间段,例如'18:30:00 - 20:30:00'或者传入数组['09:30:00 - 12:00:00', '14:30:00 - 18:30:00']", + "type": ["string", "array"], + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/time-picker.json b/packages/settings/design/src/properties/time-picker.json new file mode 100644 index 0000000..e847b2d --- /dev/null +++ b/packages/settings/design/src/properties/time-picker.json @@ -0,0 +1,112 @@ +{ + "schema": { + "type": "object", + "properties": { + "arrow-control": { + "title": "是否使用箭头进行时间选择,仅对有效", + "type": "boolean", + "default": false + }, + "$$clear-icon": { + "title": "自定义清空图标的类名", + "type": "string", + "default": "IconOperationfaild" + }, + "clearable": { + "title": "是否显示清除按钮", + "type": "boolean", + "default": true + }, + "default-value": { + "title": "可选,选择器打开时默认显示的时间", + "type": "string", + "format": "date-time", + "default": "" + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "editable": { + "title": "文本框是否可输入", + "type": "boolean", + "default": true + }, + "end-placeholder": { + "title": "范围选择时结束日期的占位内容", + "type": "string", + "default": "" + }, + "is-range": { + "title": "是否为时间范围选择,仅对有效", + "type": "boolean", + "default": false + }, + "name": { + "title": "原生属性", + "type": "string", + "default": "" + }, + "$$picker-options": { + "title": "当前时间日期选择器特有的选项参考下表", + "type": "object", + "properties": { + "selectableRange": { + "title": "可选时间段,例如'18:30:00 - 20:30:00'或者传入数组['09:30:00 - 12:00:00', '14:30:00 - 18:30:00']", + "type": "string", + "default": "" + }, + "format": { + "title": "时间格式化(TimePicker)", + "type": "string", + "default": "'HH:mm:ss'" + } + } + }, + "placeholder": { + "title": "非范围选择时的占位内容", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false", + "type": "boolean", + "default": true + }, + "popper-class": { + "title": "TimePicker 下拉框的类名", + "type": "string", + "default": "" + }, + "range-separator": { + "title": "选择范围时的分隔符", + "type": "string", + "default": "-" + }, + "size": { + "title": "输入框尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "start-placeholder": { + "title": "范围选择时开始日期的占位内容", + "type": "string", + "default": "" + }, + "$$suffix-icon": { + "title": "自定义头部图标的类名", + "type": "string", + "default": "" + }, + "value": { + "title": "绑定值", + "type": ["string", "array"], + "format": "date-time", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/time-select-options.json b/packages/settings/design/src/properties/time-select-options.json new file mode 100644 index 0000000..f639618 --- /dev/null +++ b/packages/settings/design/src/properties/time-select-options.json @@ -0,0 +1,32 @@ +{ + "$$schema": { + "type": "object", + "properties": { + "end": { + "title": "结束时间", + "type": "string", + "default": "18:00" + }, + "maxTime": { + "title": "最大时间,大于该时间的时间段将被禁用", + "type": "string", + "default": "" + }, + "minTime": { + "title": "最小时间,小于该时间的时间段将被禁用", + "type": "string", + "default": "00:00" + }, + "start": { + "title": "开始时间", + "type": "string", + "default": "9:00" + }, + "step": { + "title": "间隔时间", + "type": "string", + "default": "00:30" + } + } + } +} diff --git a/packages/settings/design/src/properties/time-select.json b/packages/settings/design/src/properties/time-select.json new file mode 100644 index 0000000..f501b1e --- /dev/null +++ b/packages/settings/design/src/properties/time-select.json @@ -0,0 +1,102 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$clear-icon": { + "title": "自定义清空图标", + "type": "string", + "default": "IconOperationfaild" + }, + "clearable": { + "title": "是否显示清除按钮", + "type": "boolean", + "default": true + }, + "default-value": { + "title": "可选,选择器打开时默认显示的时间", + "type": "string", + "format": "date-time", + "default": "" + }, + "disabled": { + "title": "禁用", + "type": "boolean", + "default": false + }, + "editable": { + "title": "文本框可输入", + "type": "boolean", + "default": true + }, + "name": { + "title": "原生属性", + "type": "string", + "default": "" + }, + "$$picker-options": { + "title": "当前时间日期选择器特有的选项参考下表", + "type": "object", + "properties": { + "start": { + "title": "开始时间", + "type": "string", + "default": "9:00" + }, + "end": { + "title": "结束时间", + "type": "string", + "default": "18:00" + }, + "step": { + "title": "间隔时间", + "type": "string", + "default": "00:30" + }, + "minTime": { + "title": "最小时间,小于该时间的时间段将被禁用", + "type": "string", + "default": "00:00" + }, + "maxTime": { + "title": "最大时间,大于该时间的时间段将被禁用", + "type": "string", + "default": "" + } + } + }, + "placeholder": { + "title": "非范围选择时的占位内容", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "TimePicker 下拉框的类名", + "type": "string", + "default": "" + }, + "size": { + "title": "输入框尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "$$suffix-icon": { + "title": "自定义头部图标", + "type": "string", + "default": "" + }, + "value": { + "title": "绑定值", + "type": ["string", "array"], + "format": "date-time", + "default": "" + } + } + } +} diff --git a/packages/settings/design/src/properties/toggle-menu.json b/packages/settings/design/src/properties/toggle-menu.json new file mode 100644 index 0000000..a29057d --- /dev/null +++ b/packages/settings/design/src/properties/toggle-menu.json @@ -0,0 +1,82 @@ +{ + "schema": { + "type": "object", + "properties": { + "automatic-filtering": { + "title": "输入框输入内容时是否自动过滤内容", + "type": "boolean", + "default": true + }, + "$$data": { + "title": "设置收缩菜单的数据", + "type": "array", + "default": "" + }, + "default-expand-all": { + "title": "设置菜单默认是否展开所有节点", + "type": "boolean", + "default": false + }, + "dragable": { + "title": "设置是否开启拖拽节点的功能", + "type": "boolean", + "default": false + }, + "ellipsis": { + "title": "菜单内容超长时是否省略显示", + "type": "boolean", + "default": false + }, + "expand-on-click-node": { + "title": "设置是否可以通过点击节点展开/收起菜单", + "type": "boolean", + "default": false + }, + "$$icon": { + "title": "自定义菜单左侧图标", + "type": "object", + "default": "" + }, + "placeholder": { + "title": "输入框占位符", + "type": "string", + "default": "" + }, + "$$props": { + "title": "配置数据选项的映射字段名称", + "type": "object", + "properties": { + "children": { + "title": "子节点的映射字段名称", + "type": "string", + "default": "children" + }, + "label": { + "title": "节点文本的映射字段名称", + "type": "string", + "default": "label" + }, + "disabled": { + "title": "禁用映射字段名称", + "type": "string", + "default": "disabled" + } + } + }, + "show-filter": { + "title": "设置是否展示过滤搜索框", + "type": "boolean", + "default": true + }, + "wrap": { + "title": "菜单内容超长时是否换行显示", + "type": "boolean", + "default": false + }, + "#node": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/tooltip.json b/packages/settings/design/src/properties/tooltip.json new file mode 100644 index 0000000..447047e --- /dev/null +++ b/packages/settings/design/src/properties/tooltip.json @@ -0,0 +1,131 @@ +{ + "schema": { + "type": "object", + "properties": { + "append-to-body": { + "title": "是否添加到body上", + "type": "boolean", + "default": true + }, + "content": { + "title": "显示的内容,也可以通过 slot #content 传入 DOM", + "type": "string", + "default": "" + }, + "disabled": { + "title": "Tooltip 是否可用", + "type": "boolean", + "default": false + }, + "effect": { + "title": "默认提供的主题", + "type": "string", + "enum": ["dark", "light"], + "enumNames": ["暗色", "亮色"], + "default": "dark" + }, + "enterable": { + "title": "鼠标是否可进入到 tooltip 中", + "type": "boolean", + "default": true + }, + "hide-after": { + "title": "Tooltip 出现后自动隐藏延时,单位毫秒,为 0 则不会自动隐藏", + "type": "number", + "default": 0 + }, + "manual": { + "title": "手动控制模式,设置为 true 后,mouseenter 和 mouseleave 事件将不会生效", + "type": "boolean", + "default": false + }, + "offset": { + "title": "出现位置的偏移量", + "type": "number", + "default": 0 + }, + "open-delay": { + "title": "延迟出现,单位毫秒", + "type": "number", + "default": 0 + }, + "placement": { + "title": "Tooltip 的出现位置", + "type": "string", + "enum": [ + "top", + "top-start", + "top-end", + "bottom", + "bottom-start", + "bottom-end", + "left", + "left-start", + "left-end", + "right", + "right-start", + "right-end" + ], + "enumNames": ["上边", "上左", "上右", "下边", "下左", "下右", "左边", "左上", "左下", "右边", "右上", "右下"], + "default": "bottom" + }, + "popper-class": { + "title": "为 Tooltip 的 popper 添加类名", + "type": "string", + "default": "" + }, + "$$popper-options": { + "title": "popper.js 的参数", + "type": "object", + "default": "{ boundariesPadding: 10, gpuAcceleration: false }", + "properties": { + "boundariesPadding": { + "title": "边界内边距", + "type": "number", + "default": 10 + }, + "gpuAcceleration": { + "title": "是否 popper 的位置将通过 CSS3 的 translate3d 来改变", + "type": "boolean", + "default": false + } + } + }, + "tabindex": { + "title": "配置该元素,配置的属性会自动添加到该组件的触发原上", + "type": "number", + "default": 0 + }, + "transition": { + "title": "定义渐变动画", + "type": "string", + "default": "aui-fade-in-linear" + }, + "type": { + "title": "提示信息类型", + "type": "string", + "enum": ["normal", "warning", "error", "info", "success"], + "enumNames": ["默认", "警告", "错误", "信息", "成功"], + "default": "normal" + }, + "$$value": { + "title": "状态是否可见", + "type": "boolean", + "default": false + }, + "visible-arrow": { + "title": "是否显示 Tooltip 箭头,popper.js 的参数", + "type": "boolean", + "default": true + }, + "#content": { + "title": "内容插槽", + "type": "string" + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/transfer.json b/packages/settings/design/src/properties/transfer.json new file mode 100644 index 0000000..bc44aea --- /dev/null +++ b/packages/settings/design/src/properties/transfer.json @@ -0,0 +1,184 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$button-texts": { + "title": "自定义按钮文案", + "type": "array", + "default": [] + }, + "$$columns": { + "title": "设置穿梭框的表格列配置, 此属性只在渲染类型(renderType)为 grid 时生效", + "type": "array", + "default": "" + }, + "$$data": { + "title": "Transfer 的数据源", + "type": "array", + "default": "" + }, + "$$drop-config": { + "title": "设置穿梭框列表项可拖拽", + "type": "object", + "default": "" + }, + "filter-placeholder": { + "title": "搜索框占位符", + "type": "string", + "default": "请输入搜索内容" + }, + "filterable": { + "title": "是否可搜索", + "type": "boolean", + "default": true + }, + "$$format": { + "title": "列表顶部勾选状态文案", + "type": "object", + "properties": { + "noChecked": { + "title": "左侧列表顶部将展示已勾选数据和所有数据的比值", + "type": "string", + "default": "${checked}/${total}" + }, + "hasChecked": { + "title": "右侧列表顶部将展示已勾选数据和所有数据的比值", + "type": "string", + "default": "${checked}/${total}" + } + } + }, + "$$left-default-checked": { + "title": "初始状态下左侧列表的已勾选项的 key 数组", + "type": "array", + "default": [] + }, + "$$pager-op": { + "title": "设置分页配置,当渲染为表格时有效", + "type": "object", + "properties": { + "mode": { + "title": "设置分页显示模式", + "type": "string", + "default": "fixed", + "enum": ["number", "simple", "complete", "fixed"], + "enumNames": ["数字模式", "简单模式", "完成模式", "固定模式"] + }, + "render": { + "pageVO": "分页的配置对象", + "type": "object", + "properties": { + "currentPage": { + "title": "当前页数,支持 .sync 修饰符", + "type": "Number", + "default": "1" + }, + "pageSize": { + "title": "每页显示条目个数,支持 .sync 修饰符", + "type": "Number", + "default": "10" + } + } + } + } + }, + "$$props": { + "title": "数据源的字段别名,可对key、label、disabled字段进行映射", + "type": "object", + "properties": { + "label": { + "title": "节点文本的映射字段名称", + "type": "string", + "default": "label" + }, + "key": { + "title": "子节点的映射字段 key 值", + "type": "string", + "default": "key" + }, + "disabled": { + "title": "禁用映射字段名称", + "type": "string", + "default": "disabled" + } + } + }, + "$$render": { + "title": "当plugin设置为Table时设置渲染为表格,当plugin设置为Tree渲染为树", + "type": "object", + "default": "" + }, + "$$right-default-checked": { + "title": "初始状态下右侧列表的已勾选项的 key 数组", + "type": "array", + "default": [] + }, + "show-all-btn": { + "title": "展示全部移动按钮", + "type": "boolean", + "default": false + }, + "show-pager": { + "title": "设置是否显示分页,当渲染为表格时有效", + "type": "boolean", + "default": false + }, + "target-order": { + "title": "右侧列表元素的排序策略:若为 original,则保持与数据源相同的顺序;若为 push,则新加入的元素排在最后;若为 unshift,则新加入的元素排在最前", + "type": "string", + "enum": ["original", "push", "unshift"], + "enumNames": ["保持原顺序", "后排插入", "前排插入"], + "default": "original" + }, + "$$titles": { + "title": "自定义列表标题", + "type": "array", + "default": ["列表 1", "列表 2"] + }, + "to-left-disable": { + "title": "提供给用户控制穿梭框按钮禁用状态的属性,组件初始化状态下未选中时显示禁用状态", + "type": "boolean", + "default": true + }, + "to-right-disable": { + "title": "提供给用户控制穿梭框按钮禁用状态的属性,组件初始化状态下未选中时显示禁用状态", + "type": "boolean", + "default": true + }, + "$$tree-op": { + "title": "当plugin设置为Tree渲染为树时,设置树的相关配置属性", + "type": "object", + "default": "" + }, + "$$value": { + "title": "绑定值", + "type": "array", + "default": [] + }, + "#button-panel": { + "title": "自定义穿梭按钮插槽", + "type": "string" + }, + "#default": { + "title": "自定义数据项的内容插槽,参数为 { option }", + "type": "string" + }, + "#left-footer": { + "title": "左侧列表底部的内容插槽", + "type": "string" + }, + "#left-panel": { + "title": "左侧自定义内容插槽", + "type": "string" + }, + "#right-footer": { + "title": "右侧列表底部的内容插槽", + "type": "string" + }, + "#right-panel": { + "title": "右侧自定义内容插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/tree-menu.json b/packages/settings/design/src/properties/tree-menu.json new file mode 100644 index 0000000..ff9f9ad --- /dev/null +++ b/packages/settings/design/src/properties/tree-menu.json @@ -0,0 +1,106 @@ +{ + "schema": { + "type": "object", + "properties": { + "accordion": { + "title": "是否展示为手风琴效果,默认值为 false", + "type": "boolean", + "default": false + }, + "check-strictly": { + "title": "在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false, 需要与 show-checkbox 一起使用", + "type": "boolean", + "default": false + }, + "$$data": { + "title": "展示数据", + "type": "array", + "default": "" + }, + "$$default-checked-keys": { + "title": "默认勾选的节点的 key 的数组", + "type": "array", + "default": "" + }, + "default-expand-all": { + "title": "初始化是否展开所有子节点", + "type": "boolean", + "default": false + }, + "$$default-expanded-keys": { + "title": "默认展开的节点的 key 的数组", + "type": "array", + "default": "" + }, + "draggable": { + "title": "是否可拖动菜单", + "type": "boolean", + "default": false + }, + "ellipsis": { + "title": "是否省略显示。优先级高于wrap。配置为 true,节点文字显示需要的宽度超过容器的宽度,节点文字不换行,也不会出现横向滚动条,超出部分文字显示为'...'", + "type": "boolean", + "default": false + }, + "empty-text": { + "title": "内容为空的时候展示的文本", + "type": "string", + "default": "暂无数据" + }, + "expand-on-click-node": { + "title": "配置点击菜单文字是否能展开菜单", + "type": "boolean", + "default": true + }, + "indent": { + "title": "相邻级节点间的水平缩进,单位为像素", + "type": "number", + "default": 12 + }, + "lazy": { + "title": "是否懒加载子节点,需与 load 方法结合使用", + "type": "boolean", + "default": false + }, + "node-key": { + "title": "每个树节点用来作为唯一标识的属性,整棵树应该是唯一的", + "type": "string", + "default": "" + }, + "$$prefix-icon": { + "title": "自定义前置图标", + "type": "object", + "default": "" + }, + "$$search-icon": { + "title": "自定义搜索图标", + "type": "object", + "default": "IconSearch()" + }, + "show-checkbox": { + "title": "节点是否可被选择", + "type": "boolean", + "default": false + }, + "show-filter": { + "title": "是否显示搜索过滤框", + "type": "boolean", + "default": true + }, + "show-title": { + "title": "是否显示节点的 title 提示,鼠标悬浮节点之上触发", + "type": "boolean", + "default": true + }, + "wrap": { + "title": "是否换行显示", + "type": "boolean", + "default": false + }, + "#default": { + "title": "自定义树节点的内容插槽,参数为 { node, data }", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/tree.json b/packages/settings/design/src/properties/tree.json new file mode 100644 index 0000000..c3c14a8 --- /dev/null +++ b/packages/settings/design/src/properties/tree.json @@ -0,0 +1,141 @@ +{ + "schema": { + "type": "object", + "properties": { + "accordion": { + "title": "是否每次只打开一个同级树节点展开", + "type": "boolean", + "default": false + }, + "auto-expand-parent": { + "title": "展开子节点的时候是否自动展开父节点", + "type": "boolean", + "default": true + }, + "check-on-click-node": { + "title": "是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点", + "type": "boolean", + "default": false + }, + "check-strictly": { + "title": "在显示复选框的情况下,是否严格的遵循父子不互相关联的做法", + "type": "boolean", + "default": false + }, + "$$data": { + "title": "展示数据", + "type": "array", + "default": "" + }, + "$$default-checked-keys": { + "title": "默认勾选的节点的 key 的数组", + "type": "array", + "default": "" + }, + "default-expand-all": { + "title": "是否默认展开所有节点", + "type": "boolean", + "default": false + }, + "$$default-expanded-keys": { + "title": "默认展开的节点的 key 的数组", + "type": "array", + "default": "" + }, + "draggable": { + "title": "是否开启拖拽节点功能", + "type": "boolean", + "default": false + }, + "empty-text": { + "title": "内容为空的时候展示的文本", + "type": "string", + "default": "" + }, + "$$expand-icon": { + "title": "指示展开的图标", + "type": "object", + "default": "" + }, + "expand-on-click-node": { + "title": "是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点", + "type": "boolean", + "default": true + }, + "highlight-current": { + "title": "是否高亮当前选中节点", + "type": "boolean", + "default": false + }, + "$$icon": { + "title": "自定义树节点的图标", + "type": "object", + "default": "" + }, + "icon-trigger-click-node": { + "title": "点击图标展开节点时是否触发 node-click 事件", + "type": "boolean", + "default": true + }, + "indent": { + "title": "相邻级节点间的水平缩进,单位为像素", + "type": "number", + "default": 18 + }, + "lazy": { + "title": "是否懒加载子节点,需与 load 方法结合使用", + "type": "boolean", + "default": false + }, + "node-key": { + "title": "每个树节点用来作为唯一标识的属性,整棵树应该是唯一的", + "type": "string", + "default": "" + }, + "$$props": { + "title": "配置选项", + "type": "object", + "properties": { + "children": { + "title": "子节点的映射字段名称", + "type": "string", + "default": "children" + }, + "label": { + "title": "节点文本的映射字段名称", + "type": "string", + "default": "label" + }, + "disabled": { + "title": "禁用映射字段名称", + "type": "string", + "default": "disabled" + } + } + }, + "render-after-expand": { + "title": "是否在第一次展开某个树节点后才渲染其子节点", + "type": "boolean", + "default": true + }, + "show-checkbox": { + "title": "节点是否可被选择", + "type": "boolean", + "default": false + }, + "$$shrink-icon": { + "title": "指示收缩的图标", + "type": "object", + "default": "" + }, + "#default": { + "title": "自定义树节点的内容插槽,参数为 { node, data }", + "type": "string" + }, + "#empty": { + "title": "自定义空数据文本插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/user-account.json b/packages/settings/design/src/properties/user-account.json new file mode 100644 index 0000000..06fd202 --- /dev/null +++ b/packages/settings/design/src/properties/user-account.json @@ -0,0 +1,26 @@ +{ + "schema": { + "type": "object", + "properties": { + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "showArrow": { + "title": "设置为true时,箭头会与Roles组件的箭头方向保持一致", + "type": "boolean", + "default": false + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/user-contact.json b/packages/settings/design/src/properties/user-contact.json new file mode 100644 index 0000000..fd14872 --- /dev/null +++ b/packages/settings/design/src/properties/user-contact.json @@ -0,0 +1,45 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$data": { + "type": "object", + "default": "" + }, + "$$espace": { + "title": "espace 信息配置", + "type": "array", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "show-img": { + "title": "是否显示头像", + "type": "boolean", + "default": true + }, + "show-name": { + "title": "是否显示姓名 userName", + "type": "boolean", + "default": true + }, + "show-number": { + "title": "是否显示工号 roleNumber", + "type": "boolean", + "default": true + }, + "#default": { + "title": "默认插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/user-head.json b/packages/settings/design/src/properties/user-head.json new file mode 100644 index 0000000..9b4fce9 --- /dev/null +++ b/packages/settings/design/src/properties/user-head.json @@ -0,0 +1,59 @@ +{ + "schema": { + "type": "object", + "properties": { + "background-color": { + "title": "背景色 ", + "type": "string", + "default": "#d9d9d9" + }, + "color": { + "title": "文字颜色 ", + "type": "string", + "default": "#ffffff" + }, + "message-total": { + "title": "消息计数 ", + "type": "number" + }, + "message-type": { + "title": "消息类型", + "type": "string", + "enum": ["details", "basic"], + "enumNames": ["数字类型", "小圆点类型"], + "default": "details" + }, + "message-upper-limit": { + "title": "消息显示上限 ", + "type": "number", + "default": 0 + }, + "min": { + "title": "小尺寸模式 ", + "type": "boolean", + "default": false + }, + "round": { + "title": "圆形模式 ", + "type": "boolean", + "default": true + }, + "type": { + "title": "头像类型,icon|image|label 可选", + "type": "string", + "enum": ["icon", "image", "label"], + "enumNames": ["图标类型", "图像类型", "标签类型"], + "default": "label" + }, + "$$value": { + "title": "type=icon 时为图标类名(默认'icon-user'),type=label 时为字体串(默认'U'),type=image时为资源路径", + "type": "string", + "default": "" + }, + "#default": { + "title": "自定义图像内容", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/user-link.json b/packages/settings/design/src/properties/user-link.json new file mode 100644 index 0000000..75a4bf8 --- /dev/null +++ b/packages/settings/design/src/properties/user-link.json @@ -0,0 +1,47 @@ +{ + "schema": { + "type": "object", + "properties": { + "cache": { + "title": "是否开启用户数据缓存", + "type": "boolean", + "default": true + }, + "$$cache-fields": { + "title": "自定义缓存的字段", + "type": "array", + "default": [] + }, + "cache-key": { + "title": "自定义缓存 key", + "type": "string", + "default": "aurora-user" + }, + "text-field": { + "title": "设置下拉框的文本对应的数据源的字段名称", + "type": "string", + "default": "userCN" + }, + "text-split": { + "title": "在多选的情况下,设置输入框显示多个文本时的分隔符", + "type": "string", + "default": "," + }, + "value": { + "title": "配置默认值", + "type": "string", + "default": "" + }, + "value-field": { + "title": "设置下拉框的值所对应数据源的字段名称", + "type": "string", + "default": "userId" + }, + "value-split": { + "title": "在多选的情况下,设置输入框显示多个文本时的分隔符", + "type": "string", + "default": "," + } + } + } +} diff --git a/packages/settings/design/src/properties/user.json b/packages/settings/design/src/properties/user.json new file mode 100644 index 0000000..7dcc7ca --- /dev/null +++ b/packages/settings/design/src/properties/user.json @@ -0,0 +1,113 @@ +{ + "schema": { + "type": "object", + "properties": { + "cache": { + "title": "是否缓存用户数据", + "type": "boolean", + "default": true + }, + "$$cache-fields": { + "title": "设置需要缓存的用户数据", + "type": "array", + "default": [] + }, + "cache-key": { + "title": "设置缓存数据的 key 值", + "type": "string", + "default": "aurora-user" + }, + "collapse-show-overflow-tooltip": { + "title": "是否省略显示超出一行的数据并有tooltip提示", + "type": "boolean", + "default": true + }, + "collapse-tags": { + "title": "多用户时是否折叠标签", + "type": "boolean", + "default": false + }, + "delay": { + "title": "设置延时加载的时间(ms)", + "type": "number", + "default": 600 + }, + "disabled": { + "title": "是否禁用户组件", + "type": "boolean", + "default": false + }, + "multiple": { + "title": "是否开启多用户形式", + "type": "boolean", + "default": false + }, + "placeholder": { + "title": "设置输入框占位文本", + "type": "string", + "default": "" + }, + "popper-append-to-body": { + "title": "是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)", + "type": "boolean", + "default": true + }, + "$$popper-class": { + "title": "为 popper 添加类名(可参考 popover 组件)", + "type": "string", + "default": "" + }, + "size": { + "title": "设置用户组件尺寸", + "type": "string", + "enum": ["medium", "small", "mini"], + "enumNames": ["中等尺寸", "较小尺寸", "迷你尺寸"], + "default": "" + }, + "sort-by-fetch-data": { + "title": "联想时下拉框的数据顺序和接口返回的数据顺序一致", + "type": "boolean", + "default": false + }, + "suggest-length": { + "title": "设置输入指定长度完成后进行加载", + "type": "number", + "default": 3 + }, + "tag-selectable": { + "title": "是否开启输入框中已选择的选项可复制", + "type": "boolean", + "default": false + }, + "text-field": { + "title": "显示字段映射", + "type": "string", + "default": "userCN" + }, + "textSplit": { + "title": "文本粘贴复制查询时的分割符", + "type": "string", + "default": "," + }, + "value": { + "title": "配置默认值", + "type": "string", + "default": "" + }, + "value-field": { + "title": "取值字段映射", + "type": "string", + "default": "userId" + }, + "value-split": { + "title": "值分隔符", + "type": "string", + "default": "," + }, + "#options": { + "title": "选项文本插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/properties/wizard.json b/packages/settings/design/src/properties/wizard.json new file mode 100644 index 0000000..b7df05f --- /dev/null +++ b/packages/settings/design/src/properties/wizard.json @@ -0,0 +1,43 @@ +{ + "schema": { + "type": "object", + "properties": { + "$$data": { + "title": "设置流程图的数据", + "type": "array", + "default": [] + }, + "page-guide": { + "title": "设置流程图为页向导流程图", + "type": "boolean", + "default": false + }, + "time-line-flow": { + "title": "设置流程图为时间线流程图", + "type": "boolean", + "default": false + }, + "vertical": { + "title": "设置流程图为垂直流程图", + "type": "boolean", + "default": false + }, + "#base": { + "title": "基本流程图插槽", + "type": "string" + }, + "#card": { + "title": "卡片插槽", + "type": "string" + }, + "#stepbutton": { + "title": "页向导流程图按钮插槽", + "type": "string" + }, + "#vertical": { + "title": "垂直流程图插槽", + "type": "string" + } + } + } +} diff --git a/packages/settings/design/src/schema/carousel-item.json b/packages/settings/design/src/schema/carousel-item.json new file mode 100644 index 0000000..dc4651f --- /dev/null +++ b/packages/settings/design/src/schema/carousel-item.json @@ -0,0 +1,32 @@ +{ + "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": {} +} diff --git a/packages/settings/design/src/schema/carousel.json b/packages/settings/design/src/schema/carousel.json new file mode 100644 index 0000000..40091ad --- /dev/null +++ b/packages/settings/design/src/schema/carousel.json @@ -0,0 +1,146 @@ +{ + "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": "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": "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": "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": {} +} diff --git a/packages/settings/design/src/schemas/button.json b/packages/settings/design/src/schemas/button.json new file mode 100644 index 0000000..ff74424 --- /dev/null +++ b/packages/settings/design/src/schemas/button.json @@ -0,0 +1,299 @@ +{ + "icon": "button", + "name": { + "zh_CN": "按钮" + }, + "component": "tiny-button", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "text", + "type": "object", + "defaultValue": "按钮文案", + "label": { + "text": { + "zh_CN": "按钮文字" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "MetaBindI18n", + "props": {} + }, + "description": { + "zh_CN": "" + } + }, + { + "property": "size", + "type": "select", + "defaultValue": "large", + "label": { + "text": { + "zh_CN": "大小" + } + }, + "cols": 12, + "rules": [], + "hidden": false, + "required": true, + "readOnly": false, + "disabled": false, + "widget": { + "component": "select", + "props": { + "options": [ + { "label": "large", "value": "large" }, + { "label": "middle", "value": "middle" }, + { "label": "small", "value": "small" }, + { "label": "xs", "value": "xs" } + ] + } + }, + "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": "MetaNumeric", + "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": "" + } + }, + "shortcuts": { + "properties": ["text", "size"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/checkbox.json b/packages/settings/design/src/schemas/checkbox.json new file mode 100644 index 0000000..002dc54 --- /dev/null +++ b/packages/settings/design/src/schemas/checkbox.json @@ -0,0 +1,205 @@ +{ + "icon": "checkbox", + "name": { + "zh_CN": "复选框" + }, + "component": "tiny-checkbox", + "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": "" + } + }, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/checkboxbutton.json b/packages/settings/design/src/schemas/checkboxbutton.json new file mode 100644 index 0000000..c96c34c --- /dev/null +++ b/packages/settings/design/src/schemas/checkboxbutton.json @@ -0,0 +1,137 @@ +{ + "icon": "checkboxbutton", + "name": { + "zh_CN": "复选框按钮" + }, + "component": "tiny-checkbox-button", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "value", + "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": "" + } + }, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/checkboxgroup.json b/packages/settings/design/src/schemas/checkboxgroup.json new file mode 100644 index 0000000..5a92a20 --- /dev/null +++ b/packages/settings/design/src/schemas/checkboxgroup.json @@ -0,0 +1,147 @@ +{ + "icon": "checkboxgroup", + "name": { + "zh_CN": "复选框组" + }, + "component": "tiny-checkbox-group", + "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": "options", + "label": { + "text": { + "zh_CN": "数据列表" + } + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/collapse.json b/packages/settings/design/src/schemas/collapse.json new file mode 100644 index 0000000..eb0740b --- /dev/null +++ b/packages/settings/design/src/schemas/collapse.json @@ -0,0 +1,100 @@ +{ + "icon": "collapse", + "name": { + "zh_CN": "折叠面板" + }, + "component": "tiny-collapse", + "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" + } + ] + } + ], + "slots": { + "default": [ + { + "componentName": "tiny-collapse-item", + "props": { + "name": "collapse1" + } + }, + { + "componentName": "tiny-collapse-item", + "props": { + "name": "collapse2" + } + }, + { + "componentName": "tiny-collapse-item", + "props": { + "name": "collapse3" + } + } + ] + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/collapseitem.json b/packages/settings/design/src/schemas/collapseitem.json new file mode 100644 index 0000000..3293e75 --- /dev/null +++ b/packages/settings/design/src/schemas/collapseitem.json @@ -0,0 +1,101 @@ +{ + "icon": "collapseitem", + "name": { + "zh_CN": "折叠项" + }, + "component": "tiny-collapse-item", + "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" + } + ] + } + ], + "slots": { + "default": {} + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/dialogbox.json b/packages/settings/design/src/schemas/dialogbox.json new file mode 100644 index 0000000..de16f29 --- /dev/null +++ b/packages/settings/design/src/schemas/dialogbox.json @@ -0,0 +1,193 @@ +{ + "icon": "dialogbox", + "name": { + "zh_CN": "对话框" + }, + + "component": "tiny-dialog-box", + "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" + } + ] + } + ], + "slots": { + "default": {}, + "footer": {} + }, + "events": { + "onClose": { + "label": { + "zh_CN": "关闭弹窗时触发" + }, + "description": { + "zh_CN": "Dialog 关闭的回调" + }, + "type": "event", + "functionInfo": { + "params": [], + "returns": {} + }, + "defaultValue": "" + } + }, + "shortcuts": { + "properties": ["visible", "title"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/floatbar.json b/packages/settings/design/src/schemas/floatbar.json new file mode 100644 index 0000000..dd20544 --- /dev/null +++ b/packages/settings/design/src/schemas/floatbar.json @@ -0,0 +1,20 @@ +{ + "icon": "floatbar", + "name": { + "zh_CN": "浮动块" + }, + "component": "tiny-floatbar", + "schema": { + "properties": [], + "slots": { + "default": {} + }, + "events": {}, + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/form.json b/packages/settings/design/src/schemas/form.json new file mode 100644 index 0000000..b01dfd7 --- /dev/null +++ b/packages/settings/design/src/schemas/form.json @@ -0,0 +1,325 @@ +{ + "icon": "form", + "name": { + "zh_CN": "表单" + }, + "component": "tiny-form", + "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": "" + } + } + ], + "slots": { + "default": {} + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/formitem.json b/packages/settings/design/src/schemas/formitem.json new file mode 100644 index 0000000..1ff47a7 --- /dev/null +++ b/packages/settings/design/src/schemas/formitem.json @@ -0,0 +1,93 @@ +{ + "icon": "formitem", + "name": { + "zh_CN": "表单项" + }, + "component": "tiny-form-item", + "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, + "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": {}, + "shortcuts": { + "properties": ["label-width", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/grid.json b/packages/settings/design/src/schemas/grid.json new file mode 100644 index 0000000..9eaca72 --- /dev/null +++ b/packages/settings/design/src/schemas/grid.json @@ -0,0 +1,692 @@ +{ + "icon": "table", + "name": { + "zh_CN": "表格" + }, + "component": "tiny-grid", + "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": "MetaCollection", + "props": {} + }, + "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": "testData", + "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": "MetaInput", + "props": {} + } + }, + { + "property": "formatText", + "type": "string", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "内置渲染器" + } + }, + "widget": { + "component": "MetaInput", + "props": {} + } + }, + { + "property": "renderer", + "type": "object", + "defaultValue": "", + "label": { + "text": { + "zh_CN": "渲染函数" + } + }, + "widget": { + "component": "MetaCodeEditor", + "props": {} + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "列类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "index", + "text": "index" + }, + { + "label": "selection", + "text": "selection" + }, + { + "label": "radio", + "text": "radio" + }, + { + "label": "expand", + "text": "expand" + } + ] + } + }, + "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": {} + }, + "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 不配置筛选信息" + } + } + ] + } + ], + "widget": { + "component": "MetaArrayItem", + "props": { + "type": "object", + "textField": "title", + "language": "json", + "buttonText": "编辑列配置", + "title": "编辑列配置" + } + }, + "description": { + "zh_CN": "表格列的配置信息" + }, + "labelPosition": "left" + }, + { + "property": "fetch-data", + "label": { + "text": { + "zh_CN": "服务端数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "description": { + "zh_CN": "服务端数据查询方法" + } + }, + { + "property": "pager", + "label": { + "text": { + "zh_CN": "分页配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "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": "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-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) {}" + } + }, + "shortcuts": { + "properties": ["sortable", "columns"] + }, + "contentMenu": { + "actions": ["create symbol"] + }, + "onBeforeMount": "console.log('table on load'); this.data = source.data ;this.columns = source.columns" + } +} diff --git a/packages/settings/design/src/schemas/gridcolumn.json b/packages/settings/design/src/schemas/gridcolumn.json new file mode 100644 index 0000000..a0fabf6 --- /dev/null +++ b/packages/settings/design/src/schemas/gridcolumn.json @@ -0,0 +1,266 @@ +{ + "icon": "gridcolumn", + "name": { + "zh_CN": "表格列" + }, + "component": "tiny-grid-column", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础属性" + }, + "description": { + "zh_CN": "基础属性" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "field", + "label": { + "text": { + "zh_CN": "字段名" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "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": "设置列的宽度,可以是像素或者百分比或者'auto',设置为'auto'时,列宽会自动适应。" + }, + "labelPosition": "left" + }, + { + "property": "title", + "label": { + "text": { + "zh_CN": "标题" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "列标题(支持开启国际化),可以是函数 Function(h, params)" + } + }, + { + "property": "type", + "label": { + "text": { + "zh_CN": "列类型" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "index", + "text": "index" + }, + { + "label": "selection", + "text": "selection" + }, + { + "label": "radio", + "text": "radio" + }, + { + "label": "expand", + "text": "expand" + } + ] + } + }, + "description": { + "zh_CN": "设置内置列的类型,该属性的可选值为 index(序号)/ selection(复选框)/ radio(单选框)/ expand(展开行)" + }, + "labelPosition": "left" + }, + { + "property": "required", + "label": { + "text": { + "zh_CN": "必填" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否必填,如不设置,则会根据校验规则自动生成" + }, + "labelPosition": "left" + }, + { + "property": "editor", + "label": { + "text": { + "zh_CN": "编辑配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCodeEditor", + "props": {} + }, + "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": "renderer", + "label": { + "text": { + "zh_CN": "列渲染配置" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "单元格渲染配置项,其优先级高于列的 formatText 属性配置,也可以是函数 Function(h, params)" + }, + "labelPosition": "left" + }, + { + "property": "show-icon", + "label": { + "text": { + "zh_CN": "显示编辑ICON" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSwitch", + "props": {} + }, + "description": { + "zh_CN": "是否显示列头编辑图标,在编辑时有效" + }, + "labelPosition": "left" + }, + { + "property": "align", + "label": { + "text": { + "zh_CN": "对齐" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaSelect", + "props": { + "options": [ + { + "label": "left", + "text": "left" + }, + { + "label": "center", + "text": "center" + }, + { + "label": "right", + "text": "right" + } + ] + } + }, + "description": { + "zh_CN": "列对齐方式" + }, + "labelPosition": "left" + } + ] + } + ], + "events": {}, + "shortcuts": { + "properties": ["title", "field"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/index.js b/packages/settings/design/src/schemas/index.js new file mode 100644 index 0000000..acb5090 --- /dev/null +++ b/packages/settings/design/src/schemas/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 files = import.meta.globEager('./*.json') +const modules = {} + +for (const key in files) { + if (Object.prototype.hasOwnProperty.call(files, key)) { + modules[key.replace(/(\.\/|\.json)/g, '')] = files[key].default + } +} + +export default modules diff --git a/packages/settings/design/src/schemas/input.json b/packages/settings/design/src/schemas/input.json new file mode 100644 index 0000000..32c710d --- /dev/null +++ b/packages/settings/design/src/schemas/input.json @@ -0,0 +1,305 @@ +{ + "icon": "input", + "name": { + "zh_CN": "输入框" + }, + "component": "tiny-input", + "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": "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": "MetaNumeric", + "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": "" + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/pager.json b/packages/settings/design/src/schemas/pager.json new file mode 100644 index 0000000..da6e976 --- /dev/null +++ b/packages/settings/design/src/schemas/pager.json @@ -0,0 +1,205 @@ +{ + "icon": "pager", + "name": { + "zh_CN": "分页" + }, + "component": "tiny-pager", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "current-page", + "label": { + "text": { + "zh_CN": "当前页数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "当前页数,支持 .sync 修饰符" + }, + "labelPosition": "left" + }, + { + "property": "page-size", + "label": { + "text": { + "zh_CN": "每页条数" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaNumeric", + "props": {} + }, + "description": { + "zh_CN": "每页显示条目个数" + }, + "labelPosition": "left" + }, + { + "property": "page-sizes", + "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": { + "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": "" + } + }, + "shortcuts": { + "properties": ["current-page", "total"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/popeditor.json b/packages/settings/design/src/schemas/popeditor.json new file mode 100644 index 0000000..371f3f7 --- /dev/null +++ b/packages/settings/design/src/schemas/popeditor.json @@ -0,0 +1,312 @@ +{ + "icon": "popEditor", + "name": { + "zh_CN": "弹出编辑框" + }, + "component": "tiny-popeditor", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "text": { + "zh_CN": "显示更多" + } + }, + "content": [ + { + "property": "value", + "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": "" + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/popover.json b/packages/settings/design/src/schemas/popover.json new file mode 100644 index 0000000..93a8e94 --- /dev/null +++ b/packages/settings/design/src/schemas/popover.json @@ -0,0 +1,205 @@ +{ + "icon": "popover", + "name": { + "zh_CN": "提示框" + }, + "component": "tiny-popover", + "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": "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 箭头" + } + } + ] + } + ], + "slots": { + "default": {} + }, + "events": {}, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/radio.json b/packages/settings/design/src/schemas/radio.json new file mode 100644 index 0000000..644d27b --- /dev/null +++ b/packages/settings/design/src/schemas/radio.json @@ -0,0 +1,184 @@ +{ + "icon": "radio", + "name": { + "zh_CN": "单选框" + }, + "component": "tiny-radio", + "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": "value", + "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": "绑定值变化时触发的事件" + } + } + }, + "slots": { + "default": { + "componentName": "slot" + } + } + } +} diff --git a/packages/settings/design/src/schemas/search.json b/packages/settings/design/src/schemas/search.json new file mode 100644 index 0000000..7652c16 --- /dev/null +++ b/packages/settings/design/src/schemas/search.json @@ -0,0 +1,228 @@ +{ + "icon": "search", + "name": { + "zh_CN": "搜索" + }, + "component": "tiny-search", + "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" + } + ], + "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": "" + } + }, + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/select.json b/packages/settings/design/src/schemas/select.json new file mode 100644 index 0000000..0af4456 --- /dev/null +++ b/packages/settings/design/src/schemas/select.json @@ -0,0 +1,331 @@ +{ + "icon": "select", + "name": { + "zh_CN": "下拉框" + }, + "component": "tiny-select", + "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": "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": "options", + "label": { + "text": { + "zh_CN": "下拉数据" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaCollection", + "props": {} + }, + "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" + } + ], + "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": "" + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["multiple", "options"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/switch.json b/packages/settings/design/src/schemas/switch.json new file mode 100644 index 0000000..efd9d7b --- /dev/null +++ b/packages/settings/design/src/schemas/switch.json @@ -0,0 +1,148 @@ +{ + "icon": "switch", + "name": { + "zh_CN": "开关" + }, + "component": "tiny-switch", + "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": "" + } + }, + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/tabitem.json b/packages/settings/design/src/schemas/tabitem.json new file mode 100644 index 0000000..d96ba0c --- /dev/null +++ b/packages/settings/design/src/schemas/tabitem.json @@ -0,0 +1,77 @@ +{ + "icon": "tabitem", + "name": { + "zh_CN": "标签页项" + }, + "component": "tiny-tab-item", + "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": "标题" + } + } + ] + } + ], + "slots": { + "title": { + "componentName": "slot" + } + }, + "events": {}, + "shortcuts": { + "properties": ["name", "title"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/tabs.json b/packages/settings/design/src/schemas/tabs.json new file mode 100644 index 0000000..a3dbe1d --- /dev/null +++ b/packages/settings/design/src/schemas/tabs.json @@ -0,0 +1,272 @@ +{ + "icon": "tabs", + "name": { + "zh_CN": "标签页" + }, + "component": "tiny-tabs", + "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": "active-name", + "label": { + "text": { + "zh_CN": "默认值" + } + }, + "required": true, + "readOnly": false, + "disabled": false, + "cols": 12, + "widget": { + "component": "MetaInput", + "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": "绑定值,选中选项卡的 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" + } + ] + } + ], + "slots": { + "default": [ + { + "componentName": "tiny-tab-item", + "props": { + "title": "item1" + } + }, + { + "componentName": "tiny-tab-item", + "props": { + "title": "item2" + } + }, + { + "componentName": "tiny-tab-item", + "props": { + "title": "item3" + } + } + ] + }, + "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": "" + } + }, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/time-line.json b/packages/settings/design/src/schemas/time-line.json new file mode 100644 index 0000000..4a0263f --- /dev/null +++ b/packages/settings/design/src/schemas/time-line.json @@ -0,0 +1,134 @@ +{ + "icon": "timeline", + "name": { + "zh_CN": "时间线" + }, + "component": "tiny-time-line", + "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": "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, + "cols": 12, + "widget": { + "component": "MetaCollection", + "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": "" + } + }, + "shortcuts": { + "properties": ["disabled", "mini"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/tooltip.json b/packages/settings/design/src/schemas/tooltip.json new file mode 100644 index 0000000..1de0507 --- /dev/null +++ b/packages/settings/design/src/schemas/tooltip.json @@ -0,0 +1,127 @@ +{ + "icon": "tooltip", + "name": { + "zh_CN": "文字提示" + }, + "component": "tiny-tooltip", + "schema": { + "properties": [ + { + "label": { + "zh_CN": "基础信息" + }, + "description": { + "zh_CN": "基础信息" + }, + "collapse": { + "number": 6, + "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, + "cols": 12, + "widget": { + "component": "MetaInput", + "props": {} + }, + "description": { + "zh_CN": "显示的内容,也可以通过 slot#content 传入 DOM" + } + } + ] + } + ], + "slots": { + "default": {} + }, + "events": {}, + "shortcuts": { + "properties": ["value", "disabled"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/schemas/tree.json b/packages/settings/design/src/schemas/tree.json new file mode 100644 index 0000000..58cd9ff --- /dev/null +++ b/packages/settings/design/src/schemas/tree.json @@ -0,0 +1,275 @@ +{ + "icon": "tree", + "name": { + "zh_CN": "树" + }, + "component": "tiny-tree", + "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, + "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": "" + } + }, + "shortcuts": { + "properties": ["data", "show-checkbox"] + }, + "contentMenu": { + "actions": ["create symbol"] + } + } +} diff --git a/packages/settings/design/src/store/index.js b/packages/settings/design/src/store/index.js new file mode 100644 index 0000000..d4db0f1 --- /dev/null +++ b/packages/settings/design/src/store/index.js @@ -0,0 +1,276 @@ +/** + * 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 meta from '../properties' +import schemas from '../schemas' + +const genTreeData = (properties, keys = []) => { + const treeData = [] + + Object.entries(properties).forEach(([propertyName, property]) => { + if (property?.properties) { + const currentKeys = Array.from(keys) + currentKeys.push(propertyName) + + const node = { + label: propertyName, + key: currentKeys.join('.'), + properties: property.properties + } + + const children = genTreeData(property.properties, currentKeys) + + if (children.length > 0) { + node.children = children + } + + treeData.push(node) + } + }) + + return treeData +} + +const findParent = (element, match) => { + if (element.content?.includes(match)) { + return element + } else if (element.content?.length) { + let i + let result = null + for (i = 0; result === null && i < element.content.length; i++) { + result = findParent(element.content[i], match) + } + return result + } + return null +} + +const store = reactive({ + componentList: genTreeData(meta), + currentKeys: [], + currentComponent: '', + currentSchema: [], + childrenSchema: [], + currentProperties: {}, + currentProperty: { + widget: 'MetaInput', + device: [] + }, + currentGroup: null, + property: null, + lang: 'zh_CN', + metaData: '', + configGroupKey: 0, + currentSubConfig: null, + // 当前编辑的分组信息 + currentEditGroupInfo: null +}) + +export const META_COMPONENTS = { + MetaCodeEditor: 'MetaCodeEditor', + MetaArrayItem: 'MetaArrayItem', + MetaInput: 'MetaInput', + MetaSelect: 'MetaSelect', + MetaBindI18n: 'MetaBindI18n', + MetaCheckBox: 'MetaCheckBox', + MetaColor: 'MetaColor', + MetaDatePicker: 'MetaDatePicker', + MetaRadio: 'MetaRadio', + MetaRadioGroup: 'MetaRadioGroup', + MetaNumber: 'MetaNumber', + MetaJsSlot: 'MetaJsSlot', + MetaSwitch: 'MetaSwitch' +} + +export const META_TYPES_ENUM = { + string: 'string', + number: 'number', + boolean: 'boolean', + object: 'object', + array: 'array', + function: 'function' +} + +export const META_TYPES_OPTIONS = Object.entries(META_TYPES_ENUM).map(([key, value]) => ({ label: key, value })) + +// 数据类型对应的默认 meta component +export const META_DEFAULT_COMPONENT = { + [META_TYPES_ENUM.array]: META_COMPONENTS.MetaCodeEditor, + [META_TYPES_ENUM.string]: META_COMPONENTS.MetaInput, + [META_TYPES_ENUM.number]: META_COMPONENTS.MetaNumber, + [META_TYPES_ENUM.object]: META_COMPONENTS.MetaCodeEditor, + [META_TYPES_ENUM.boolean]: META_COMPONENTS.MetaSwitch, + [META_TYPES_ENUM.function]: META_COMPONENTS.MetaCodeEditor +} + +export const META_DEFAULT_VALUE = { + [META_TYPES_ENUM.array]: [], + [META_TYPES_ENUM.string]: '', + [META_TYPES_ENUM.number]: 0, + [META_TYPES_ENUM.object]: {}, + [META_TYPES_ENUM.boolean]: false, + [META_TYPES_ENUM.function]: 'function value() {}' +} + +export const DEFAULT_PROPERTY = { + property: 'customProperty', + type: META_TYPES_ENUM.string, + defaultValue: META_DEFAULT_VALUE[META_TYPES_ENUM.string], + label: { + text: { + zh_CN: '' + } + }, + cols: 12, + rules: [], + accessor: {}, // 区块属性访问器 + hidden: false, + required: true, + readOnly: false, + disabled: false, + widget: { + component: META_COMPONENTS[META_TYPES_ENUM.string], + props: {} + } +} + +export const DEFAULT_INIT_PROPERTIES = [ + { + label: { + zh_CN: '默认分组' + }, + content: [] + } +] + +export const removeGroup = (group) => { + if (!group) { + return + } + + const index = store.currentSchema.indexOf(group) + + if (index > -1) { + store.currentSchema.splice(index, 1) + store.currentEditGroupInfo = null + store.currentProperty = null + } +} + +export const addGroup = (index) => { + const length = store.currentSchema.length + + const group = { + name: String(length), + label: { + zh_CN: `分组${length + 1}` + }, + content: [], + description: { + zh_CN: '' + } + } + store.currentSchema.splice(index, 0, group) + + return group +} + +export const addProperty = (group, prop, index = 0) => { + const typeMap = { + string: 'MetaInput', + boolean: 'MetaSwitch', + number: 'MetaNumeric', + array: 'MetaInput', + object: 'MetaInput' + } + const meta = store?.currentProperties[prop] + const newProperty = { + property: prop, + label: { + text: { + zh_CN: prop + } + }, + required: true, + readOnly: false, + disabled: false, + cols: 12, + labelPosition: 'left', + type: 'string', + widget: { + component: typeMap[meta?.type || 'string'], + props: {} + } + } + group.content.splice(index, 0, newProperty) +} + +export const removeProperty = () => { + const group = store.currentGroup + const property = store.currentProperty + + if (!group || !property) { + return + } + + const index = group.content.indexOf(property) + + if (index > -1) { + group.content.splice(index, 1) + store.currentProperty = null + } +} + +export const setCurrentGroup = (group) => { + store.currentGroup = group +} + +/** + * 设置当前选中属性,同时将property 更新为当前属性的元数据 + * @param {*} property + */ +export const setCurrentProperty = (property) => { + if (property === store.currentProperty) { + return + } + + store.currentEditGroupInfo = null + store.property = store.currentProperties[property.property] + store.currentProperty = property + setCurrentGroup(findParent({ content: store.currentSchema }, property)) +} + +export const getSchemaByComponetName = (name) => { + schemas[name] = schemas[name] || { + component: 'text', + icon: 'IconText', + schema: { + properties: [], + events: {}, + shortcuts: {}, + contentMenu: {} + } + } + return schemas[name].schema.properties +} + +export const drawItems = () => { + const { items, properties } = store.property + store.currentProperties = items?.properties || properties + store.currentProperty.schema = store.currentProperty.schema || [] + store.currentSchema = store.currentProperty.schema +} + +window.store = store +window.schemas = schemas +export default store diff --git a/packages/settings/design/vite.config.js b/packages/settings/design/vite.config.js new file mode 100644 index 0000000..d67a1f6 --- /dev/null +++ b/packages/settings/design/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, './src/lib.js'), + name: 'setting-design', + fileName: () => 'index.js', + formats: ['es'] + }, + rollupOptions: { + output: { + banner: 'import "./style.css"' + }, + external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] + } + } +}) diff --git a/packages/settings/events/index.js b/packages/settings/events/index.js new file mode 100644 index 0000000..8055a13 --- /dev/null +++ b/packages/settings/events/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: 'SettingEvents', + name: 'event', + title: '高级', + icon: '', + align: 'left', + component +} diff --git a/packages/settings/events/package.json b/packages/settings/events/package.json new file mode 100644 index 0000000..ee28e02 --- /dev/null +++ b/packages/settings/events/package.json @@ -0,0 +1,42 @@ +{ + "name": "@opentiny/tiny-engine-setting-events", + "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/settings/events" + }, + "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", + "@opentiny/vue-icon": "~3.10.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "vite": "^4.3.7" + }, + "peerDependencies": { + "vue": "^3.4.15" + } +} diff --git a/packages/settings/events/src/Main.vue b/packages/settings/events/src/Main.vue new file mode 100644 index 0000000..4ed763b --- /dev/null +++ b/packages/settings/events/src/Main.vue @@ -0,0 +1,19 @@ + + + diff --git a/packages/settings/events/src/commonjs/events.js b/packages/settings/events/src/commonjs/events.js new file mode 100644 index 0000000..53572d4 --- /dev/null +++ b/packages/settings/events/src/commonjs/events.js @@ -0,0 +1,193 @@ +/** + * 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 commonEvents = { + onClick: { + label: { + zh_CN: '鼠标单击时触发' + }, + description: { + zh_CN: '鼠标单击时触发的回调函数' + }, + type: 'event', + functionInfo: { + params: [], + returns: {} + }, + defaultValue: '' + }, + onChange: { + label: { + zh_CN: '值被改变时触发' + }, + description: { + zh_CN: '当用户更改