diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000..1d060c23
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+babel.config.js
+src/uni_modules/mp-html/*
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000..18907349
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,42 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-14 16:06:21
+ * @LastEditTime: 2023-03-28 16:52:32
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\.eslintrc.js
+ * 记得注释
+ */
+module.exports = {
+ env: {
+ browser: true,
+ es2021: true
+ },
+ extends: ['eslint:recommended', 'plugin:vue/vue3-essential', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'],
+ overrides: [],
+ parser: 'vue-eslint-parser',
+ parserOptions: {
+ parser: '@typescript-eslint/parser',
+ ecmaVersion: 2020
+ },
+ plugins: ['vue', '@typescript-eslint'],
+ rules: {
+ 'linebreak-style': ['error', 'unix'],
+ quotes: ['error', 'single'],
+ semi: ['error', 'never'],
+ 'no-console': 'off',
+ 'no-debugger': 'off',
+ 'no-undef': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/no-inferrable-types': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-namespace': 'off',
+ 'no-inner-declarations': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ 'vue/multi-word-component-names': 'off'
+ }
+}
diff --git a/.git-cz.json b/.git-cz.json
new file mode 100644
index 00000000..66c81de0
--- /dev/null
+++ b/.git-cz.json
@@ -0,0 +1,70 @@
+{
+ "disableEmoji": false,
+ "list": ["test", "feat", "fix", "chore", "docs", "refactor", "style", "ci", "perf", "release", "revert", "build"],
+ "maxMessageLength": 64,
+ "minMessageLength": 3,
+ "questions": ["type", "scope", "subject", "body", "breaking", "issues", "lerna"],
+ "scopes": [],
+ "types": {
+ "chore": {
+ "description": "Chore | 构建/工程依赖/工具",
+ "emoji": "🚀",
+ "value": "chore"
+ },
+ "ci": {
+ "description": "Continuous Integration | CI 配置",
+ "emoji": "👷",
+ "value": "ci"
+ },
+ "docs": {
+ "description": "Documentation | 文档",
+ "emoji": "✏️ ",
+ "value": "docs"
+ },
+ "feat": {
+ "description": "Features | 新功能",
+ "emoji": "✨",
+ "value": "feat"
+ },
+ "fix": {
+ "description": "Bug Fixes | Bug 修复",
+ "emoji": "🐛",
+ "value": "fix"
+ },
+ "perf": {
+ "description": "Performance Improvements | 性能优化",
+ "emoji": "⚡",
+ "value": "perf"
+ },
+ "refactor": {
+ "description": "Code Refactoring | 代码重构",
+ "emoji": "♻️ ",
+ "value": "refactor"
+ },
+ "release": {
+ "description": "Create a release commit | 发版提交",
+ "emoji": "🏹",
+ "value": "release"
+ },
+ "style": {
+ "description": "Styles | 风格",
+ "emoji": "💄",
+ "value": "style"
+ },
+ "revert": {
+ "description": "Revert | 回退",
+ "emoji": "⏪",
+ "value": "revert"
+ },
+ "build": {
+ "description": "Build System | 打包构建",
+ "emoji": "📦",
+ "value": "build"
+ },
+ "test": {
+ "description": "Tests | 测试",
+ "emoji": "✅",
+ "value": "test"
+ }
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 5d947ca8..9d10334a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,18 +1,30 @@
-# Build and Release Folders
-bin-debug/
-bin-release/
-[Oo]bj/
-[Bb]in/
-
-# Other files and folders
-.settings/
-
-# Executables
-*.swf
-*.air
-*.ipa
-*.apk
-
-# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
-# should NOT be excluded as they contain compiler settings and other important
-# information for Eclipse / Flash Builder.
+.DS_Store
+node_modules/
+unpackage/
+dist/
+lib/
+website/
+/docs
+.temp
+.cache
+# src/uni_modules/fant-mini-plus/components/hd-*/API.md
+docs/components/hd-*
+docs/.vuepress/public/*.zip
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.project
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100644
index 00000000..5426a932
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx commitlint --edit $1
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000..9a8404ed
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx lint-staged --allow-empty $1
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..8c956eea
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,11 @@
+{
+ "printWidth": 150,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "bracketSpacing": true,
+ "requirePragma": false,
+ "proseWrap": "preserve",
+ "arrowParens": "always",
+ "htmlWhitespaceSensitivity": "ignore"
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..80cc6a3f
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,39 @@
+{
+ "workbench.settings.useSplitJSON": true,
+ // vscode默认启用了根据文件类型自动设置tabsize的选项
+ "editor.detectIndentation": false,
+ // 重新设定tabsize
+ "editor.tabSize": 2,
+ // #每次保存的时候自动格式化
+ // "editor.formatOnSave": true,
+ // #每次保存的时候将代码按eslint格式进行修复
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true
+ },
+ // 添加 vue 支持
+ "eslint.validate": [
+ "javascript",
+ "javascriptreact",
+ "typescript",
+ "vue"
+ ],
+ // #去掉代码结尾的分号
+ "prettier.semi": true,
+ // #使用单引号替代双引号
+ "prettier.singleQuote": true,
+ // #让函数(名)和后面的括号之间加个空格
+ "javascript.format.insertSpaceBeforeFunctionParenthesis": true,
+ // #这个按用户自身习惯选择
+ "vetur.format.defaultFormatter.html": "js-beautify-html",
+ // #让vue中的js按编辑器自带的ts格式进行格式化
+ "vetur.format.defaultFormatter.js": "vscode-typescript",
+ "vetur.format.options.tabSize": 2,
+ "vetur.format.defaultFormatterOptions": {
+ "js-beautify-html": {
+ "wrap_line_length": 150,
+ "wrap_attributes": true,
+ "end_with_newline": true
+ // #vue组件中html代码格式化样式
+ }
+ }
+}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..b69cd13b
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,112 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+### [0.0.12](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.11...v0.0.12) (2023-05-16)
+
+
+### Features
+
+* ✨ Transition组件在APP、微信、H5、支付宝、QQ平台使用wxs优化动画表现 ([14806e0](https://gitlab.hd123.com/vue/fant-mini-plus/commit/14806e0d77ef5e0bf0e93d723861ef306c8c8b3e))
+
+
+### Bug Fixes
+
+* 🐛 修复Popup组件从中心弹出时宽度异常的问题 ([4fd41d4](https://gitlab.hd123.com/vue/fant-mini-plus/commit/4fd41d4b42c37cce1c939c57e6001d5b3afeafaf))
+
+### [0.0.11](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.10...v0.0.11) (2023-05-15)
+
+
+### Features
+
+* ✨ Button组件自定义节点设置为虚拟节点去掉微信小程序自定义组件多出的最外层标签 ([a877049](https://gitlab.hd123.com/vue/fant-mini-plus/commit/a87704996224269a9077ee380be72268c936cf82))
+
+### [0.0.10](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.9...v0.0.10) (2023-05-15)
+
+
+### Features
+
+* ✨ 新增 Image 和 WaterMark 组件 ([90a097e](https://gitlab.hd123.com/vue/fant-mini-plus/commit/90a097e83a7f612f9b76425e07de5f602ff39d3c))
+* ✨ 新增WaterMark水印组件 ([37a3979](https://gitlab.hd123.com/vue/fant-mini-plus/commit/37a39798f555d55394d33830256398452d5e7d35))
+
+### [0.0.9](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.8...v0.0.9) (2023-04-25)
+
+
+### Features
+
+* ✨ Table组件优化支持data-source响应式更新 ([4f4b451](https://gitlab.hd123.com/vue/fant-mini-plus/commit/4f4b4510f395f02f554e45958c40a10cde07ff93))
+
+
+### Bug Fixes
+
+* 🐛 修复Calendar组件在某些版本uni-app的H5端第一次打开无数据渲染的问题 ([2d2dd33](https://gitlab.hd123.com/vue/fant-mini-plus/commit/2d2dd337c2e29b774c8dedfa01917758b1283917))
+
+### [0.0.8](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.7...v0.0.8) (2023-04-23)
+
+
+### Features
+
+* ✨ 新增WaterMark水印组件 ([3d9ba3f](https://gitlab.hd123.com/vue/fant-mini-plus/commit/3d9ba3f658c2ce8de8eaec2a5c8bf64963e4f871))
+* ✨ Table表格组件支持自定义列模板并增加row-height行高属性 ([23866e2](https://gitlab.hd123.com/vue/fant-mini-plus/commit/23866e2f6ef8ef9a080824f3ebe720dd9755dca6))
+
+### [0.0.7](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.6...v0.0.7) (2023-04-10)
+
+
+### Bug Fixes
+
+* 🐛 修复README中缺少演示小程序二维码的问题 ([298a21d](https://gitlab.hd123.com/vue/fant-mini-plus/commit/298a21d647bc82d705d4458aa4694ecff35f3f56))
+
+### [0.0.6](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.5...v0.0.6) (2023-04-07)
+
+
+### Bug Fixes
+
+* 🐛 修复DatePicker组件动画效果生硬的问题 ([1b821e0](https://gitlab.hd123.com/vue/fant-mini-plus/commit/1b821e04e56025e9cee82859e8278dfabfc90d23))
+
+### [0.0.5](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.4...v0.0.5) (2023-04-05)
+
+
+### Bug Fixes
+
+* 🐛 修复支付宝小程序Calendar组件不显示二级标题月份的问题 ([b7c541d](https://gitlab.hd123.com/vue/fant-mini-plus/commit/b7c541d4b6fbbe10c746f7a56dbc36c5eb1e0831))
+* 🐛 修复Area组件有默认值时打开未滚动到默认选项的问题 ([b3df205](https://gitlab.hd123.com/vue/fant-mini-plus/commit/b3df20514b7ef22ef7cb46907229dc9d981a374f))
+* 🐛 修复Transition组件动画抖动的问题 ([e5fa79b](https://gitlab.hd123.com/vue/fant-mini-plus/commit/e5fa79b8ee599cc14392abb89cbf988e07104e92))
+
+### [0.0.4](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.3...v0.0.4) (2023-04-04)
+
+
+### Features
+
+* ✨ Popup和Transition组件新增destory属性用于控制是否销毁插槽中的内容 ([bb26d31](https://gitlab.hd123.com/vue/fant-mini-plus/commit/bb26d318af7af1cffe6d3d9eca9018c1c1ce8f40))
+
+
+### Bug Fixes
+
+* 🐛 修复Modal组件弹出异常的问题 ([38b88b6](https://gitlab.hd123.com/vue/fant-mini-plus/commit/38b88b6f5fc8e596411ab43df59a1f41db430528))
+* 🐛 修复Popup连续多次弹出有概率无法再弹出的问题 ([23e51d2](https://gitlab.hd123.com/vue/fant-mini-plus/commit/23e51d2e04bf6931bd8c3cd5b4dcf7dce15f3850))
+
+### [0.0.3](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.2...v0.0.3) (2023-04-03)
+
+
+### Bug Fixes
+
+* 🐛 修复DatePicker组件在支付宝平台显示异常的问题 ([604277c](https://gitlab.hd123.com/vue/fant-mini-plus/commit/604277c16a284b05829353a93a6a213f42269dc4))
+
+### [0.0.2](https://gitlab.hd123.com/vue/fant-mini-plus/compare/v0.0.1...v0.0.2) (2023-04-03)
+
+
+### Bug Fixes
+
+* 🐛 改善transition动画延迟的问题 ([38b4d74](https://gitlab.hd123.com/vue/fant-mini-plus/commit/38b4d74bf27166d81f799661b058762caf6c145c))
+
+### 0.0.1 (2023-03-29)
+
+
+### Features
+
+* ✨ v0.0.1版本完成,移植所有fant-mini组件到vue3 ([e0a7e75](https://gitlab.hd123.com/vue/fant-mini-plus/commit/e0a7e75ffbcc89928be1868d1130cf0a74727882))
+
+
+### Bug Fixes
+
+* 🐛 修复动画组件在微信小程序上卡顿的问题 ([4c66ced](https://gitlab.hd123.com/vue/fant-mini-plus/commit/4c66cedcb67515a1c1301bba65a9c7e653885df7))
diff --git a/build/changelog.js b/build/changelog.js
new file mode 100644
index 00000000..3f2a5d50
--- /dev/null
+++ b/build/changelog.js
@@ -0,0 +1,22 @@
+/*
+ * @Author: weisheng
+ * @Date: 2022-02-24 15:37:04
+ * @LastEditTime: 2023-03-21 20:57:36
+ * @LastEditors: weisheng
+ * @Description: 讲生成的changelog移动到文档和组件中
+ * @FilePath: \fant-mini-plus-plus\build\changelog.js
+ * 记得注释
+ */
+const fs = require('fs')
+const path = require('path')
+const fromPath = path.resolve(__dirname, '../CHANGELOG.md')
+const toPath = path.resolve(__dirname, '../src/uni_modules/fant-mini-plus')
+const docPath = path.resolve(__dirname, '../fant-doc/docs/components')
+
+try {
+ const file = fs.readFileSync(fromPath, 'utf-8')
+ fs.writeFileSync(`${toPath}/changelog.md`, file)
+ fs.writeFileSync(`${docPath}/changelog.md`, file)
+} catch (error) {
+ console.log('CHANGELOG 获取失败')
+}
diff --git a/build/ci_keys/private.wxa3fab3dcde4667f0.key b/build/ci_keys/private.wxa3fab3dcde4667f0.key
new file mode 100644
index 00000000..293094a3
--- /dev/null
+++ b/build/ci_keys/private.wxa3fab3dcde4667f0.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAqtvdTeEPKGwStj1fVg6UWlMN5uxMv7TQDVs/6vlHSf307ObC
+6acjvH+Id2ci5OepN6NgKoGh3P3xwLAXQsOQsCvfnlwiRFaTZ/kD6BWTPSxLHmpf
+oS4LYEqUxTrRKnypOarGvqOIvkLNyzpw5En8Vnf1/K67eoFY0UFF87fn4763zlUW
+wOuzvVYu56i7FLdU2v0m3UdguJ6pZ3VGpTVfOpkA/nnTjRvPVjFK0BgQBLnHzXUx
+1kcA3ZRuCOEFGnyxgaIGwxmD2k5rcwFmvgXkOTaZeERdlRj3As8N7scGsSaIm2RJ
+y43lQg2l4gEY2F9HZniGC3H5Qiqa8YttVFGX2wIDAQABAoIBAFUk2eTceeRH7w84
+CFFnVJCqgOwJ57lFDsUJKxIahWcfEjYYTRuI+isOVuBB2ka+FzqtxNeJ4DKzrgy6
+8+yGbo0MYBSXj1AE4NJYapT2Y3iBoTGYCu3Ud0DWCcs7o06L7vzY2M/ZyOQfgFR9
+XBK3t/MTNtdj7/N9j9g/se9hP0LjUEqBBzsE27CGNIu2YzbXxQ5Se72WkM665v5K
+Ivkb7Pgh+duN0Bt4hR2BsMUWK/SGOoGoXpM1TgDwzNyRQEgjPOpX/Ipt0AO3jVhL
+xS3mFQD6NQckm6l8QTma8su7lFod+K3nvC24QTwbtAfxWdrioLfDyxcGZzUk82Gb
+XYXnkIECgYEA1tGQFk1H4bU+ARDrwolPQJI/WPdLs9sscheEeiu2nM6kdbAmwnzm
+sY2NtOynksrLMXeEyGCnXtKm7qEH+tUBVB/lsgEXw9Te1gHGZSBk/aPNcA5jXTOA
+8684zZBJ6JZVsGmAVbAjti6yUsMhSZk8MjGJnhNKlPqWoURl1q3TmcECgYEAy5zu
+wIkd7pmoWHczv9aoMRUUu8xtTNUTq1pfbCb6sc2v4Nocw3+Wtbf3xwe7gwd7QhBn
+clwMF/reNslFxyuQQRB1UIOP3igJ6r4sTCPAl8Qsj8xdmN9DMa1WVSLPjCEdj+6Z
+0tAnOiYPYCqxG+Hsvbmm5vGk3Kj+nW97lZ8TgJsCgYB95rC2AXEhneHLKimjCGrE
+g3JRKA7cSJZR/+qK19fdK1dECouM7Tsf0MC+yvyjketpAI14Cv3NG1TvAr30iqaO
+sWsj2nQdOEOp1bx7RHMsHLao+CXQWAE50PZPtEM85+8sx4iJsAQeIFwvGWIHCqI3
+IMVxOgk6K2vg9H9jRNmBgQKBgGTpzYbNLnGP5FicE6DToZ5Z5WHCSrWWsV3ut3Zh
+x0QSPkYBs9nMxYQgvoP9OBkTvyoZ+Ts7lZ7Y7gNXM+cnlyI4JvyVh9tCGtAmGsxN
+t+lACBno3saieKoJT814KEc6Lm2kgsZx9c8jB+HQpuC701qgxbCWOPBILZEXrLeW
+FNNbAoGAfxFWLGPXl6oB8qAXX/41v8RhhsziBAuOfoRy7CzkGm1L2BWjTXF/gR/0
+xVrNTm/sRIX82zLt/AwWZZja9TutEa3PIGo+E6VaTDIMMyT/vPFol1SWabcRaQgk
+KivcysDoP2DLtwYjVznD3WLmxNVN0boNjnZWto3hYzxAqlkVcg4=
+-----END RSA PRIVATE KEY-----
diff --git a/build/compiler.js b/build/compiler.js
new file mode 100644
index 00000000..228e1c10
--- /dev/null
+++ b/build/compiler.js
@@ -0,0 +1,46 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-21 20:58:19
+ * @LastEditTime: 2023-03-21 20:58:31
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus-plus\build\compiler.js
+ * 记得注释
+ */
+const fs = require('fs')
+const path = require('path')
+
+const src = path.resolve(__dirname, '../src/uni_modules/fant-mini-plus')
+const libDir = path.resolve(__dirname, '../lib')
+
+const copyFile = function (srcPath, tarPath, filter = []) {
+ fs.mkdir(tarPath, (err) => {})
+ fs.readdir(srcPath, function (err, files) {
+ if (err === null) {
+ files.forEach(function (filename) {
+ const filedir = path.join(srcPath, filename)
+ const filterFlag = filter.some((item) => {
+ return path.extname(filename).toLowerCase() === item && filename !== 'changelog.md'
+ })
+ if (!filterFlag) {
+ fs.stat(filedir, function (errs, stats) {
+ const isFile = stats.isFile()
+ if (isFile) {
+ // 复制文件
+ const destPath = path.join(tarPath, filename)
+ fs.copyFile(filedir, destPath, (err) => {})
+ } else {
+ // 创建文件夹
+ const tarFiledir = path.join(tarPath, filename)
+ copyFile(filedir, tarFiledir, filter) // 递归
+ }
+ })
+ }
+ })
+ } else {
+ if (err) console.error(err)
+ }
+ })
+}
+
+copyFile(src, libDir, ['.md'])
diff --git a/build/deploy.js b/build/deploy.js
new file mode 100644
index 00000000..faabfaf7
--- /dev/null
+++ b/build/deploy.js
@@ -0,0 +1,72 @@
+/*
+ * @Author: weisheng
+ * @Date: 2022-01-28 14:23:02
+ * @LastEditTime: 2023-03-21 20:59:16
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\build\deploy.js
+ * 记得注释
+ */
+
+const OSS = require('ali-oss')
+const fs = require('fs')
+
+const client = new OSS({
+ region: 'oss-cn-hongkong',
+ accessKeyId: 'LTAI5tJ6okg3xgdy4VfCjmzs',
+ accessKeySecret: '8Hk0Af1CQufErdjrnTI2o5BQmbhY41',
+ bucket: 'historysoa'
+})
+
+async function putOss(ossPath, filePath) {
+ try {
+ const result = await client.multipartUpload(ossPath, filePath)
+ console.log(`上传远程oss文件:${filePath}成功!`)
+ } catch (e) {
+ console.log(`上传异常:${e}`)
+ }
+}
+
+/**
+ * 上传前删除所有的文件
+ */
+async function deleteAll(object) {
+ const result = await client.list({
+ prefix: `${object}`
+ })
+ result.objects.forEach((item) => {
+ client.delete(item.name)
+ console.log(`删除远程oss文件:${item.name}成功!`)
+ })
+}
+
+/**
+ * 获取指定文件夹下的文件
+ * @param {string} local 文件夹路径
+ */
+async function addFile(local, objectName, srcName) {
+ const localFiles = fs.readdirSync(local)
+ localFiles.forEach(async (localFile) => {
+ // 拼接文件夹子项的路径
+ const filePath = `${local}/${localFile}`
+ // 获取子项文件信息
+ const stat = fs.statSync(filePath)
+ if (stat.isFile()) {
+ console.log(srcName, 'srcName')
+ const ossPath = filePath.split(`${srcName ? srcName : local}`).join(`${objectName}`)
+ // 上传到oss
+ await putOss(ossPath, filePath)
+ } else {
+ addFile(filePath, objectName, srcName ? srcName : local)
+ }
+ })
+}
+
+async function upload() {
+ await deleteAll('fant-mini-plus')
+ await addFile('fant-doc/dist', 'fant-mini-plus')
+ await deleteAll('fant-demo')
+ await addFile('dist/build/h5', 'fant-demo')
+}
+
+upload()
diff --git a/build/docs.js b/build/docs.js
new file mode 100644
index 00000000..38da5ff8
--- /dev/null
+++ b/build/docs.js
@@ -0,0 +1,54 @@
+/*
+ * @Author: weisheng
+ * @Date: 2022-02-11 15:19:37
+ * @LastEditTime: 2023-03-28 16:40:46
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\build\docs.js
+ * 记得注释
+ */
+const fs = require('fs')
+const path = require('path')
+
+/**
+ * 获取指定文件夹下的文件
+ * @param {string} local 文件夹路径
+ */
+function getFile(local) {
+ const localFiles = fs.readdirSync(local).filter((file) => {
+ return path.extname(file).toLowerCase() === '' || path.extname(file).toLowerCase() === '.md'
+ })
+ const docfile = {
+ introduction: '', // 简介
+ instructions: '', // 使用说明
+ api: ''
+ } // 文档文件内容
+ localFiles.forEach((localFile) => {
+ // 拼接文件夹子项的路径
+ const filePath = `${local}/${localFile}`
+ // 获取子项文件信息
+ const stat = fs.statSync(filePath)
+ if (stat.isFile()) {
+ if (localFile === 'API.md') {
+ // 读取markdown
+ const file = fs.readFileSync(filePath, 'utf-8')
+ docfile.api = file.replace(new RegExp(file.split('\n\n', 2)[0], 'g'), '').replace(new RegExp(file.split('\n\n', 2)[1], 'g'), '')
+ // fs.writeFileSync(`docs/components/${filePath.split('/').reverse()[1]}.md`, file)
+ } else if (localFile === 'README.md') {
+ // 读取markdown为数组
+ docfile.introduction = fs.readFileSync(filePath, 'utf-8')
+ } else if (localFile === 'INDEX.md') {
+ // 读取markdown为数组
+ docfile.instructions = fs.readFileSync(filePath, 'utf-8')
+ }
+ } else {
+ getFile(filePath)
+ }
+ })
+ if (docfile.api || docfile.instructions || docfile.introduction) {
+ fs.writeFileSync(`fant-doc/docs/components/${local.split('/').reverse()[0]}.md`, docfile.introduction + docfile.instructions + docfile.api)
+ }
+}
+
+// 合并文档
+getFile('src/uni_modules/fant-mini-plus/components')
diff --git a/build/generate.js b/build/generate.js
new file mode 100644
index 00000000..02a19248
--- /dev/null
+++ b/build/generate.js
@@ -0,0 +1,283 @@
+/*
+ * @Author: 庞昭昭
+ * @Date: 2022-02-21 10:23:46
+ * @LastEditTime: 2023-03-21 20:59:58
+ * @LastEditors: weisheng
+ * @Description: 创建文件夹并初始化
+ * @FilePath: \fant-mini-plus\build\generate.js
+ * 记得注释
+ */
+const fs = require('fs')
+const path = require('path')
+const inquirer = require('inquirer')
+const { execSync } = require('child_process')
+
+inquirer
+ .prompt([
+ {
+ type: 'list',
+ name: 'operation',
+ message: '请选择操作类型(默认值:✨ create)',
+ choices: ['✨ create 创建', '🐛 modify 编辑', '🚀 remove 移除'],
+ default: '✨ create 创建'
+ },
+ {
+ type: 'list',
+ name: 'type',
+ message: '请选择组件类型(默认值:✨ basic 基础组件)',
+ choices: ['✨ basic 基础组件', '🐛 form 表单组件', '🚀 action 反馈组件', '🔬 display 展示组件', '🧭 navigation 导航组件'],
+ default: '✨ basic 基础组件'
+ },
+ {
+ type: 'input',
+ name: 'oldname',
+ message: '请输入原组件名',
+ default: '',
+ when: function (answers) {
+ // 当操作不是创建
+ return answers['operation'] !== '✨ create 创建'
+ },
+ validate: function (val) {
+ if (!val || !val.trim()) {
+ return '请输入原组件名'
+ } else {
+ return true
+ }
+ }
+ },
+ {
+ type: 'input',
+ name: 'name',
+ message: '请输入组件名',
+ default: '',
+ validate: function (val) {
+ if (!val || !val.trim()) {
+ return '请输入组件名'
+ } else {
+ return true
+ }
+ }
+ },
+ {
+ type: 'list',
+ name: 'confirm',
+ message: '确认操作吗?',
+ choices: ['Y', 'N'],
+ default: 'Y'
+ }
+ ])
+ .then((answers) => {
+ if (!answers['confirm'] || answers['confirm'].toLowerCase() != 'y') {
+ console.log('🚨 操作取消')
+ return
+ }
+
+ let name = ''
+ if (answers['name']) {
+ name = answers['name']
+ }
+
+ let oldname = ''
+ if (answers['oldname']) {
+ oldname = answers['oldname']
+ }
+
+ let type = ''
+ if (answers['type']) {
+ type = answers['type'].split(' ')[1]
+ }
+
+ // 文件夹父目录
+ const parentPath = 'src/uni_modules/fant-mini-plus/components'
+ // 文件夹目录
+ const folderPath = `${parentPath}/${name}`
+
+ // 操作
+ switch (answers['operation']) {
+ case '✨ create 创建':
+ create(folderPath, type, name) // 新建
+ break
+ case '🐛 modify 编辑':
+ modify(folderPath, type, name, oldname) // 编辑名称
+ break
+ case '🚀 remove 移除':
+ remove(folderPath, type, name, oldname) // 删除
+ break
+ default:
+ break
+ }
+ })
+ .catch((error) => {
+ if (error.isTtyError) {
+ // Prompt couldn't be rendered in the current environment
+ } else {
+ // Something else went wrong
+ }
+ })
+
+// 创建
+function create(url, type, name) {
+ // 检查创建路径是否存在
+ if (!fs.existsSync(url)) {
+ // 不存在,创建文件夹
+ fs.mkdirSync(url)
+ // vue模板代码
+ const vueTemplate = `
+
+
+
+
+
+ `
+ // 创建vue组件
+ fs.writeFile(`${url}/${name}.vue`, vueTemplate, (err) => {
+ if (err) throw err
+ })
+ // 创建代码演示文档
+ fs.writeFile(`${url}/INDEX.md`, '## 代码演示', (err) => {
+ if (err) throw err
+ })
+ // 创建组件说明文档
+ fs.writeFile(`${url}/README.md`, '', (err) => {
+ if (err) throw err
+ })
+ // 更新doc文档
+ updateDoc('create', type, name)
+ } else {
+ console.error('warning:文件夹已存在', url)
+ }
+}
+
+// 编辑
+function modify(url, type, name, oldname) {
+ const oldName = oldname
+ const newName = name
+ // 判断给定的路径是否存在
+ if (fs.existsSync(url)) {
+ if (!newName) {
+ console.log('error:请传入新名称')
+ return
+ }
+ /**
+ * 返回文件和子目录的数组
+ */
+ files = fs.readdirSync(url)
+ files.forEach((file, index) => {
+ // 规范化生成文件路径。
+ const curPath = path.join(url, file)
+ /**
+ * fs.statSync同步读取文件夹文件,如果是文件夹,在重复触发函数
+ */
+ if (fs.statSync(curPath).isDirectory()) {
+ // recurse
+ modify(curPath.replace(/\\/g, '/'))
+ } else {
+ // 获取文件内容
+ const cur = fs.readFileSync(curPath, 'utf-8')
+ // 替换文件名称
+ fs.writeFileSync(curPath, cur.replace(new RegExp(oldName, 'g'), newName), (err) => {
+ if (err) throw err
+ })
+ if (file.includes(oldName)) {
+ // 修改文件名称
+ fs.renameSync(`${url}/${file}`, `${url}/${file.replace(new RegExp(oldName, 'g'), newName)}`)
+ }
+ }
+ })
+ /**
+ * 修改文件夹名称
+ */
+ const newUrlArr = url.split('/')
+ newUrlArr.splice(newUrlArr.length - 1, 1, newName)
+ const newUrl = newUrlArr.join('/')
+ fs.renameSync(url, newUrl, (err) => {
+ if (err) throw err
+ })
+ // 更新doc文档配置
+ updateDoc(type, name)
+ } else {
+ console.error('error:给定的路径不存在,请给出正确的路径', folderPath)
+ }
+}
+
+// 删除
+function remove(url, type, name, oldname) {
+ // 判断给定的路径是否存在
+ if (fs.existsSync(url)) {
+ /**
+ * 返回文件和子目录的数组
+ */
+ files = fs.readdirSync(url)
+ files.forEach((file, index) => {
+ // 规范化生成文件路径。
+ const curPath = path.join(url, file)
+ /**
+ * fs.statSync同步读取文件夹文件,如果是文件夹,在重复触发函数
+ */
+ if (fs.statSync(curPath).isDirectory()) {
+ // recurse
+ remove(curPath)
+ } else {
+ // 函数删除文件
+ fs.unlinkSync(curPath)
+ }
+ })
+ /**
+ * 清除文件夹
+ */
+ fs.rmdirSync(url)
+ // 更新doc文档配置
+ updateDoc(type, name, oldname)
+ } else {
+ console.error('error:给定的路径不存在,请给出正确的路径', folderPath)
+ }
+}
+
+// 更新doc文档新config
+function updateDoc(operation, type, name, oldname) {
+ // 更新config配置
+ // 获取组件list集合
+ const cmpList = require(`../fant-doc/docs/.vuepress/cmp/${type}.js`)
+
+ // 操作
+ if (operation == 'create') {
+ // 将新建文档插入到数组末尾
+ if (!cmpList.children.includes(`/components/${name}`)) {
+ // 检查是否已存在文档路径配置,避免重复加入
+ cmpList.children.push(`/components/${name}`)
+ // 重写cmpList文件
+ fs.writeFileSync(`fant-doc/docs/.vuepress/cmp/${type}.js`, `module.exports = ${JSON.stringify(cmpList)}`, (err) => {
+ if (err) throw err
+ })
+ }
+ } else if (operation == 'modify') {
+ const oldName = oldname
+ const newName = name
+ // 替换文档路径名称
+ cmpList.children.splice(cmpList.children.indexOf(`/components/${oldName}`), 1, `/components/${newName}`)
+ // 重写cmpList文件
+ fs.writeFileSync(`fant-doc/docs/.vuepress/cmp/${type}.js`, `module.exports = ${JSON.stringify(cmpList)}`, (err) => {
+ if (err) throw err
+ })
+ } else if (operation == 'remove') {
+ // 获取删除文档路径配置下标
+ const index = cmpList.children.indexOf(`/components/${name}`)
+ if (index > -1) {
+ // 检查是否已存在文档路径配置,存在时删除
+ cmpList.children.splice(index, 1)
+ // 重写cmpList文件
+ fs.writeFileSync(`fant-doc/docs/.vuepress/cmp/${type}.js`, `module.exports = ${JSON.stringify(cmpList)}`, (err) => {
+ if (err) throw err
+ })
+ }
+ } else {
+ console.log('无操作,未更新文档')
+ }
+}
diff --git a/build/release.js b/build/release.js
new file mode 100644
index 00000000..900fb5f3
--- /dev/null
+++ b/build/release.js
@@ -0,0 +1,87 @@
+/*
+ * @Author: weisheng
+ * @Date: 2022-11-01 17:12:57
+ * @LastEditTime: 2023-03-28 16:40:56
+ * @LastEditors: weisheng
+ * @Description: 组件发版问答
+ * @FilePath: \fant-mini-plus\build\release.js
+ * 记得注释
+ */
+const inquirer = require('inquirer')
+// Node 核心模块
+const { execSync } = require('child_process')
+const { writeFileSync, readFileSync } = require('fs')
+const path = require('path')
+const src = path.resolve(__dirname, '../src/uni_modules/fant-mini-plus')
+const oldVersion = require('../package.json').version
+inquirer
+ .prompt([
+ {
+ type: 'list',
+ name: 'version',
+ message: '请选择发版类型(默认值:✨ minor)',
+ choices: ['🐛 patch 小版本', '✨ minor 中版本', '🚀 major 大版本'],
+ default: '✨ minor 中版本'
+ },
+ {
+ type: 'list',
+ name: 'release',
+ message: '确认发布?',
+ choices: ['Y', 'N'],
+ default: 'Y'
+ }
+ ])
+ .then((answers) => {
+ if (!answers['release'] || answers['release'].toLowerCase() != 'y') {
+ console.log('🚨 操作取消')
+ return
+ }
+ // 项目版本更新
+ switch (answers['version']) {
+ case '🐛 patch 小版本':
+ execSync('yarn release-patch')
+ break
+ case '✨ minor 中版本':
+ execSync('yarn release-minor')
+ break
+ case '🚀 major 大版本':
+ execSync('yarn release-major')
+ break
+ default:
+ execSync('yarn release-minor')
+ break
+ }
+ // 生成日志
+ execSync('yarn changelog')
+ // 更新版本
+ const file = readFileSync(path.resolve(__dirname, '../package.json'))
+ const packageJson = JSON.parse(file.toString())
+ const version = packageJson.version
+ console.log(`√ bumping version in package.json from ${oldVersion} to ${version}`)
+ const package = require('../src/uni_modules/fant-mini-plus/package.json')
+ package.version = version
+ writeFileSync(path.resolve(src, 'package.json'), JSON.stringify(package))
+ // 生成声明文件
+ execSync('yarn build:types')
+ console.log('√ build:types complete')
+ // 生成制品
+ execSync('yarn compiler')
+ console.log('√ compiler complete')
+ execSync(`node build/updateDownloadVersion.js ${oldVersion} ${version}`)
+ execSync('yarn lint')
+ execSync('git add -A ')
+ execSync(`git commit -am "build: compile ${version}"`)
+ execSync(`git tag -a v${version} -am "chore(release): ${version}"`)
+ console.log('√ committing changes')
+ const branch = execSync('git branch --show-current').toString().replace(/\*/g, '').replace(/ /g, '')
+ console.log('🎉 版本发布成功')
+ const tip = 'Run `git push --follow-tags origin ' + branch + '` ' + 'to publish'
+ console.log(tip.replace(/\n/g, ''))
+ })
+ .catch((error) => {
+ if (error.isTtyError) {
+ // Prompt couldn't be rendered in the current environment
+ } else {
+ // Something else went wrong
+ }
+ })
diff --git a/build/test.js b/build/test.js
new file mode 100644
index 00000000..02ba0631
--- /dev/null
+++ b/build/test.js
@@ -0,0 +1,44 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-06-10 23:33:04
+ * @LastEditTime: 2023-06-10 23:42:45
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \wot-design-uni\build\test.js
+ * 记得注释
+ */
+const fs = require('fs')
+const path = require('path')
+// 文件夹父目录
+
+const src = path.resolve(__dirname, '../src/uni_modules/wot-design-uni/components')
+
+const make = (local) => {
+ fs.readdir(local, function (err, files) {
+ if (err === null) {
+ files.forEach(function (filename) {
+ const url = path.resolve(local, filename + '/' + filename + '.vue')
+ // 检查创建路径是否存在
+ if (!fs.existsSync(url)) {
+ // vue模板代码
+ const vueTemplate = `
+
+
+ `
+ // 创建vue组件
+ fs.writeFile(`${url}`, vueTemplate, (err) => {
+ if (err) throw err
+ })
+ } else {
+ console.error('warning:文件夹已存在', url)
+ }
+ })
+ } else {
+ if (err) console.error(err)
+ }
+ })
+}
+
+make(src)
diff --git a/build/updateDownloadVersion.js b/build/updateDownloadVersion.js
new file mode 100644
index 00000000..d1d49781
--- /dev/null
+++ b/build/updateDownloadVersion.js
@@ -0,0 +1,27 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-14 17:35:30
+ * @LastEditTime: 2023-03-28 16:41:20
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\build\updateDownloadVersion.js
+ * 记得注释
+ */
+const fs = require('fs')
+const path = require('path')
+const docPath = path.resolve(__dirname, '../fant-doc/docs/components')
+// 传入参数
+const args = process.argv.splice(2)
+const oldVersion = args[0]
+const newVersion = args[1]
+console.log(oldVersion, 'oldVersion')
+console.log(newVersion, 'newVersion')
+
+if (oldVersion && newVersion) {
+ let installation = fs.readFileSync(`${docPath}/installation.md`, 'utf-8')
+ installation = installation.replace(new RegExp(`fant-mini-plus@${oldVersion}`, 'g'), `fant-mini-plus@${newVersion}`)
+ installation = installation.replace(new RegExp('fant-mini-plus', 'g'), `fant-mini-plus@${newVersion}`)
+ fs.writeFileSync(`${docPath}/installation.md`, installation)
+} else {
+ console.log('组件库压缩包本本更新失败...')
+}
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 00000000..0367d83f
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,12 @@
+/*
+ * @Author: weisheng
+ * @Date: 2021-11-24 13:10:52
+ * @LastEditTime: 2023-03-25 18:12:52
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\commitlint.config.js
+ * 记得注释
+ */
+module.exports = {
+ extends: ['@commitlint/config-conventional']
+}
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..35ba70d7
--- /dev/null
+++ b/index.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..8df96ffd
--- /dev/null
+++ b/package.json
@@ -0,0 +1,145 @@
+{
+ "name": "wot-design-uni",
+ "version": "0.0.1",
+ "scripts": {
+ "dev:app": "uni -p app",
+ "dev:app-android": "uni -p app-android",
+ "dev:app-ios": "uni -p app-ios",
+ "dev:custom": "uni -p",
+ "dev:h5": "uni",
+ "dev:h5:ssr": "uni --ssr",
+ "dev:mp-alipay": "uni -p mp-alipay",
+ "dev:mp-baidu": "uni -p mp-baidu",
+ "dev:mp-kuaishou": "uni -p mp-kuaishou",
+ "dev:mp-lark": "uni -p mp-lark",
+ "dev:mp-qq": "uni -p mp-qq",
+ "dev:mp-toutiao": "uni -p mp-toutiao",
+ "dev:mp-weixin": "uni -p mp-weixin",
+ "dev:quickapp-webview": "uni -p quickapp-webview",
+ "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
+ "dev:quickapp-webview-union": "uni -p quickapp-webview-union",
+ "build:app": "uni build -p app",
+ "build:app-android": "uni build -p app-android",
+ "build:app-ios": "uni build -p app-ios",
+ "build:custom": "uni build -p",
+ "build:h5": "uni build",
+ "build:h5:ssr": "uni build --ssr",
+ "build:mp-alipay": "uni build -p mp-alipay",
+ "build:mp-baidu": "uni build -p mp-baidu",
+ "build:mp-kuaishou": "uni build -p mp-kuaishou",
+ "build:mp-lark": "uni build -p mp-lark",
+ "build:mp-qq": "uni build -p mp-qq",
+ "build:mp-toutiao": "uni build -p mp-toutiao",
+ "build:mp-weixin": "uni build -p mp-weixin",
+ "build:quickapp-webview": "uni build -p quickapp-webview",
+ "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
+ "build:quickapp-webview-union": "uni build -p quickapp-webview-union",
+ "type-check": "vue-tsc --noEmit",
+ "prepare": "husky install",
+ "lint": "eslint --fix --ext .js,.vue,.ts src",
+ "commit": "git-cz",
+ "release-major": "standard-version --release-as major",
+ "release-minor": "standard-version --release-as minor",
+ "release-patch": "standard-version --release-as patch",
+ "clean:lib": "rimraf lib",
+ "release-lib": "node build/release.js",
+ "build:types": "tsc -b ./tsconfig.types.json && node ./typesCopy.js",
+ "compiler": "npm run clean:lib && node build/compiler.js",
+ "publish-lib": "cd lib && npm publish",
+ "install:fant-doc": "cd fant-doc && yarn",
+ "docs:generate": "yarn compiler && node build/docs.js",
+ "docs:dev": "yarn docs:generate && cd fant-doc && yarn serve",
+ "docs:build": "yarn docs:generate && cd fant-doc && yarn build",
+ "deploy": "yarn docs:build && node build/deploy.js",
+ "component:generate": "node build/generate.js",
+ "changelog": "node build/changelog.js"
+ },
+ "dependencies": {
+ "@dcloudio/uni-app": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-app-plus": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-components": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-h5": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-alipay": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-baidu": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-jd": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-kuaishou": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-lark": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-qq": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-mp-weixin": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-quickapp-webview": "3.0.0-alpha-3080220230511001",
+ "vue": "^3.2.45",
+ "vue-i18n": "^9.1.9"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^17.4.4",
+ "@commitlint/config-conventional": "^17.4.4",
+ "@dcloudio/types": "^3.3.2",
+ "@dcloudio/uni-automator": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-cli-shared": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/uni-stacktracey": "3.0.0-alpha-3080220230511001",
+ "@dcloudio/vite-plugin-uni": "3.0.0-alpha-3080220230511001",
+ "@types/node": "^18.14.6",
+ "@typescript-eslint/eslint-plugin": "^5.55.0",
+ "@typescript-eslint/parser": "^5.55.0",
+ "@vant/area-data": "^1.4.1",
+ "@vue/tsconfig": "^0.1.3",
+ "eslint": "^8.36.0",
+ "eslint-config-prettier": "^8.7.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-vue": "^9.9.0",
+ "git-cz": "^4.9.0",
+ "husky": "^8.0.3",
+ "inquirer": "8.0.0",
+ "lint-staged": "^13.2.0",
+ "mini-types": "^0.1.7",
+ "miniprogram-api-typings": "^3.9.0",
+ "npm-run-all": "^4.1.5",
+ "prettier": "^2.8.4",
+ "query-string": "^8.1.0",
+ "rimraf": "^4.4.0",
+ "rollup-plugin-visualizer": "^5.9.0",
+ "sass": "^1.59.3",
+ "standard-version": "^9.5.0",
+ "typescript": "^4.9.4",
+ "uni-mini-router": "^0.0.12",
+ "uni-read-pages-vite": "^0.0.6",
+ "vite": "4.0.3",
+ "vitest": "^0.30.1",
+ "vue-eslint-parser": "^9.1.0",
+ "vue-tsc": "^1.0.24"
+ },
+ "config": {
+ "commitizen": {
+ "path": "git-cz"
+ }
+ },
+ "standard-version": {
+ "skip": {
+ "tag": true
+ }
+ },
+ "browserslist": [
+ "Android >= 4.4",
+ "ios >= 9"
+ ],
+ "lint-staged": {
+ "*.{js,ts,vue}": "eslint --fix --ext .js,.vue,.ts src"
+ },
+ "uni-app": {
+ "scripts": {
+ "mp-dingtalk": {
+ "title": "钉钉小程序",
+ "env": {
+ "UNI_PLATFORM": "mp-alipay"
+ },
+ "define": {
+ "MP-DINGTALK": true
+ }
+ }
+ }
+ },
+ "files": [
+ "lib"
+ ]
+}
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 00000000..7fe7b309
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/components/demo-block/demo-block.vue b/src/components/demo-block/demo-block.vue
new file mode 100644
index 00000000..b29a734f
--- /dev/null
+++ b/src/components/demo-block/demo-block.vue
@@ -0,0 +1,52 @@
+
+
+ {{ title }}
+
+
+
+
+
+
+
diff --git a/src/env.d.ts b/src/env.d.ts
new file mode 100644
index 00000000..da88959b
--- /dev/null
+++ b/src/env.d.ts
@@ -0,0 +1,17 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-21 21:06:55
+ * @LastEditTime: 2023-03-21 21:07:02
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\src\env.d.ts
+ * 记得注释
+ */
+///
+
+declare module '*.vue' {
+ import { DefineComponent } from 'vue'
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
+ const component: DefineComponent<{}, {}, any>
+ export default component
+}
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 00000000..76425a3e
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,20 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-09 19:23:03
+ * @LastEditTime: 2023-06-10 23:01:56
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \wot-design-uni\src\main.ts
+ * 记得注释
+ */
+import { createSSRApp } from 'vue'
+import App from './App.vue'
+import router from './router'
+export function createApp() {
+ const app = createSSRApp(App)
+ app.config.warnHandler = () => null
+ app.use(router)
+ return {
+ app
+ }
+}
diff --git a/src/manifest.json b/src/manifest.json
new file mode 100644
index 00000000..80df84c7
--- /dev/null
+++ b/src/manifest.json
@@ -0,0 +1,72 @@
+{
+ "name" : "",
+ "appid" : "",
+ "description" : "",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ /* 5+App特有相关 */
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 模块配置 */
+ "modules" : {},
+ /* 应用发布信息 */
+ "distribute" : {
+ /* android打包配置 */
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ /* ios打包配置 */
+ "ios" : {},
+ /* SDK配置 */
+ "sdkConfigs" : {}
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "wxa3fab3dcde4667f0",
+ "setting" : {
+ "urlCheck" : false
+ },
+ "usingComponents" : true
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics": {
+ "enable": false
+ },
+ "vueVersion" : "3"
+}
diff --git a/src/model/KV.ts b/src/model/KV.ts
new file mode 100644
index 00000000..48f79882
--- /dev/null
+++ b/src/model/KV.ts
@@ -0,0 +1,13 @@
+/*
+ * @Author: weisheng
+ * @Date: 2021-12-28 15:57:08
+ * @LastEditTime: 2021-12-28 15:58:09
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini\src\model\KV.ts
+ * 记得注释
+ */
+export default class KV {
+ label: string = '' // 操作标题
+ value!: T // 操作项数组
+}
diff --git a/src/model/OperationOption.ts b/src/model/OperationOption.ts
new file mode 100644
index 00000000..3fefe374
--- /dev/null
+++ b/src/model/OperationOption.ts
@@ -0,0 +1,16 @@
+import KV from './KV'
+
+/*
+ * @Author: weisheng
+ * @Date: 2021-12-28 15:13:43
+ * @LastEditTime: 2023-03-21 22:34:12
+ * @LastEditors: weisheng
+ * @Description: 模板操作选项
+ * @FilePath: \fant-mini-plus\src\model\OperationOption.ts
+ * 记得注释
+ */
+export default class OperationOption {
+ label: string = '' // 操作的标题(用于展示)
+ name: string | string[] = '' // 操作真实值用于代码传参
+ value: KV[] = [] // 操作项数组
+}
diff --git a/src/pages.json b/src/pages.json
new file mode 100644
index 00000000..db22cebc
--- /dev/null
+++ b/src/pages.json
@@ -0,0 +1,47 @@
+{
+ "pages": [
+ {
+ "path": "pages/button/Button",
+ "name": "button",
+ "style": {
+ "mp-alipay": {
+ "allowsBounceVertical": "NO"
+ },
+
+ "navigationBarTitleText": "Button 按钮"
+ }
+ },
+ {
+ "path": "pages/icon/Icon",
+ "name": "icon",
+ "style": {
+ "mp-alipay": {
+ "allowsBounceVertical": "NO"
+ },
+
+ "navigationBarTitleText": "Icon 图标"
+ }
+ },
+ {
+ "path": "pages/badge/Badge",
+ "name": "badge",
+ "style": {
+ "mp-alipay": {
+ "allowsBounceVertical": "NO"
+ },
+ "navigationBarTitleText": "Badge 徽标"
+ }
+ }
+ ],
+ "tabBar": {
+ "color": "#7a7e83",
+ "selectedColor": "#1C64FD",
+ "backgroundColor": "#ffffff",
+ "list": [ ]
+ },
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarBackgroundColor": "#FFF",
+ "backgroundColor": "#F8F8F8"
+ }
+ }
\ No newline at end of file
diff --git a/src/pages/badge/Badge.vue b/src/pages/badge/Badge.vue
new file mode 100644
index 00000000..d1d22a79
--- /dev/null
+++ b/src/pages/badge/Badge.vue
@@ -0,0 +1,54 @@
+
+
+
+ 评论
+
+
+ 回复
+
+
+ 评论
+
+
+ 回复
+
+
+ 评论
+
+
+ 回复
+
+
+
+
+
+ 评论
+
+
+ 回复
+
+
+
+
+
+ 评论
+
+
+ 回复
+
+
+
+
+ 数据查询
+
+ 回复
+
+
+
+
+
diff --git a/src/pages/badge/index.js b/src/pages/badge/index.js
new file mode 100644
index 00000000..9555c825
--- /dev/null
+++ b/src/pages/badge/index.js
@@ -0,0 +1 @@
+Page({})
\ No newline at end of file
diff --git a/src/pages/badge/index.json b/src/pages/badge/index.json
new file mode 100644
index 00000000..49185977
--- /dev/null
+++ b/src/pages/badge/index.json
@@ -0,0 +1,8 @@
+{
+ "navigationBarTitleText": "Badge 角标",
+ "usingComponents": {
+ "demo-block": "../../components/demo-block/index",
+ "wd-badge": "../../wot-design/badge/index",
+ "wd-button": "../../wot-design/button/index"
+ }
+}
diff --git a/src/pages/badge/index.jxml b/src/pages/badge/index.jxml
new file mode 100644
index 00000000..05e2a37e
--- /dev/null
+++ b/src/pages/badge/index.jxml
@@ -0,0 +1,132 @@
+
+
+ 评论
+
+
+ 回复
+
+
+ 评论
+
+
+ 回复
+
+
+ 评论
+
+
+ 回复
+
+
+
+
+
+ 评论
+
+
+ 回复
+
+
+
+
+
+ 评论
+
+
+ 回复
+
+
+
+
+ 数据查询
+
+ 回复
+
+
diff --git a/src/pages/badge/index.jxss b/src/pages/badge/index.jxss
new file mode 100644
index 00000000..42b325df
--- /dev/null
+++ b/src/pages/badge/index.jxss
@@ -0,0 +1,4 @@
+.badge {
+ margin: 0 30px 20px 0;
+ display: inline-block;
+}
diff --git a/src/pages/button/Button.vue b/src/pages/button/Button.vue
new file mode 100644
index 00000000..65000cd5
--- /dev/null
+++ b/src/pages/button/Button.vue
@@ -0,0 +1,118 @@
+
+
+
+ 主要按钮
+ 成功按钮
+ 信息按钮
+ 警告按钮
+ 危险按钮
+
+
+ 主要按钮
+ 成功按钮
+ 信息按钮
+ 警告按钮
+ 危险按钮
+
+
+ 主要按钮
+ 成功按钮
+ 信息按钮
+ 警告按钮
+ 危险按钮
+
+
+ 主要按钮
+ 成功按钮
+ 信息按钮
+ 警告按钮
+ 危险按钮
+
+
+ 小型按钮
+ 普通按钮
+ 大型按钮
+
+
+ 加载中
+ 加载中
+ 加载中
+ 加载中
+ 加载中
+
+
+ 按钮
+ 按钮
+
+
+
+
+
+
+ 下载
+ 设置
+
+
+ 主要按钮
+ 成功按钮
+ 信息按钮
+ 警告按钮
+ 危险按钮
+
+
+ 主要按钮
+ 主要按钮
+ 主要按钮
+ 信息按钮
+ 信息按钮
+
+
+
+ 主操作
+ 主操作
+
+
+ 主操作
+ 主操作
+
+
+ 次操作
+ 次操作
+
+
+ 次操作
+ 次操作
+
+
+ 幽灵按钮
+ 幽灵按钮
+
+
+ 幽灵按钮
+ 幽灵按钮
+
+
+ 次操作
+ 次操作
+
+
+ 次操作
+ 次操作
+
+
+
+
+
+
diff --git a/src/pages/icon/Icon.vue b/src/pages/icon/Icon.vue
new file mode 100644
index 00000000..4d75a222
--- /dev/null
+++ b/src/pages/icon/Icon.vue
@@ -0,0 +1,93 @@
+
+
+
+
+ {{ icon }}
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 00000000..89d8ab58
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,27 @@
+/*
+ * @Author: weisheng
+ * @Date: 2021-10-13 11:15:00
+ * @LastEditTime: 2023-04-06 20:10:46
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\src\router\index.ts
+ * 记得注释
+ */
+import { createRouter } from 'uni-mini-router'
+
+const router = createRouter({
+ routes: [...ROUTES]
+})
+router.beforeEach((to, from, next) => {
+ console.log(to, 'to')
+ console.log(from, 'from')
+ console.log('进入路由之前调用')
+ next()
+})
+router.afterEach((to, from) => {
+ console.log(to, 'to')
+ console.log(from, 'from')
+ console.log('进入路由之后调用')
+})
+
+export default router
diff --git a/src/shime-uni.d.ts b/src/shime-uni.d.ts
new file mode 100644
index 00000000..8f2d51bf
--- /dev/null
+++ b/src/shime-uni.d.ts
@@ -0,0 +1,15 @@
+/* eslint-disable @typescript-eslint/no-empty-interface */
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-09 19:23:03
+ * @LastEditTime: 2023-03-21 21:30:30
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\src\shime-uni.d.ts
+ * 记得注释
+ */
+export {}
+declare module 'vue' {
+ type Hooks = App.AppInstance & Page.PageInstance
+ interface ComponentCustomOptions extends Hooks {}
+}
diff --git a/src/types.d.ts b/src/types.d.ts
new file mode 100644
index 00000000..934d2395
--- /dev/null
+++ b/src/types.d.ts
@@ -0,0 +1,11 @@
+/*
+ * @Author: weisheng
+ * @Date: 2023-03-09 21:36:22
+ * @LastEditTime: 2023-03-21 21:32:12
+ * @LastEditors: weisheng
+ * @Description:
+ * @FilePath: \fant-mini-plus\src\types.d.ts
+ * 记得注释
+ */
+//type.d.ts
+declare const ROUTES: []
diff --git a/src/uni.scss b/src/uni.scss
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/src/uni.scss
@@ -0,0 +1 @@
+
diff --git a/src/uni_modules/wot-design-uni/changelog.md b/src/uni_modules/wot-design-uni/changelog.md
new file mode 100644
index 00000000..e69de29b
diff --git a/src/uni_modules/wot-design-uni/components/common/abstracts/_config.scss b/src/uni_modules/wot-design-uni/components/common/abstracts/_config.scss
new file mode 100644
index 00000000..fe65cb44
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/abstracts/_config.scss
@@ -0,0 +1,7 @@
+/**
+ * SCSS 配置项:命名空间以及BEM
+ */
+$namespace: 'wd';
+$elementSeparator: '__';
+$modifierSeparator: '--';
+$state-prefix: 'is-';
\ No newline at end of file
diff --git a/src/uni_modules/wot-design-uni/components/common/abstracts/_function.scss b/src/uni_modules/wot-design-uni/components/common/abstracts/_function.scss
new file mode 100644
index 00000000..c1fd39e6
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/abstracts/_function.scss
@@ -0,0 +1,80 @@
+/**
+ * 辅助函数
+ */
+@import 'config';
+$default-theme: #4d80f0 !default; // 正常色
+
+/* 转换成字符串 */
+@function selectorToString($selector) {
+ $selector: inspect($selector);
+ $selector: str-slice($selector, 2, -2);
+
+ @return $selector;
+}
+
+/* 判断是否存在 Modifier */
+@function containsModifier($selector) {
+ $selector: selectorToString($selector);
+
+ @if str-index($selector, $modifierSeparator) {
+ @return true;
+ } @else {
+ @return false;
+ }
+}
+
+/* 判断是否存在伪类 */
+@function containsPseudo($selector) {
+ $selector: selectorToString($selector);
+
+ @if str-index($selector, ':') {
+ @return true;
+ } @else {
+ @return false;
+ }
+}
+
+
+/**
+ * 主题色切换
+ * @params $theme-color 主题色
+ * @params $type 变暗’dark‘ 变亮 'light'
+ * @params $mix-color 自己设置的混色
+ */
+ @function themeColor($theme-color, $type: "", $mix-color: "") {
+ @if $default-theme != #4d80f0 {
+ @if $type == "dark" {
+ @return darken($theme-color, 10%);
+ } @else if $type == "light" {
+ @return lighten($theme-color, 10%);
+ } @else {
+ @return $theme-color;
+ }
+ } @else {
+ @return $mix-color;
+ }
+}
+
+/**
+ * 颜色结果切换, 如果开启线性渐变色 使用渐变色,如果没有开启,那么使用主题色
+ * @params $open-linear 是否开启线性渐变色
+ * @params $deg 渐变色角度
+ * @params $theme-color 当前配色
+ * @params [Array] $set 主题色明暗设置,与 $color-list 数量对应
+ * @params [Array] $color-list 渐变色顺序, $color-list 和 $per-list 数量相同
+ * @params [Array] $per-list 渐变色比例
+ */
+@function resultColor($open-linear, $deg, $theme-color, $set, $color-list, $per-list) {
+ // 开启渐变
+ @if $open-linear {
+ $len: length($color-list);
+ $arg: $deg;
+ @for $i from 1 through $len {
+ $arg: $arg + "," + themeColor($theme-color, nth($set, $i), nth($color-list, $i)) + " " + nth($per-list, $i);
+ }
+ @return linear-gradient(unquote($arg));
+ } @else {
+ // 不开启渐变 直接使用色值
+ @return $theme-color;
+ }
+}
diff --git a/src/uni_modules/wot-design-uni/components/common/abstracts/_mixin.scss b/src/uni_modules/wot-design-uni/components/common/abstracts/_mixin.scss
new file mode 100644
index 00000000..26f82707
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/abstracts/_mixin.scss
@@ -0,0 +1,265 @@
+/**
+ * 混合宏
+ */
+@import "config";
+@import "function";
+
+/**
+ * BEM,定义块(b)
+ */
+@mixin b($block) {
+ $B: $namespace + "-" + $block !global;
+
+ .#{$B} {
+ @content;
+ }
+}
+/* 定义元素(e),对于伪类,会自动将 e 嵌套在 伪类 底下 */
+@mixin e($element...) {
+ $selector: &;
+ $selectors: "";
+
+ @if containsPseudo($selector) {
+ @each $item in $element {
+ $selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
+ }
+ @at-root {
+ #{$selector} {
+ #{$selectors} {
+ @content;
+ }
+ }
+ }
+ } @else {
+ @each $item in $element {
+ $selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
+ }
+ @at-root {
+ #{$selectors} {
+ @content;
+ }
+ }
+ }
+}
+/* 定义状态(m) */
+@mixin m($modifier...) {
+ $selectors: "";
+ @each $item in $modifier {
+ $selectors: #{$selectors + & + $modifierSeparator + $item + ","};
+ }
+
+ @at-root {
+ #{$selectors} {
+ @content;
+ }
+ }
+}
+/* 对于需要需要嵌套在 m 底下的 e,调用这个混合宏,一般在切换整个组件的状态,如切换颜色的时候 */
+@mixin me($element...) {
+ $selector: &;
+ $selectors: "";
+
+ @if containsModifier($selector) {
+ @each $item in $element {
+ $selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
+ }
+ @at-root {
+ #{$selector} {
+ #{$selectors} {
+ @content;
+ }
+ }
+ }
+ } @else {
+ @each $item in $element {
+ $selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
+ }
+ @at-root {
+ #{$selectors} {
+ @content;
+ }
+ }
+ }
+}
+
+/* 状态,生成 is-$state 类名 */
+@mixin when($state) {
+ @at-root {
+ &.#{$state-prefix + $state} {
+ @content;
+ }
+ }
+}
+
+/**
+ * 常用混合宏
+ */
+
+/* 单行超出隐藏 */
+@mixin lineEllipsis {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* 多行超出隐藏 */
+@mixin multiEllipsis($lineNumber: 3) {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: $lineNumber;
+ overflow: hidden;
+}
+
+/* 清除浮动 */
+@mixin clearFloat {
+ &::after {
+ display: block;
+ content: "";
+ height: 0;
+ clear: both;
+ overflow: hidden;
+ visibility: hidden;
+ }
+}
+
+/* 0.5px 边框 */
+@mixin halfPixelBorder($direction: "bottom", $left: 0, $color: $-color-border-light) {
+ &::after {
+ position: absolute;
+ display: block;
+ content: "";
+ @if ($left == 0) {
+ width: 100%;
+ } @else {
+ width: calc(100% - #{$left});
+ }
+ height: 1px;
+ left: $left;
+ @if ($direction == "bottom") {
+ bottom: 0;
+ } @else {
+ top: 0;
+ }
+ transform: scaleY(0.5);
+ background: $color;
+ }
+}
+@mixin buttonClear {
+ outline: none;
+ -webkit-appearance: none;
+ -webkit-tap-highlight-color: transparent;
+ background: transparent;
+}
+
+/**
+ * 三角形实现尖角样式,适用于背景透明情况
+ * @param $size 三角形高,底边为 $size * 2
+ * @param $bg 三角形背景颜色
+ */
+@mixin triangleArrow($size, $bg) {
+ @include e(arrow) {
+ position: absolute;
+ width: 0;
+ height: 0;
+ }
+
+ @include e(arrow-down) {
+ border-left: $size solid transparent;
+ border-right: $size solid transparent;
+ border-top: $size solid $bg;
+ transform: translateX(-50%);
+ bottom: -$size;
+ }
+ @include e(arrow-up) {
+ border-left: $size solid transparent;
+ border-right: $size solid transparent;
+ border-bottom: $size solid $bg;
+ transform: translateX(-50%);
+ top: -$size;
+ }
+ @include e(arrow-left) {
+ border-top: $size solid transparent;
+ border-bottom: $size solid transparent;
+ border-right: $size solid $bg;
+ transform: translateY(-50%);
+ left: -$size;
+ }
+ @include e(arrow-right) {
+ border-top: $size solid transparent;
+ border-bottom: $size solid transparent;
+ border-left: $size solid $bg;
+ transform: translateY(-50%);
+ right: -$size;
+ }
+}
+
+/**
+ * 正方形实现尖角样式,适用于背景不透明情况
+ * @param $size 正方形边长
+ * @param $bg 正方形背景颜色
+ * @param $z-index z-index属性值,不得大于外部包裹器
+ * @param $box-shadow 阴影
+*/
+@mixin squareArrow($size, $bg, $z-index, $box-shadow) {
+ @include e(arrow) {
+ position: absolute;
+ width: $size;
+ height: $size;
+ z-index: $z-index;
+ }
+
+ @include e(arrow-down) {
+ transform: translateX(-50%);
+ bottom: 0;
+
+ &:after {
+ content: "";
+ width: $size;
+ height: $size;
+ background-color: $bg;
+ position: absolute;
+ bottom: -$size/2;
+ transform: rotateZ(45deg);
+ box-shadow: $box-shadow;
+ }
+ }
+ @include e(arrow-up) {
+ transform: translateX(-50%);
+ &:after {
+ content: "";
+ width: $size;
+ height: $size;
+ background-color: $bg;
+ position: absolute;
+ top: -$size/2;
+ transform: rotateZ(45deg);
+ box-shadow: $box-shadow;
+ }
+ }
+ @include e(arrow-left) {
+ transform: translateY(-50%);
+ &:after {
+ content: "";
+ width: $size;
+ height: $size;
+ background-color: $bg;
+ position: absolute;
+ left: -$size/2;
+ transform: rotateZ(45deg);
+ box-shadow: $box-shadow;
+ }
+ }
+ @include e(arrow-right) {
+ transform: translateY(-50%);
+ &:after {
+ content: "";
+ width: $size;
+ height: $size;
+ background-color: $bg;
+ position: absolute;
+ right: -$size/2;
+ transform: rotateZ(45deg);
+ box-shadow: $box-shadow;
+ }
+ }
+}
diff --git a/src/uni_modules/wot-design-uni/components/common/abstracts/variable.scss b/src/uni_modules/wot-design-uni/components/common/abstracts/variable.scss
new file mode 100644
index 00000000..8a7cadee
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/abstracts/variable.scss
@@ -0,0 +1,829 @@
+@import './function';
+$open-linear: true !default;
+
+/**
+ * UI规范基础变量
+ */
+/*----------------------------------------- Theme color. start ----------------------------------------*/
+/* 主题颜色 */
+$-color-theme: $default-theme !default; // 品牌色
+$-color-white: #ffffff !default; // 用于mix的白色
+$-color-black: #000000 !default; // 用于mix的黑色
+
+/* 辅助色 */
+$-color-success: #34d19d !default; // 成功色
+$-color-warning: #f0883a !default; // 警告色
+$-color-danger: #fa4350 !default; // 危险出错色
+$-color-purple: #8268de !default; // 紫色
+$-color-yellow: #f0cd1d !default; // 黄色
+$-color-blue: #2bb3ed !default; // 蓝色
+
+// TODO 全部替换后如果不用此处就删除
+$-color-info: #909399 !default;
+$-color-theme-light: mix($-color-white, $-color-theme, 42%) !default; // 弱化色
+$-color-theme-emph: mix($-color-black, $-color-theme, 18%) !default; // 强调色
+
+/* 文字颜色(默认浅色背景下 */
+$-color-title: $-color-black !default; // 模块标题/重要正文 000
+$-color-content: mix($-color-black, $-color-white, 85%) !default; // 普通正文 262626
+$-color-secondary: mix($-color-black, $-color-white, 65%) !default; // 次要信息,注释/补充/正文 595959
+$-color-aid: mix($-color-black, $-color-white, 45%) !default; // 辅助文字字号,弱化信息,引导性/不可点文字 8c8c8c
+$-color-tip: mix($-color-black, $-color-white, 25%) !default; // 失效、默认提示文字 bfbfbf
+$-color-border: mix($-color-black, $-color-white, 15%) !default; // 控件边框线 d9d9d9
+$-color-border-light: mix($-color-black, $-color-white, 9%) !default; // 分割线颜色 e8e8e8
+$-color-bg: mix($-color-black, $-color-white, 4%) !default; // 背景色、禁用填充色 f5f5f5
+$-color-table-bg: mix($-color-black, $-color-white, 2%) !default; // 表头填充 fafafa
+
+/* 文字颜色-深背景 */
+$-color-title-indark: $-color-white !default; // 模块标题/重要正文 fff
+$-color-text-indark: mix($-color-white, $-color-black, 85%) !default; // 普通正文 d9d9d9
+$-color-secondary-indark: mix($-color-white, $-color-black, 65%) !default; // 次要信息,注释/补充/正文 a6a6a6
+$-color-aid-indark: mix($-color-white, $-color-black, 45%) !default; // 次级按钮边框线 737373
+$-color-tip-indark: mix($-color-white, $-color-black, 25%) !default; // 失效、默认提示文字 404040
+$-color-border-indark: mix($-color-white, $-color-black, 15%) !default; // 控件边框线 262626
+$-color-border-light-indark: mix($-color-white, $-color-black, 9%) !default; // 分割线颜色 171717
+$-color-bg-indark: mix($-color-white, $-color-black, 4%) !default; // 背景色、禁用填充色 0a0a0a
+$-color-table-bg-indark: mix($-color-white, $-color-black, 2%) !default; // 表头填充 fafafa
+
+// TODO 待替换
+/* 透明度 */
+$-color-inlight-title-mask: mix($-color-black, $-color-white, 100%) !default; // 模块标题/重要正文 000
+/* 图形颜色 */
+$-color-icon: mix($-color-black, $-color-white, 15%) !default; // icon颜色
+$-color-icon-active: #eee !default; // icon颜色hover
+$-color-icon-disabled: #a7a7a7 !default; // icon颜色disabled
+/* modal */
+$-modal-bg: rgba($-color-black, 0.65) !default;
+
+/*----------------------------------------- Theme color. end -------------------------------------------*/
+
+/*-------------------------------- Theme color application size. start --------------------------------*/
+
+/* 文字字号 */
+$-fs-big: 24px !default; // 大型标题
+$-fs-important: 19px !default; // 重要数据
+$-fs-title: 16px !default; // 标题字号/重要正文字号
+$-fs-content: 14px !default; // 普通正文
+$-fs-secondary: 12px !default; // 次要信息,注释/补充/正文
+$-fs-aid: 10px !default; // 辅助文字字号,弱化信息,引导性/不可点文字
+
+/* 文字字重 */
+$-fw-medium: 500 !default; // PingFangSC-Medium
+$-fw-semibold: 600 !default; // PingFangSC-Semibold
+
+/* 尺寸 */
+$-size-side-padding: 15px !default; // 屏幕两边留白
+
+/*-------------------------------- Theme color application size. end --------------------------------*/
+
+/* action-sheet */
+$-action-sheet-weight: 500 !default; // 面板字重
+$-action-sheet-radius: 16px !default; // 面板圆角大小
+$-action-sheet-action-height: 48px !default; // 单条菜单高度
+$-action-sheet-color: rgba($-color-black, 0.85) !default; // 选项名称颜色
+$-action-sheet-fs: $-fs-title !default; // 选项名称字号
+$-action-sheet-active-color: $-color-bg !default; // 点击高亮颜色
+$-action-sheet-subname-fs: $-fs-secondary !default; // 描述信息字号
+$-action-sheet-subname-color: rgba($-color-black, 0.45) !default; // 描述信息颜色
+$-action-sheet-disabled-color: rgba($-color-black, 0.25) !default; // 禁用颜色
+$-action-sheet-bg: $-color-white !default; // 菜单容器颜色(取消按钮上方的颜色)
+$-action-sheet-title-height: 64px !default; // 标题高度
+$-action-sheet-title-fs: $-fs-title !default; // 标题字号
+$-action-sheet-close-fs: $-fs-title !default; // 关闭按钮大小
+$-action-sheet-close-color: rgba($-color-black, 0.65) !default; // 关闭按钮颜色
+$-action-sheet-close-top: 25px !default; // 关闭按钮距离标题顶部距离
+$-action-sheet-close-right: 15px !default; // 关闭按钮距离标题右侧距离
+$-action-sheet-cancel-color: #131415 !default; // 取消按钮颜色
+$-action-sheet-cancel-height: 44px !default; // 取消按钮高度
+$-action-sheet-cancel-bg: rgba(240,240,240,1) !default; // 取消按钮背景色
+$-action-sheet-cancel-radius: 22px !default; // 取消按钮圆角大小
+$-action-sheet-panel-padding: 12px 0 11px !default; // 自定义面板内边距大小
+$-action-sheet-panel-img-fs: 40px !default; // 自定义面板图片大小
+$-action-sheet-panel-img-radius: 4px !default; // 自定义面板图片圆角大小
+
+/* badge */
+$-badge-bg: $-color-danger !default; // 背景填充颜色
+$-badge-color: #fff !default; // 文字颜色
+$-badge-fs: 12px !default; // 文字字号
+$-badge-padding: 0 5px !default; // padding
+$-badge-height: 16px !default; // 高度
+$-badge-primary: $-color-theme !default;
+$-badge-success: $-color-success !default;
+$-badge-warning: $-color-warning !default;
+$-badge-danger: $-color-danger !default;
+$-badge-info: $-color-info !default;
+$-badge-dot-size: 6px !default; // dot 类型大小
+$-badge-border: 2px solid $-badge-color; // 边框样式
+
+/* button */
+$-button-small-height: 28px !default; // 小型按钮高度
+$-button-small-padding: 0 11px !default; // 小型按钮padding
+$-button-small-fs: $-fs-secondary !default; // 小型按钮字号
+$-button-small-radius: 2px !default; // 小型按钮圆角大小
+$-button-small-loading: 14px !default; // 小型按钮loading图标大小
+
+$-button-medium-height: 36px !default; // 中型按钮高度
+$-button-medium-padding: 0 15px !default; // 中型按钮padding
+$-button-medium-fs: $-fs-content !default; // 中型按钮字号
+$-button-medium-radius: 4px !default; // 中型按钮圆角大小
+$-button-medium-loading: 18px !default; // 中型按钮loading图标大小
+$-button-medium-box-shadow-size: 0px 2px 4px 0px !default; // 中尺寸阴影尺寸
+
+$-button-large-height: 44px !default; // 大型按钮高度
+$-button-large-padding: 0 36px !default; // 大型按钮padding
+$-button-large-fs: $-fs-title !default; // 大型按钮字号
+$-button-large-radius: 8px !default; // 大型按钮圆角大小
+$-button-large-loading: 24px !default; // 大小按钮loading图标大小
+$-button-large-box-shadow-size: 0px 4px 8px 0px !default; // 大尺寸阴影尺寸
+
+$-button-icon-fs: 18px !default; // 带图标的按钮的图标大小
+$-button-icon-size: 40px !default; // icon 类型按钮尺寸
+$-button-icon-color: rgba($-color-black, 0.65) !default; // icon 类型按钮颜色
+$-button-icon-active-color: $-color-icon-active !default; // icon 类型按钮点击态颜色
+$-button-icon-disabled-color: $-color-icon-disabled !default; // icon 类型按钮禁用颜色
+
+$-button-normal-bg: $-color-white !default; // 默认按钮禁用背景色
+$-button-normal-color: $-color-title !default; // 文字颜色
+$-button-normal-active-color: $-color-black !default; // 文字点击态颜色
+$-button-normal-active-bg: $-color-bg !default; // 默认按钮点击态背景色
+$-button-normal-border-active-color: rgba($-color-black, 0.45) !default; // 默认按钮点击态边框色
+$-button-normal-disabled-color: rgba($-color-black, 0.25) !default; // 默认按钮禁用文字色
+$-button-normal-disabled-bg: $-color-white !default; // 默认按钮禁用背景色
+$-button-normal-border-disabled-color: $-color-bg !default; // 默认按钮禁用边框色
+$-button-border-color: mix($-color-black, $-color-white, 65%) !default; // 默认按钮边框色
+
+$-button-primary-color: $-color-theme !default; // 主要按钮颜色
+$-button-primary-bg-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ #4f7cf8 #668df8,
+ 0% 100%
+) !default; // 主要按钮背景颜色
+$-button-primary-active-color: resultColor(
+ $open-linear,
+ 315deg,
+ darken($-color-theme, 7%),
+ "dark" "light",
+ #416bdf #4e79ee,
+ 0% 100%
+) !default; // 主要按钮点击态颜色
+$-button-primary-plain-active-bg-color: #eff4fe !default; // 主要按钮点击态颜色
+$-button-primary-disabled-color: resultColor(
+ $open-linear,
+ 315deg,
+ rgba($-color-theme, 0.6),
+ "dark" "light",
+ #8FADFF #9FB8FE,
+ 0% 100%
+) !default; // 主要按钮禁用颜色
+$-button-primary-plain-disabled-color: themeColor($-color-theme, "light", #9DB9F6) !default; // 主要按钮点击态文字颜色
+$-button-primary-box-shadow-color: rgba($-color-theme, 0.25) !default; // 主要按钮阴影颜色
+
+$-button-success-color: $-color-success !default; // 成功按钮颜色
+$-button-success-active-color: mix($-color-black, $-button-success-color, 18%) !default; // 成功按钮点击态颜色
+$-button-success-disabled-color: mix($-color-white, $-button-success-color, 42%) !default; // 成功按钮禁用颜色
+$-button-success-box-shadow-color: rgba($-color-success, 0.25) !default; // 主要按钮阴影颜色
+
+$-button-info-bg-color: #F0F0F0 !default; // 信息按钮背景颜色
+$-button-info-color: $-color-title !default; // 信息按钮颜色
+$-button-info-active-bg-color: #E1E1E1 !default; // 信息按钮背景颜色
+$-button-info-active-color: rgba($-color-black, 0.85) !default; // 信息按钮点击态颜色
+$-button-info-disabled-bg-color: #F0F0F0 !default; // 信息按钮禁用颜色
+$-button-info-disabled-color: rgba($-color-black, 0.09) !default; // 信息按钮禁用颜色
+
+$-button-info-plain-border-color: rgba($-color-black, 0.45) !default; // 信息按钮禁用颜色
+$-button-info-plain-bg-color: $-color-white !default; // 信息按钮禁用颜色
+$-button-info-plain-disabled-bg-color: #F0F0F0 !default; // 信息按钮禁用颜色
+$-button-info-plain-active-color: rgba($-color-black, 0.45) !default; // 信息按钮禁用颜色
+$-button-info-plain-active-bg-color: #F0F0F0 !default; // 信息按钮禁用颜色
+$-button-info-plain-normal-color: rgba($-color-black, 0.85) !default; // 信息幽灵按钮默认颜色
+
+$-button-warning-color: $-color-warning !default; // 警告按钮颜色
+$-button-warning-active-color: mix($-color-black, $-button-warning-color, 18%) !default; // 警告按钮点击颜色
+$-button-warning-disabled-color: mix($-color-white, $-button-warning-color, 42%) !default; // 警告按钮禁用颜色
+$-button-warning-box-shadow-color: rgba($-color-warning, 0.25) !default; // 主要按钮阴影颜色
+
+$-button-error-color: $-color-danger !default; // 错误按钮颜色
+$-button-error-active-color: mix($-color-black, $-button-error-color, 18%) !default; // 错误按钮点击颜色
+$-button-error-disabled-color: mix($-color-white, $-button-error-color, 42%) !default; // 错误按钮禁用颜色
+$-button-error-box-shadow-color: rgba($-color-danger, 0.25) !default; // 主要按钮阴影颜色
+
+$-button-suck-height: 50px !default; // suck 类型按钮高度
+$-button-suck-active-color: $-button-primary-plain-active-bg-color !default; // 错误按钮禁用颜色
+
+/* cell */
+$-cell-padding: $-size-side-padding !default; // cell 左右padding距离
+$-cell-ling-height: 1.43 !default; // 行高
+
+$-cell-group-title-fs: $-fs-title !default; // 组标题字号
+$-cell-group-padding: 13px $-cell-padding !default; // 组padding
+$-cell-group-title-color: rgba($-color-black, 0.85) !default; // 组标题文字颜色
+$-cell-group-value-fs: $-fs-content !default; // 组值字号
+$-cell-group-value-color: $-color-content !default; // 组值文字颜色
+
+$-cell-wrapper-padding: 13px !default; // cell 容器padding
+$-cell-wrapper-padding-with-label: 16px !default; // cell 容器上下padding(有label情况下)
+$-cell-icon-right: $-cell-padding !default; // 图标距离右边缘
+$-cell-icon-size: 16px !default; // 图标大小
+$-cell-title-fs: 14px !default; // 标题字号
+$-cell-title-color: rgba($-color-black, 0.85) !default; // 标题文字颜色
+$-cell-label-fs: 12px !default; // 描述信息字号
+$-cell-label-color: rgba($-color-black, 0.45) !default; // 描述信息文字颜色
+$-cell-value-fs: 14px !default; // 右侧内容字号
+$-cell-value-color: rgba($-color-black, 0.85) !default; // 右侧内容文字颜色
+$-cell-value-line-height: 1.58 !default; // 右侧内容行高
+$-cell-arrow-size: 18px !default; // 右箭头大小
+$-cell-arrow-color: rgba($-color-black, 0.25) !default; // 右箭头颜色
+$-cell-tap-bg: rgba($-color-black, 0.06) !default; // 点击态背景色
+
+$-cell-title-fs-large: 16px !default; // 大尺寸标题字号
+$-cell-label-fs-large: 14px !default; // 描述信息字号
+$-cell-icon-size-large: 18px !default; // 图标大小
+
+$-cell-required-color: $-color-danger !default; // 要求必填*颜色
+$-cell-required-size: 18px !default; // 必填*字号
+$-cell-vertical-top: 16px !default; // 表单类型-上下结构的间距
+
+/* calendar */
+$-calendar-fs: 16px !default;
+$-calendar-panel-padding: 0 12px !default;
+$-calendar-panel-title-fs: 14px !default;
+$-calendar-panel-title-color: rgba(0, 0, 0, 0.85) !default;
+$-calendar-week-color: rgba(0, 0, 0, 0.85) !default;
+$-calendar-week-height: 36px !default;
+$-calendar-week-fs: 12px !default;
+$-calendar-day-fs: 16px !default;
+$-calendar-day-color: rgba(0, 0, 0, 0.85) !default;
+$-calendar-day-fw: 500 !default;
+$-calendar-day-height: 64px !default;
+$-calendar-month-width: 50px !default;
+$-calendar-active-color: $-color-theme !default;
+$-calendar-disabled-color: rgba(0, 0, 0, 0.25) !default;
+$-calendar-range-color: rgba($-color-theme, 0.09) !default;
+$-calendar-active-border: 8px !default;
+$-calendar-info-fs: 10px !default;
+
+/* checkbox */
+$-checkbox-margin: 10px !default; // 多个复选框距离
+$-checkbox-bg: $-color-white !default; // 多个复选框距离
+$-checkbox-label-margin: 9px !default; // 右侧文字与左侧图标距离
+$-checkbox-size: 16px !default; // 左侧图标尺寸
+$-checkbox-icon-size: 14px !default; // 左侧图标尺寸
+$-checkbox-border-color: #dcdcdc !default; // 左侧图标边框颜色
+$-checkbox-check-color: $-color-white !default; // 左侧图标边框颜色
+$-checkbox-label-fs: 14px !default; // 右侧文字字号
+$-checkbox-label-color: rgba($-color-black, 0.85); // 右侧文字颜色
+$-checkbox-checked-color: $-color-theme !default; // 选中颜色
+
+$-checkbox-disabled-color: rgba($-color-black, 0.04) !default; // 禁用背景颜色
+$-checkbox-disabled-label-color: rgba($-color-black, 0.25) !default; // 禁用文字颜色
+$-checkbox-disabled-check-color: rgba($-color-black, 0.15) !default; // 禁用图标颜色
+$-checkbox-disabled-check-bg: rgba($-color-black, 0.15) !default; // 禁用边框背景颜色
+$-checkbox-square-radius: 4px !default; // 方型圆角大小
+
+$-checkbox-large-size: 18px !default; // 左侧图标尺寸
+$-checkbox-large-label-fs: 16px !default; // 右侧文字字号
+
+$-checkbox-button-height: 32px !default; // 按钮模式复选框高
+$-checkbox-button-min-width: 78px !default; // 按钮模式最小宽
+$-checkbox-button-radius: 16px !default; // 按钮圆角大小
+$-checkbox-button-bg: rgba($-color-black, 0.04) !default; // 按钮模式背景颜色
+$-checkbox-button-font-size: 14px !default; // 按钮模式字号
+$-checkbox-button-border: #f5f5f5 !default; // 按钮边框颜色
+$-checkbox-button-disabled-border: rgba($-color-black, 0.15) !default; // 按钮禁用边框颜色
+
+/* collapse */
+$-collapse-side-padding: $-size-side-padding !default; // 左右间距
+$-collapse-body-padding: 14px 25px !default; // body padding
+$-collapse-header-padding: 13px $-size-side-padding !default; // 头部padding
+$-collapse-title-color: rgba($-color-black, 0.85) !default; // 标题颜色
+$-collapse-title-fs: 16px !default; // 标题字号
+$-collapse-arrow-size: 18px !default; // 箭头大小
+$-collapse-arrow-color: #d8d8d8 !default; // 箭头颜色
+$-collapse-body-fs: 14px !default; // 内容字号
+$-collapse-body-color: rgba($-color-black, 0.65) !default; // 内容颜色
+$-collapse-disabled-color: rgba($-color-black, 0.15) !default; // 禁用颜色
+$-collapse-retract-fs: 14px !default; // 更多 字号
+$-collapse-more-color: $-color-theme !default; // 更多 颜色
+
+/* divider */
+$-divider-padding: 0 $-size-side-padding !default; // 两边间距
+$-divider-color: rgba($-color-black, 0.45) !default; // 字体颜色
+$-divider-line-color: rgba($-color-black, 0.15) !default; // 线条颜色
+$-divider-fs: 14px !default; // 字体大小
+
+/* drop-menu */
+$-drop-menu-height: 48px; // 展示选中项的高度
+$-drop-menu-color: $-color-content !default; // 展示选中项的颜色
+$-drop-menu-fs: $-fs-content !default; // 展示选中项的字号
+$-drop-menu-side-padding: $-size-side-padding !default; // 两边留白间距
+$-drop-menu-disabled-color: rgba($-color-black, 0.25) !default; // 禁用颜色
+$-drop-menu-item-height: 48px; // 选项高度
+$-drop-menu-item-color: $-color-content !default; // 选项颜色
+$-drop-menu-item-fs: $-fs-content !default; // 选项字号
+$-drop-menu-item-color-active: $-color-theme !default; // 选中颜色
+$-drop-menu-item-color-tip: rgba($-color-black, 0.45) !default; // 提示文字颜色
+$-drop-menu-item-fs-tip: $-fs-secondary !default; // 提示文字字号
+$-drop-menu-option-check-size: 20px !default; // check 图标大小
+$-drop-menu-line-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ rgba(81, 124, 240, 1) rgba(118, 158, 245, 1),
+ 0% 100%
+) !default; // 下划线颜色
+$-drop-menu-line-height: 3px !default; // 下划线高度
+
+/* input-number */
+$-input-number-color: #262626 !default; // 文字颜色
+$-input-number-border-color: #e8e8e8 !default; // 边框颜色
+$-input-number-disabled-color: rgba($-color-black, 0.25) !default; // 禁用颜色
+$-input-number-height: 24px !default; // 加减号按钮高度
+$-input-number-btn-width: 26px !default; // 加减号按钮宽度
+$-input-number-input-width: 36px !default; // 输入框宽度
+$-input-number-radius: 4px !default; // 加减号按钮圆角大小
+$-input-number-fs: 12px !default; // 输入框字号
+$-input-number-icon-size: 14px !default; // 加减号图标大小
+$-input-number-icon-color: rgba($-color-black, 0.65) !default; // icon颜色
+
+/* input */
+$-input-border-color: #dadada !default; // 无label边框颜色
+$-input-not-empty-border-color: #262626 !default; // 无label边框颜色
+$-input-fs: $-cell-title-fs !default; // 字号
+$-input-fs-large: $-cell-title-fs-large !default; // 大尺寸字号
+$-input-icon-margin: 8px !default; // 图标距离
+$-input-color: #262626 !default; // 文字颜色
+$-input-placeholder-color: #bfbfbf !default; // 占位符颜色
+$-input-disabled-color: #d9d9d9 !default; // 输入框禁用颜色
+$-input-error-color: $-color-danger !default; // 输入框错误颜色
+$-input-icon-color: #bfbfbf !default; // 图标颜色
+$-input-clear-color: #585858 !default; // 关闭按钮颜色
+$-input-count-color: #bfbfbf !default; // 计数文字颜色
+$-input-count-current-color: #262626 !default; // 当前长度颜色
+$-input-label-padding: 11px 10px 11px 0 !default; // label padding
+$-input-bg: $-color-white !default; // 默认背景颜色
+
+$-input-cell-bg: $-color-white !default; // cell 类型背景色
+$-input-cell-border-color: $-color-border-light !default; // cell 类型边框颜色
+$-input-cell-padding: $-size-side-padding !default; // cell 类型左右间距
+$-input-cell-height: 46px !default; // cell 高度
+$-input-cell-height-large: 48px !default; // cell 大尺寸高度
+$-input-cell-label-width: 33% !default; // cell 下 label 的宽度
+$-input-inner-height: 34px !default; // 非cell和textarea下的高度
+$-input-inner-height-no-border: 20px !default; // 无边框下的高度
+$-input-inner-padding: 6px 0 !default; // 非cell和textarea下的padding
+$-input-count-fs: 14px !default; // 计数字号
+$-input-count-fs-large: 14px !default; // 大尺寸计数字号
+$-input-icon-size: 16px !default; // 图标大小
+$-input-icon-size-large: 18px !default; // 大尺寸图标大小
+$-input-textarea-padding: 15px !default; // textarea下的padding
+
+/* loadmore */
+$-loadmore-height: 48px !default; // 高度
+$-loadmore-color: rgba($-color-black, 0.45) !default; // 颜色
+$-loadmore-fs: 14px !default; // 字号
+$-loadmore-error-color: $-color-theme !default; // 点击重试颜色
+
+/* message-box */
+$-message-box-width: 300px !default; // 宽度
+$-message-box-bg: $-color-white !default; // 默认背景颜色
+$-message-box-radius: 16px !default; // 圆角大小
+$-message-box-padding: 25px 24px 0 !default; // 主体内容padding
+$-message-box-title-fs: 16px !default; // 标题字号
+$-message-box-title-color: rgba($-color-black, 0.85) !default; // 标题颜色
+$-message-box-content-fs: 14px !default; // 内容字号
+$-message-box-content-color: #666666 !default; // 内容颜色
+$-message-box-content-max-height: 264px !default; // 内容最大高度
+$-message-box-content-scrollbar-width: 4px !default; // 内容滚动条宽度
+$-message-box-content-scrollbar-color: rgba($-color-black, 0.1) !default; // 内容滚动条颜色
+$-message-box-input-error-color: $-input-error-color !default; // 输入框错误颜色
+
+/* notice-bar */
+$-notice-bar-fs: 12px !default; // 字号
+$-notice-bar-line-height: 18px !default; // 行高
+$-notice-bar-border-radius: 8px !default; // 圆角
+$-notice-bar-padding: 9px 20px 9px 15px !default; // 非换行下的padding
+$-notice-bar-warning-bg: #fff6c8 !default; // 背景色
+$-notice-bar-info-bg: #f4f9ff !default; // 背景色
+$-notice-bar-danger-bg: #feeced !default; // 背景色
+$-notice-bar-warning-color: $-color-warning !default; // 文字和图标颜色
+$-notice-bar-info-color: $-color-theme !default; // 文字和图标颜色
+$-notice-bar-danger-color: $-color-danger !default; // 文字和图标颜色
+$-notice-bar-prefix-size: 18px !default; // 图标大小
+$-notice-bar-close-bg: rgba($-color-black, 0.15) !default; // 右侧关闭按钮背景颜色
+$-notice-bar-close-size: 18px !default; // 右侧关闭按钮背景颜色
+$-notice-bar-close-color: $-color-white !default; // 右侧关闭按钮颜色
+$-notice-bar-close-size: 10px !default; // 关闭按钮大小
+$-notice-bar-wrap-padding: 14px $-size-side-padding !default; // 换行下的padding
+
+/* pagination */
+$-pagination-content-padding: 10px 15px !default;
+$-pagination-message-padding: 1px 0 16px 0 !default;
+$-pagination-message-fs: 12px !default;
+$-pagination-message-color: rgba($-color-black, 0.69) !default;
+$-pagination-nav-border: 1px solid rgba($-color-black, 0.45) !default;
+$-pagination-nav-border-radius: 16px !default;
+$-pagination-nav-fs: 12px !default;
+$-pagination-nav-width: 60px !default;
+$-pagination-nav-color: rgba($-color-black, 0.85) !default;
+$-pagination-nav-content-fs: 12px !default;
+$-pagination-nav-sepatator-padding: 0 4px !default;
+$-pagination-nav-current-color: $-color-theme !default;
+
+/* picker */
+$-picker-toolbar-height: 54px !default; // toolbar 操作条的高度
+$-picker-action-height: 16px !default; // toolbar 操作条的高度
+$-picker-toolbar-finish-color: $-color-theme !default; // toolbar 操作条完成按钮的颜色
+$-picker-toolbar-cancel-color: #666666 !default; // toolbar 操作条的边框颜色
+$-picker-toolbar-fs: $-fs-title !default; // toolbar 操作条的字号
+$-picker-toolbar-title-color: rgba($-color-black, 0.85) !default; // toolbar 操作台的标题颜色
+$-picker-column-fs: 16px !default; // 选择器选项的字号
+$-picker-bg: $-color-white !default; // 选择器选项的字号
+$-picker-column-active-fs: 18px !default; // 选择器选项被选中的字号
+$-picker-column-color: rgba($-color-black, 0.85) !default; // 选择器选项的颜色
+$-picker-column-height: 210px !default; // 列高 滚筒外部的高度
+$-picker-column-item-height: 35px !default; // 列高 滚筒外部的高度
+$-picker-column-select-bg: #f5f5f5 !default;
+$-picker-loading-button-color: rgba($-color-black, 0.25) !default; // loading 背景颜色
+$-picker-column-padding: 0 $-size-side-padding !default; // 选项内间距
+
+$-picker-column-disabled-color: rgba($-color-black, 0.25) !default; // 选择器选项禁用的颜色
+$-picker-mask: linear-gradient(180deg, hsla(0, 0%, 100%, 0.9), hsla(0, 0%, 100%, 0.25)),
+ linear-gradient(0deg, hsla(0, 0%, 100%, 0.9), hsla(0, 0%, 100%, 0.25)) !default; // 上下阴影
+$-picker-loading-bg: rgba($-color-white, 0.8) !default; // loading 背景颜色
+$-picker-region-separator-color: rgba($-color-black, 0.65) !default; // 区域选择文字颜色
+$-picker-cell-arrow-size-large: $-cell-icon-size !default; // cell 类型的大尺寸 右侧icon尺寸
+
+$-picker-region-color: rgba($-color-black, 0.45) !default; // 区域选择文字颜色
+$-picker-region-bg-active-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light" "light",
+ rgba(79,124,248,1) rgba(102,141,248,1) rgba(102,141,248,1),
+ 0% 100% 100%
+) !default; // 区域选择激活选中背景颜色
+
+$-picker-region-fs: 14px !default; // 区域选择文字字号
+
+/* col-picker */
+$-col-picker-selected-height: 44px !default; // 弹框顶部值高度
+$-col-picker-selected-padding: 0 16px !default; // 弹框顶部值左右间距
+$-col-picker-selected-fs: 14px !default; // 弹框顶部值字号
+$-col-picker-selected-color: rgba($-color-black, 0.85) !default; // 弹框顶部值文字颜色
+$-col-picker-selected-fw: 700 !default; // 弹框顶部值高亮字重
+$-col-picker-line-width: 16px !default; // 弹框顶部值高亮线条宽度
+$-col-picker-line-height: 3px !default; // 弹框顶部值高亮线条高度
+$-col-picker-line-color: linear-gradient(315deg, rgba(81,124,240,1), rgba(118,158,245,1)) !default; // 弹框顶部值高亮线条颜色
+$-col-picker-line-box-shadow: 0px 1px 2px 0px rgba(1, 87, 255, 0.2) !default; // 弹框顶部值高亮线条阴影
+$-col-picker-list-height: 53vh !default; // 弹框列表高度
+$-col-picker-list-padding-bottom: 30px !default; // 弹框列表底部间距
+$-col-picker-list-color: rgba($-color-black, 0.85) !default; // 弹框列表文字颜色
+$-col-picker-list-color-disabled: rgba($-color-black, 0.15) !default; // 弹框列表文字禁用颜色
+$-col-picker-list-color-tip: rgba($-color-black, 0.45) !default; // 弹框列表提示文字颜色
+$-col-picker-list-fs: 14px !default; // 弹框列表文字字号
+$-col-picker-list-fs-tip: 12px !default; // 弹框列表提示文字字号
+$-col-picker-list-item-padding: 12px 15px !default; // 弹框列表选项间距
+$-col-picker-list-checked-icon-size: 18px !default; // 弹框列表选中箭头大小
+$-col-picker-list-color-checked: $-color-theme !default; // 弹框列表选中选项颜色
+
+/* popup */
+$-popup-close-size: 24px !default; // 关闭按钮尺寸
+$-popup-close-color: #666 !default; // 关闭按钮颜色
+
+/* progress */
+$-progress-padding: 9px 0 8px !default; // 进度条内边距
+$-progress-bg: rgba(229,229,229,1) !default; // 进度条底色
+$-progress-danger-color: $-color-danger !default; // 进度条danger颜色
+$-progress-success-color: $-color-success !default; // 进度条success进度条颜色
+$-progress-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ #517CF0 #769EF5 ,
+ 0% 100%
+) !default; // 进度条渐变色
+$-progress-linear-success-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ #20B080 #2BD69D ,
+ 0% 100%
+) !default; // success进度条渐变色
+$-progress-linear-danger-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ #E04350 #FF5964 ,
+ 0% 100%
+) !default; // danger进度条渐变色
+$-progress-height: 3px !default; // 进度条高度
+$-progress-label-color: #333 !default; // 文字颜色
+$-progress-label-fs: 14px !default; // 文字字号
+$-progress-icon-fs: 18px !default; // 图标字号
+
+/* radio */
+$-radio-margin: $-checkbox-margin !default; // 多个单选框距离
+$-radio-label-margin: $-checkbox-label-margin !default; // 右侧文字与左侧图标距离
+$-radio-size: 16px !default; // 左侧图标尺寸
+$-radio-bg: $-checkbox-bg !default; // 左侧图标尺寸
+$-radio-label-fs: $-checkbox-label-fs !default; // 右侧文字字号
+$-radio-label-color: $-checkbox-label-color !default; // 右侧文字颜色
+$-radio-checked-color: $-checkbox-checked-color !default; // 选中颜色
+$-radio-disabled-color: $-checkbox-disabled-color !default; // 禁用颜色
+$-radio-disabled-label-color: $-checkbox-disabled-label-color !default; // 禁用文字颜色
+
+$-radio-large-size: $-checkbox-large-size !default; // 左侧图标尺寸
+$-radio-large-label-fs: $-checkbox-large-label-fs !default; // 右侧文字字号
+
+$-radio-button-height: $-checkbox-button-height !default; // 按钮模式复选框高
+$-radio-button-min-width: 60px !default; // 按钮模式最小宽
+$-radio-button-max-width: 144px !default; // 按钮模式最大宽
+$-radio-button-radius: $-checkbox-button-radius !default; // 按钮圆角大小
+$-radio-button-bg: $-checkbox-button-bg !default; // 按钮模式背景颜色
+$-radio-button-fs: $-checkbox-button-font-size !default; // 按钮模式字号
+$-radio-button-border: $-checkbox-button-border !default; // 按钮边框颜色
+$-radio-button-disabled-border: $-checkbox-button-disabled-border !default; // 按钮禁用边框颜色
+
+$-radio-dot-size: 8px !default; // 单选dot模式圆点尺寸
+$-radio-dot-large-size: 10px !default; // 单选dot模式大尺寸圆点尺寸
+$-radio-dot-checked-bg: $-color-theme !default; // 单选dot模式选中背景色
+$-radio-dot-checked-border-color: $-color-theme !default; // 单选dot模式选中边框色
+$-radio-dot-border-color: #dcdcdc !default; // 单选dot模式边框色
+$-radio-dot-disabled-border: #d9d9d9 !default; // 单选dot模式禁用边框颜色
+$-radio-dot-disabled-bg: #d9d9d9 !default; // 单选dot模式禁用背景颜色
+
+/* search */
+$-search-side-padding: $-size-side-padding !default; // 左右间距
+$-search-padding: 10px 0 10px $-search-side-padding !default; // 不包含取消按钮的间距
+$-search-input-radius: 15px !default; // 输入框圆角大小
+$-search-input-bg: $-color-bg !default; // 输入框背景色
+$-search-input-height: 30px !default; // 输入框高度
+$-search-input-padding: 0 32px 0 42px !default; // 输入框间距
+$-search-input-fs: $-fs-content !default; // 输入框字号
+$-search-input-color: #262626 !default; // 输入框文字颜色
+$-search-icon-color: $-color-icon !default; // 图标颜色
+$-search-placeholder-color: #bfbfbf !default; // placeholder 颜色
+$-search-cancel-padding: 0 $-search-side-padding 0 10px !default; // 取消按钮间距
+$-search-cancel-fs: $-fs-title !default; // 取消按钮字号
+$-search-cancel-color: rgba($-color-black, 0.65) !default; // 取消按钮颜色
+$-search-light-bg: $-color-bg !default; // light 类型的容器背景色
+
+/* slider */
+$-slider-fs: $-fs-content !default; // 字体大小
+$-slider-handle-radius: 12px !default; // 滑块半径
+$-slider-handle-bg: resultColor(
+ $open-linear,
+ 139deg,
+ $-color-theme,
+ "dark" "light",
+ #FFFFFF #F7F7F7 ,
+ 0% 100%
+) !default; // 滑块背景
+$-slider-axie-height: 3px !default; // 滑轴高度
+$-slider-color: #333 !default; // 字体颜色
+$-slider-axie-bg: #E5E5E5 !default; // 滑轴的默认背景色
+$-slider-line-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ #517CF0 #769EF5 ,
+ 0% 100%
+) !default; // 进度条颜色
+$-slider-disabled-color: rgba($-color-black, 0.25) !default; // 禁用状态下字体颜色
+
+/* sort-button */
+$-sort-button-fs: $-fs-content !default; // 字号
+$-sort-button-color: $-color-content !default; // 颜色
+$-sort-button-height: 48px !default; // 高度
+$-sort-button-line-height: 3px !default; // 下划线高度
+$-sort-button-line-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ rgba(81, 124, 240, 1) rgba(118, 158, 245, 1),
+ 0% 100%
+) !default; // 下划线颜色
+
+/* steps */
+$-steps-icon-size: 22px !default; // 图标尺寸
+$-steps-inactive-color: rgba($-color-black, 0.25) !default; // 等待状态文字颜色
+$-steps-finished-color: $-color-theme !default; // 完成文字颜色
+$-steps-icon-text-fs: $-fs-content !default; // 数字图标文字字号
+$-steps-error-color: $-color-danger !default; // 异常颜色
+$-steps-title-fs: $-fs-content !default; // 标题字号
+$-steps-title-fw: $-fw-medium !default; // 标题字重
+$-steps-label-fs: $-fs-secondary !default; // 描述信息字号
+$-steps-description-color: rgba($-color-black, 0.45) !default; // 描述信息颜色
+$-steps-is-icon-width: 30px !default; // 自定义图标的宽度,给左右留白
+$-steps-line-color: rgba($-color-black, 0.15) !default; // 线条颜色
+$-steps-dot-size: 7px !default; // 点状大小
+$-steps-dot-active-size: 9px !default; // 点状高亮大小
+
+/* switch */
+$-switch-width: 51px !default; // 宽度
+$-switch-height: 32px !default; // 高度
+$-switch-circle-size: 28px !default; // 圆点大小
+$-switch-border-color: #e5e5e5 !default; // 边框颜色选中状态背景颜色
+$-switch-active-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "light" "dark",
+ #4f7cf8 #668df8,
+ 0% 100%
+) !default; // 选中状态背景
+$-switch-active-shadow-color: rgba(0, 83, 162, 0.5) !default; // 选中状态shadow颜色
+$-switch-inactive-color: resultColor(
+ $open-linear,
+ 315deg,
+ #dadada,
+ "light" "dark" "dark",
+ #f2f2f2 #dadada #668df8,
+ 0% 100% 100%
+) !default; // 非选中背景颜色
+$-switch-inactive-shadow-color: rgba(155, 155, 155, 0.5) !default; // 非选中状态shadow颜色
+
+
+/* tabs */
+$-tabs-nav-arrow-fs: 18px !default; // 全部Icon字号
+$-tabs-nav-arrow-open-fs: 14px !default; // 展开Icon字号
+$-tabs-nav-width: 100vw; // tabs 头部切换宽度
+$-tabs-nav-height: 42px !default; // 头部切换高度
+$-tabs-nav-fs: $-fs-content !default; // 头部切换文字大小
+$-tabs-nav-color: rgba($-color-black, 0.85) !default; // 头部切换文字颜色
+$-tabs-nav-bg: $-color-white !default; // 背景颜色
+$-tabs-nav-active-color: $-color-theme !default; // 头部高亮颜色
+$-tabs-nav-disabled-color: rgba($-color-black, 0.25) !default; // 头部禁用颜色
+$-tabs-nav-line-height: 3px !default; // 高亮边框高度
+$-tabs-nav-line-bg-color: resultColor(
+ $open-linear,
+ 315deg,
+ $-color-theme,
+ "dark" "light",
+ rgba(81, 124, 240, 1) rgba(118, 158, 245, 1),
+ 0% 100%
+) !default; // 底部条颜色
+$-tabs-nav-map-fs: $-fs-content !default; // map 类型按钮字号
+$-tabs-nav-map-color: rgba($-color-black, 0.85) !default; // map 类型按钮文字颜色
+$-tabs-nav-map-arrow-color: rgba($-color-black, 0.65) !default; // map 类型箭头颜色
+$-tabs-nav-map-btn-before-bg: linear-gradient(
+ 270deg,
+ rgba(255, 255, 255, 1) 1%,
+ rgba(255, 255, 255, 0) 100%
+) !default; // 左侧map遮罩阴影
+$-tabs-nav-map-button-back-color: rgba($-color-black, 0.04) !default; // map 类型按钮边框颜色
+$-tabs-nav-map-button-radius: 16px !default; // map 类型按钮圆角大小
+$-tabs-nav-map-modal-bg: $-modal-bg !default; // map 类型蒙层背景色
+
+/* tag */
+$-tag-fs: $-fs-secondary !default; // 字号
+$-tag-color: $-color-white !default; // 字体颜色
+$-tag-small-fs: $-fs-aid !default; // 小尺寸字号
+$-tag-info-color: #585858 !default; // info 颜色
+$-tag-primary-color: $-color-theme !default; // 主颜色
+$-tag-danger-color: rgba(250,67,80,1) !default; // danger 颜色
+$-tag-warning-color: rgba(255,144,0,1) !default; // warning 颜色
+$-tag-success-color: rgba(51,187,68,1) !default; // success 颜色
+$-tag-info-bg: resultColor(
+ $open-linear,
+ 49deg,
+ $-color-black,
+ "dark" "light",
+ #808080 #999999,
+ 0% 100%
+) !default; // info 背景颜色
+$-tag-primary-bg: resultColor(
+ $open-linear,
+ 49deg,
+ $-color-theme,
+ "dark" "light",
+ rgba(81,124,240,1) rgba(118,158,245,1),
+ 0% 100%
+) !default; // 主背景颜色
+$-tag-danger-bg: resultColor(
+ $open-linear,
+ 44deg,
+ $-color-danger,
+ "dark" "light",
+ rgba(230,62,70,1) rgba(255,64,73,1),
+ 0% 100%
+) !default; // danger 背景颜色
+$-tag-warning-bg: resultColor(
+ $open-linear,
+ 45deg,
+ $-color-warning,
+ "dark" "light",
+ rgba(230,113,55,1) rgba(255,151,76,1),
+ 0% 100%
+) !default; // warning 背景颜色
+$-tag-success-bg: resultColor(
+ $open-linear,
+ 45deg,
+ $-color-success,
+ "dark" "light",
+ rgba(32,176,128,1) rgba(43,214,157,1),
+ 0% 100%
+) !default; // success 背景颜色
+$-tag-round-color: rgba(102, 102, 102, 1) !default; // round 字体颜色
+$-tag-round-border-color: rgba(225,225,225,1) !default; // round 边框颜色
+$-tag-round-radius: 12px !default; // round 圆角大小
+$-tag-mark-radius: 6px 2px 6px 2px !default; // mark 圆角大小
+$-tag-close-size: 14px !default; // 关闭按钮字号
+$-tag-close-color: $-tag-info-color !default; // 关闭按钮颜色
+$-tag-close-active-color: rgba($-color-black, 0.45) !default; // 关闭按钮 active 颜色
+
+/* toast */
+$-toast-padding: 16px 24px !default; // padding
+$-toast-max-width: 300px !default; // 最大宽度
+$-toast-radius: 8px !default; // 圆角大小
+$-toast-bg: $-modal-bg !default; // 背景色
+$-toast-fs: $-fs-content !default; // 字号
+$-toast-with-icon-min-width: 150px !default; // 有图标的情况下最小宽度
+$-toast-icon-size: 39px !default; // 图标大小
+$-toast-loading-padding: 10px !default; // loading 下的padding
+$-toast-box-shadow: 0px 6px 16px 0px rgba($-color-black, 0.08) !default; // 外部阴影
+
+/* tooltip */
+$-tooltip-bg: rgba(38, 39, 40, 0.8) !default; // 背景色
+$-tooltip-color: $-color-white !default; // 文字颜色
+$-tooltip-radius: 8px !default; // 圆角大小
+$-tooltip-arrow-size: 9px !default; // 箭头大小
+$-tooltip-fs: $-fs-content !default; // 字号
+$-tooltip-blur: 10px !default; // 背景高斯模糊效果
+$-tooltip-padding: 9px 20px !default; // 间距
+$-tooltip-close-size: 6px !default; // 背景高斯模糊效果
+$-tooltip-z-index: 500 !default;
+$-tooltip-line-height: 18px !default; // 行高
+
+/* popover */
+$-popover-bg: $-color-white !default; // 背景色
+$-popover-color: rgba($-color-black, 0.85) !default; // 文字颜色
+$-popover-box-shadow: 0px 2px 10px 0px rgba($-color-black, 0.1) !default; // 阴影颜色
+$-popover-arrow-box-shadow: 0px 2px 10px 0px rgba($-color-black, 0.2) !default; // 阴影颜色
+$-popover-border-color: rgba($-color-black, 0.09) !default; // 阴影颜色
+$-popover-radius: 4px !default; // 圆角大小
+$-popover-arrow-size: 6px !default; // 箭头大小
+$-popover-fs: $-fs-content !default; // 字号
+$-popover-padding: 15px !default; // 间距
+$-popover-line-height: 18px !default; // 行高
+$-popover-z-index: $-tooltip-z-index !default;
+
+/* grid-item */
+$-grid-item-fs: 12px !default; // 字号
+$-grid-item-bg: $-color-white !default; // 字号
+$-grid-item-padding: 14px 0px !default; // 内容的 padding
+$-grid-item-border-color: $-color-border-light !default; // 边框颜色
+
+/* statustip */
+$-statustip-fs: $-fs-content !default; // 字号
+$-statustip-color: rgba($-color-black, 0.45) !default; // 文字颜色
+$-statustip-line-height: 16px !default; // 文字行高
+$-statustip-padding: 5px 10px !default; // 间距
+
+/* card */
+$-card-bg: $-color-white !default; // 背景色
+$-card-fs: $-fs-content !default; // 卡片字号
+$-card-padding: 0 $-size-side-padding !default; // 内边距
+$-card-footer-padding: 12px 0 16px !default; // 底部内边距
+$-card-shadow-color: 0px 4px 8px 0px rgba($-color-black, 0.02) !default; // 阴影
+$-card-radius: 8px !default; // 圆角大小
+$-card-line-height: 1.1 !default; // 行高
+$-card-margin: 0 $-size-side-padding !default; // 外边距
+$-card-title-color: rgba($-color-black, 0.85) !default; // 标题颜色
+$-card-title-fs: $-fs-title !default; // 矩形卡片标题字号
+$-card-content-border-color: rgba($-color-black, 0.09) !default; // 内容边框
+$-card-rectangle-title-padding: 15px 15px 12px !default; // 矩形卡片头部内边距
+$-card-rectangle-content-padding: 16px 0 !default; // 矩形卡片内容内边距
+$-card-rectangle-footer-padding: 12px 0 !default; // 矩形卡片底部内边距
+$-card-content-color: rgba($-color-black, 0.45) !default; // 文本内容颜色
+$-card-content-line-height: 1.428 !default; // 文本内容行高
+$-card-content-margin: 13px 0 12px !default; // 内容外边距
+$-card-content-rectangle-margin: 14px 0 12px !default; // 矩形卡片内容外边距
+
+/* upload */
+$-upload-size: 80px !default; // upload的外边框默认尺寸
+$-upload-evoke-icon-size: 32px !default; // 唤起项的图标大小
+$-upload-evoke-bg: rgba($-color-black, 0.04) !default; // 唤起项的背景色
+$-upload-evoke-color: rgba($-color-black, 0.25) !default; // 唤起项的图标颜色
+$-upload-evoke-disabled-color: rgba($-color-black, 0.09) !default; // 唤起项禁用颜色
+$-upload-close-icon-size: 16px !default; // 移除按钮尺寸
+$-upload-close-icon-color: rgba($-color-black, 0.65) !default; // 移除按钮颜色
+$-upload-progress-fs: 14px !default; // 进度文字字号
+$-upload-preview-name-fs: 12px !default; // 预览图片名字号
+$-upload-preview-icon-size: 24px !default; // 预览内部图标尺寸
+$-upload-preview-name-bg: rgba($-color-black, 0.6) !default; // 预览文件名背景色
+$-upload-preview-name-height: 22px !default; // 预览文件名背景高度
+
+/* curtain */
+$-curtain-content-radius: 24px !default; // 内容圆角
+$-curtain-content-close-color: $-color-white !default; // 关闭按钮颜色
+$-curtain-content-close-fs: $-fs-big !default; // 关闭按钮大小
diff --git a/src/uni_modules/wot-design-uni/components/common/base64.ts b/src/uni_modules/wot-design-uni/components/common/base64.ts
new file mode 100644
index 00000000..3fc8a548
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/base64.ts
@@ -0,0 +1,29 @@
+const _b64chars = [...'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/']
+const _mkUriSafe = (src) => src.replace(/[+/]/g, (m0) => (m0 === '+' ? '-' : '_')).replace(/=+$/m, '')
+const fromUint8Array = (src, rfc4648 = false) => {
+ let b64 = ''
+ for (let i = 0, l = src.length; i < l; i += 3) {
+ const [a0, a1, a2] = [src[i], src[i + 1], src[i + 2]]
+ const ord = (a0 << 16) | (a1 << 8) | a2
+ b64 += _b64chars[ord >>> 18]
+ b64 += _b64chars[(ord >>> 12) & 63]
+ b64 += typeof a1 !== 'undefined' ? _b64chars[(ord >>> 6) & 63] : '='
+ b64 += typeof a2 !== 'undefined' ? _b64chars[ord & 63] : '='
+ }
+ return rfc4648 ? _mkUriSafe(b64) : b64
+}
+const _btoa =
+ typeof btoa === 'function'
+ ? (s) => btoa(s)
+ : (s) => {
+ if (s.charCodeAt() > 255) {
+ throw new RangeError('The string contains invalid characters.')
+ }
+ return fromUint8Array(Uint8Array.from(s, (c: any) => c.charCodeAt(0)))
+ }
+const utob = (src) => unescape(encodeURIComponent(src))
+
+export default function encode(src, rfc4648 = false) {
+ const b64 = _btoa(utob(src))
+ return rfc4648 ? _mkUriSafe(b64) : b64
+}
diff --git a/src/uni_modules/wot-design-uni/components/common/clickoutside.js b/src/uni_modules/wot-design-uni/components/common/clickoutside.js
new file mode 100644
index 00000000..ffc65387
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/clickoutside.js
@@ -0,0 +1,27 @@
+let queue = []
+let outsideId = 1
+
+export function pushToQueue(comp) {
+ comp.outsideId = ++outsideId
+ queue.push(comp)
+}
+
+export function removeFromQueue(comp) {
+ queue = queue.filter((item) => {
+ return item.outsideId !== comp.outsideId
+ })
+}
+
+export function closeOther(comp) {
+ queue.forEach((item) => {
+ if (item.outsideId !== comp.outsideId) {
+ item.close()
+ }
+ })
+}
+
+export default function closeOutside() {
+ queue.forEach((item) => {
+ item.close()
+ })
+}
diff --git a/src/uni_modules/wot-design-uni/components/common/component.md b/src/uni_modules/wot-design-uni/components/common/component.md
new file mode 100644
index 00000000..1c83a666
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/component.md
@@ -0,0 +1,53 @@
+### 使用方法
+```javascript
+
+import VueComponent from '/packages/common/component.js'
+
+VueComponent({
+ props: {},
+ beforeCreate(){},
+ created(){},
+ mounted(){},
+ destroyed(){}
+})
+```
+
+### 映射关系
+
+>如果使用封装的`VueComponent`组件,以下小程序`原生属性/方法`必须替换为对应的`封装属性/方法`
+
+| 封装 | 原生 |
+|--------------|----------- |
+| props | properties |
+| beforeCreate | created |
+| created | attached |
+| mounted | ready |
+| destroyed | detached |
+
+### 全局样式类
+
+* 使用VueComponent组件时,会自动添加custom-class类,外部可以通过此类修改组件内部的样式。
+```html
+
+ 确定
+
+```
+```css
+.custom{
+ background-color: red;
+}
+```
+### 原生生命周期
+
+> 必须要弄清楚的声明周期,执行顺序按照降序排列。
+
+| hook | 描述 |
+|-------------------------|----------- |
+| properties | 类型vue的props。 |
+| data | 类型vue的data。 |
+| created | 在组件实例刚刚被创建时执行,此时可以拿到data,但是拿不到props的最新值,只能拿到默认值,不能调用setData,可以操作设置this。 |
+| properties:observer | 如果实例初始化时给properties传值,会触发observer,先于attached执行 |
+| attached | 在组件实例进入页面节点树时执行,可以调用setData。 |
+| relations | DOM build,父组件建立连接,双方可以在此hook互相操作对方。 |
+| ready | DOM painted。 |
+
diff --git a/src/uni_modules/wot-design-uni/components/common/dayjs.min.js b/src/uni_modules/wot-design-uni/components/common/dayjs.min.js
new file mode 100644
index 00000000..11b8f805
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/dayjs.min.js
@@ -0,0 +1,2 @@
+/* eslint-disable */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.dayjs=e()}(this,function(){"use strict";const t=60,e=60*t,s=24*e,r=7*s,n=(t,e,s)=>!t||t.length>=e?t:`${Array(e+1-t.length).join(s)}${t}`;class i{constructor(t){this.utc=!1;const e=this.parseConfig(t);this.date=new Date(e),this.timeZone=this.date.getTimezoneOffset()/60,this.timeZoneString=n(String(-1*this.timeZone).replace(/^(.)?(\d)/,"$10$200"),5,"+"),this.mYear=this.date.getFullYear(),this.mMonth=this.date.getMonth(),this.mDay=this.date.getDate(),this.mWeek=this.date.getDay(),this.mHour=this.date.getHours(),this.mMinute=this.date.getMinutes(),this.mSecond=this.date.getSeconds()}parseConfig(t){if(!t)return new Date;if(t instanceof Date)return t;if(/^(\d){8}$/.test(t)){return this.utc=!0,`${t.substr(0,4)}-${t.substr(4,2)}-${t.substr(6,2)}`}return t}year(){return this.mYear}month(){return this.mMonth}unix(){const t=this.utc?60*this.timeZone*60*1e3:0;return Math.floor((this.date.getTime()+t)/1e3)}toString(){return this.date.toUTCString()}startOf(t){switch(t){case"year":return new i(new Date(this.year(),0,1));case"month":return new i(new Date(this.year(),this.month(),1));default:return this}}add(n,a){let h;switch(a){case"m":case"minutes":h=t;break;case"h":case"hours":h=e;break;case"d":case"days":h=s;break;case"w":case"weeks":h=r;break;default:h=1}const u=this.unix()+n*h;return new i(1e3*u)}subtract(t,e){return this.add(-1*t,e)}format(t="YYYY-MM-DDTHH:mm:ssZ"){const e=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];return t.replace(/Y{2,4}|M{1,2}|D{1,2}|d{1,4}|H{1,2}|m{1,2}|s{1,2}|Z{1,2}/g,t=>{switch(t){case"YY":return String(this.mYear).slice(-2);case"YYYY":return String(this.mYear);case"M":return String(this.mMonth+1);case"MM":return n(String(this.mMonth+1),2,"0");case"D":return String(this.mDay);case"DD":return n(String(this.mDay),2,"0");case"d":return String(this.mWeek);case"dddd":return e[this.mWeek];case"H":return String(this.mHour);case"HH":return n(String(this.mHour),2,"0");case"m":return String(this.mMinute);case"mm":return n(String(this.mMinute),2,"0");case"s":return String(this.mSecond);case"ss":return n(String(this.mSecond),2,"0");case"Z":return`${this.timeZoneString.slice(0,-2)}:00`;case"ZZ":return this.timeZoneString;default:return t}})}}return t=>new i(t)});
diff --git a/src/uni_modules/wot-design-uni/components/common/lodash/debounce.js b/src/uni_modules/wot-design-uni/components/common/lodash/debounce.js
new file mode 100644
index 00000000..d2e60f88
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/lodash/debounce.js
@@ -0,0 +1,206 @@
+import isObject from './isObject'
+import root from './internal/root'
+
+/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked, or until the next browser frame is drawn. The debounced function
+ * comes with a `cancel` method to cancel delayed `func` invocations and a
+ * `flush` method to immediately invoke them. Provide `options` to indicate
+ * whether `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. The `func` is invoked with the last arguments provided to the
+ * debounced function. Subsequent calls to the debounced function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
+ * invocation will be deferred until the next frame is drawn (typically about
+ * 16ms).
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `debounce` and `throttle`.
+ *
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0]
+ * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
+ * used (if available).
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', debounce(calculateLayout, 150))
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }))
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
+ * const source = new EventSource('/stream')
+ * jQuery(source).on('message', debounced)
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel)
+ *
+ * // Check for pending invocations.
+ * const status = debounced.pending() ? "Pending..." : "Ready"
+ */
+function debounce(func, wait, options) {
+ let lastArgs, lastThis, maxWait, result, timerId, lastCallTime
+
+ let lastInvokeTime = 0
+ let leading = false
+ let maxing = false
+ let trailing = true
+
+ // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
+ const useRAF = !wait && wait !== 0 && typeof root.requestAnimationFrame === 'function'
+
+ if (typeof func !== 'function') {
+ throw new TypeError('Expected a function')
+ }
+ wait = +wait || 0
+ if (isObject(options)) {
+ leading = !!options.leading
+ maxing = 'maxWait' in options
+ maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait
+ trailing = 'trailing' in options ? !!options.trailing : trailing
+ }
+
+ function invokeFunc(time) {
+ const args = lastArgs
+ const thisArg = lastThis
+
+ lastArgs = lastThis = undefined
+ lastInvokeTime = time
+ result = func.apply(thisArg, args)
+ return result
+ }
+
+ function startTimer(pendingFunc, wait) {
+ if (useRAF) {
+ root.cancelAnimationFrame(timerId)
+ return root.requestAnimationFrame(pendingFunc)
+ }
+ return setTimeout(pendingFunc, wait)
+ }
+
+ function cancelTimer(id) {
+ if (useRAF) {
+ return root.cancelAnimationFrame(id)
+ }
+ clearTimeout(id)
+ }
+
+ function leadingEdge(time) {
+ // Reset any `maxWait` timer.
+ lastInvokeTime = time
+ // Start the timer for the trailing edge.
+ timerId = startTimer(timerExpired, wait)
+ // Invoke the leading edge.
+ return leading ? invokeFunc(time) : result
+ }
+
+ function remainingWait(time) {
+ const timeSinceLastCall = time - lastCallTime
+ const timeSinceLastInvoke = time - lastInvokeTime
+ const timeWaiting = wait - timeSinceLastCall
+
+ return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting
+ }
+
+ function shouldInvoke(time) {
+ const timeSinceLastCall = time - lastCallTime
+ const timeSinceLastInvoke = time - lastInvokeTime
+
+ // Either this is the first call, activity has stopped and we're at the
+ // trailing edge, the system time has gone backwards and we're treating
+ // it as the trailing edge, or we've hit the `maxWait` limit.
+ return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait)
+ }
+
+ function timerExpired() {
+ const time = Date.now()
+ if (shouldInvoke(time)) {
+ return trailingEdge(time)
+ }
+ // Restart the timer.
+ timerId = startTimer(timerExpired, remainingWait(time))
+ }
+
+ function trailingEdge(time) {
+ timerId = undefined
+
+ // Only invoke if we have `lastArgs` which means `func` has been
+ // debounced at least once.
+ if (trailing && lastArgs) {
+ return invokeFunc(time)
+ }
+ lastArgs = lastThis = undefined
+ return result
+ }
+
+ function cancel() {
+ if (timerId !== undefined) {
+ cancelTimer(timerId)
+ }
+ lastInvokeTime = 0
+ lastArgs = lastCallTime = lastThis = timerId = undefined
+ }
+
+ function flush() {
+ return timerId === undefined ? result : trailingEdge(Date.now())
+ }
+
+ function pending() {
+ return timerId !== undefined
+ }
+
+ function debounced(...args) {
+ const time = Date.now()
+ const isInvoking = shouldInvoke(time)
+
+ lastArgs = args
+ lastThis = this
+ lastCallTime = time
+
+ if (isInvoking) {
+ if (timerId === undefined) {
+ return leadingEdge(lastCallTime)
+ }
+ if (maxing) {
+ // Handle invocations in a tight loop.
+ timerId = startTimer(timerExpired, wait)
+ return invokeFunc(lastCallTime)
+ }
+ }
+ if (timerId === undefined) {
+ timerId = startTimer(timerExpired, wait)
+ }
+ return result
+ }
+
+ debounced.cancel = cancel
+ debounced.flush = flush
+ debounced.pending = pending
+ return debounced
+}
+
+export default debounce
diff --git a/src/uni_modules/wot-design-uni/components/common/lodash/internal/freeGlobal.js b/src/uni_modules/wot-design-uni/components/common/lodash/internal/freeGlobal.js
new file mode 100644
index 00000000..59519fe3
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/lodash/internal/freeGlobal.js
@@ -0,0 +1,4 @@
+/** Detect free variable `global` from Node.js. */
+const freeGlobal = typeof global === 'object' && global !== null && global.Object === Object && global
+
+export default freeGlobal
diff --git a/src/uni_modules/wot-design-uni/components/common/lodash/internal/root.js b/src/uni_modules/wot-design-uni/components/common/lodash/internal/root.js
new file mode 100644
index 00000000..4bbbf466
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/lodash/internal/root.js
@@ -0,0 +1,14 @@
+import freeGlobal from './freeGlobal.js'
+
+/** Detect free variable `globalThis` */
+// eslint-disable-next-line eqeqeq
+const freeGlobalThis = typeof globalThis === 'object' && globalThis !== null && globalThis.Object == Object && globalThis
+
+/** Detect free variable `self`. */
+const freeSelf = typeof self === 'object' && self !== null && self.Object === Object && self
+
+/** Used as a reference to the global object. */
+// eslint-disable-next-line no-new-func
+const root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')()
+
+export default root
diff --git a/src/uni_modules/wot-design-uni/components/common/lodash/isObject.js b/src/uni_modules/wot-design-uni/components/common/lodash/isObject.js
new file mode 100644
index 00000000..e9e81bff
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/lodash/isObject.js
@@ -0,0 +1,29 @@
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * isObject({})
+ * // => true
+ *
+ * isObject([1, 2, 3])
+ * // => true
+ *
+ * isObject(Function)
+ * // => true
+ *
+ * isObject(null)
+ * // => false
+ */
+function isObject(value) {
+ const type = typeof value
+ return value != null && (type === 'object' || type === 'function')
+}
+
+export default isObject
diff --git a/src/uni_modules/wot-design-uni/components/common/util.js b/src/uni_modules/wot-design-uni/components/common/util.js
new file mode 100644
index 00000000..f5f0e625
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/common/util.js
@@ -0,0 +1,180 @@
+import debounce from './lodash/debounce'
+
+/**
+ * @description 对num自动填充px
+ * @param {Number} num
+ * @return {string} num+px
+ */
+export function addUnit(num) {
+ return Number.isNaN(Number(num)) ? num : `${num}px`
+}
+
+/**
+ * @description 获取当前页面栈顶(当前显示的页面)
+ * @return {wx.Page}
+ */
+export function getContext() {
+ const pages = getCurrentPages()
+ return pages[pages.length - 1]
+}
+
+/**
+ * @description 判断target是否对象
+ * @param obj
+ * @return {boolean}
+ */
+export function isObj(obj) {
+ // Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1].toLowerCase() === 'object'
+ return typeof obj === 'object'
+}
+
+/**
+ * @description 获取目标原始类型
+ * @param target 任意类型
+ * @returns {string} type 数据类型
+ */
+export function getType(target) {
+ // 得到原生类型
+ const typeStr = Object.prototype.toString.call(target)
+ // 拿到类型值
+ const type = typeStr.match(/\[object (\w+)\]/)[1]
+ // 类型值转小写并返回
+ return type.toLowerCase()
+}
+
+/**
+ * @description 默认的外部格式化函数 - picker组件
+ * @param items
+ * @param labelKey
+ * @return {*}
+ */
+export const defaultDisplayFormat = function (items, { labelKey = 'value' }) {
+ // 在props中,this被指向了全局data
+ if (items instanceof Array) {
+ return items.map((item) => item[labelKey]).toString()
+ } else {
+ return items[labelKey]
+ }
+}
+/**
+ * @description 默认函数占位符 - pickerView组件
+ * @param value
+ * @return value
+ */
+export const defaultFunction = (value) => value
+/**
+ * @description 是否不为空
+ * @param value
+ * @return {Boolean}
+ */
+export const isDef = (value) => value !== undefined && value !== null
+
+export { debounce }
+
+/**
+ * @description 防止数字小于零
+ * @param {Number} num
+ * @param {String} label 标签
+ */
+export const checkNumRange = (num, label = 'value') => {
+ if (num < 0) {
+ throw Error(`${label} shouldn't be less than zero`)
+ }
+}
+/**
+ * @description 防止pixel无意义
+ * @param {Number} num
+ * @param {String} label 标签
+ */
+export const checkPixelRange = (num, label = 'value') => {
+ if (num <= 0) {
+ throw Error(`${label} should be greater than zero`)
+ }
+}
+
+/**
+ * @default 渲染视图
+ * @param {this} node 节点
+ * @param {Object} data 需要渲染的数据
+ * @param {Number} delay 延迟多久
+ */
+export const renderData = (node, data, delay = 0) => {
+ const diff = Object.keys(data).reduce((prev, key) => {
+ if (data[key] !== node.data[key]) {
+ prev[key] = data[key]
+ }
+ return prev
+ }, {})
+ if (Object.keys(diff).length === 0) return
+ const render = () => node.setData(diff)
+ delay ? setTimeout(render, delay) : render()
+}
+
+function rgbToHex(r, g, b) {
+ const hex = ((r << 16) | (g << 8) | b).toString(16)
+ return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex
+}
+
+function hexToRgb(hex) {
+ const rgb = []
+ for (let i = 1; i < 7; i += 2) {
+ rgb.push(parseInt('0x' + hex.slice(i, i + 2)))
+ }
+ return rgb
+}
+
+/**
+ * @default 计算渐变色的中间变量
+ * @param {String} startColor 开始颜色
+ * @param {String} endColor 结束颜色
+ * @param {Number} step 获取渲染位置,默认为中间位置
+ * @return {String} 渐变色中间颜色变量
+ */
+export const gradient = (startColor, endColor, step = 2) => {
+ // 将hex转换为rgb
+ const sColor = hexToRgb(startColor)
+ const eColor = hexToRgb(endColor)
+
+ // 计算R\G\B每一步的差值
+ const rStep = (eColor[0] - sColor[0]) / step
+ const gStep = (eColor[1] - sColor[1]) / step
+ const bStep = (eColor[2] - sColor[2]) / step
+
+ const gradientColorArr = []
+ for (let i = 0; i < step; i++) {
+ // 计算每一步的hex值
+ gradientColorArr.push(rgbToHex(parseInt(rStep * i + sColor[0]), parseInt(gStep * i + sColor[1]), parseInt(bStep * i + sColor[2])))
+ }
+ return gradientColorArr
+}
+
+/** @description 保证num不超出min和max的范围 */
+export const range = (num, min, max) => Math.min(Math.max(num, min), max)
+
+/** @description 比较数值是否相等 */
+export const isEqual = (value1, value2) => {
+ if (value1 === value2) return true
+ if (!(value1 instanceof Array)) return false
+ if (!(value2 instanceof Array)) return false
+ if (value1.length !== value2.length) return false
+ for (let i = 0; i !== value1.length; ++i) {
+ if (value1[i] !== value2[i]) return false
+ }
+ return true
+}
+
+/** @description 不满10补0 */
+export const padZero = (number, length = 2) => {
+ number = number + ''
+
+ while (number.length < length) {
+ number = '0' + number
+ }
+
+ return number
+}
+
+/** @description 全局变量id */
+export const context = {
+ id: 1000
+}
diff --git a/src/uni_modules/wot-design-uni/components/mixins/basic.js b/src/uni_modules/wot-design-uni/components/mixins/basic.js
new file mode 100644
index 00000000..b2b28da8
--- /dev/null
+++ b/src/uni_modules/wot-design-uni/components/mixins/basic.js
@@ -0,0 +1,43 @@
+export default {
+ methods: {
+ $emit(...args) {
+ this.triggerEvent(...args)
+ },
+ /**
+ * @description 获取节点的样式
+ * @param {String} selector -选择器
+ * @param {Boolean} all -selectAll
+ * @return {Promise